[CMake] adding same subdirectory multiple times.

Mika.Rajala at patria.fi Mika.Rajala at patria.fi
Thu Mar 11 04:28:04 EST 2010



cmake-bounces at cmake.org wrote on 11.03.2010 10:56:42:

>
> On 11. Mar, 2010, at 9:41 , Mika.Rajala at patria.fi wrote:
>
> >
> >
> > cmake-bounces at cmake.org wrote on 11.03.2010 10:37:47:
> >
> >>
> >> On 11. Mar, 2010, at 9:27 , Mika.Rajala at patria.fi wrote:
> >>
> >>>
> >>>
> >>> cmake-bounces at cmake.org wrote on 11.03.2010 10:04:42:
> >>>
> >>>> On 11.03.10 09:56:35, Mika.Rajala at patria.fi wrote:
> >>>>>
> >>>>> Hi
> >>>>>
> >>>>> The problem:
> >>>>>
> >>>>>> From a shared CMakeLists.txt i get the following error when
defining
> > a
> >>>>> library target.
> >>>>> Policy CMP0002 is not set: Logival target names must be globally
> >>> unique.
> >>>>>
> >>>>>
> >>>>> The situation:
> >>>>>
> >>>>> Let's assume i have the following cmake files in the following
> > folders
> >>> with
> >>>>> the svn:externals properties.
> >>>>>
> >>>>> C:\project\CMakeLists.txt
> >>>>> add_subdirectory(ProjectA)
> >>>>> add_subdirectory(ProjectB)
> >>>>>
> >>>>> C:\project\ProjectA   (svn:externals LibraryA <svn_path_to_libA>)
> >>>>> add_subdirectory(LibraryA)
> >>>>>
> >>>>> c:\project\ProjectB    (svn:externals LibraryA <svn_path_to_libA>)
> >>>>> add_subdirectory(LibraryA)
> >>>>>
> >>>>> c:\project\LibraryA
> >>>>> add_library(LibraryA)
> >>>>>
> >>>>> Thoughts:
> >>>>>
> >>>>> I don't know if this causes any problem, I tried reading some
> >>>>> documentations but I couldn't figure it out.
> >>>>
> >>>> Yes it does. The library target is defined multiple times, thats not
> >>>> possible. Each version of "LibraryA/CMakeLists.txt" has to use its
own
> >>>> name for LibraryA if you want that directory layout to work. Target
> >>>> names must be globally unique as the error message says.
> >>>>
> >>>> From a quick glance I see two options:
> >>>> - drop the externals and let the projects depend on a "LibraryA"
> > target
> >>>> being defined (you need to use the add_subdirectory call for it to
> > the
> >>>> fron then
> >>>> - find a way to test in LibraryA/CMakeLists.txt wether its under
> >>>> ProjectA, ProjectB or project and adjust the target name then.
> >>>>
> >>>> Andreas
> >>>>
> >>>> --
> >>>> Questionable day.
> >>>>
> >>>> Ask somebody something.
> >>>> _______________________________________________
> >>>> Powered by www.kitware.com
> >>>>
> >>>> Visit other Kitware open-source projects at http://www.kitware.
> >>>> com/opensource/opensource.html
> >>>>
> >>>> Please keep messages on-topic and check the CMake FAQ at:
http://www.
> >>>> cmake.org/Wiki/CMake_FAQ
> >>>>
> >>>> Follow this link to subscribe/unsubscribe:
> >>>> http://www.cmake.org/mailman/listinfo/cmake
> >>>
> >>> Thanks.
> >>>
> >>> I'd still like to know if there is a way to handle this like
including
> > c++
> >>> header files
> >>>
> >>> Something like
> >>>
> >>> if(LibraryA)
> >>>     message(Already included, doing nothing)
> >>> else()
> >>>     <Normal CMakeLists content>
> >>> endif()
> >>>
> >>> -mika
> >>
> >> if(TARGET LibraryA)
> >>  message("Already included, doing nothing")
> >>  return()
> >> endif()
> >> ...
> >>
> >>
> >> You could also use directory properties to set "include-guards".
> >>
> >> HTH
> >>
> >> Michael
> >>
> >>
> >> _______________________________________________
> >> Powered by www.kitware.com
> >>
> >> Visit other Kitware open-source projects at http://www.kitware.
> >> com/opensource/opensource.html
> >>
> >> Please keep messages on-topic and check the CMake FAQ at: http://www.
> >> cmake.org/Wiki/CMake_FAQ
> >>
> >> Follow this link to subscribe/unsubscribe:
> >> http://www.cmake.org/mailman/listinfo/cmake
> >
> > I tried the variable thing, i worked, kinda..
> >
> > But how do i reset the variable if the CMakeLists.txt has changed.
> >
> > Now it's a little too persistent, since changes are not handled.
>
> Hu? What do you mean by "variable"? The
>
> if(TARGET LibraryA)
>
> code checks whether there exists a target called LibraryA (either through
> ADD_LIBRARY, ADD_EXECUTABLE or ADD_CUSTOM_TARGET). No variable involved,
> just the target name. I was thinking like this:
>
> if(NOT TARGET LibraryA)
>   add_subdirectory(LibraryA)
> endif()
>
> Michael
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.
> com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at: http://www.
> cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake

Thanks, this was exactly what i was looking for.

I tried if(NOT LibraryA) but i didn't work... i should have read the
documentation more carefully..

After that i moved onto making a "variable" set(LibAHandled "TRUE" CACHE
INTERNAL "") but the problem with that
was that it was a bit too persistant.

Works perfectly now, thanks for the replies.

-mika



More information about the CMake mailing list