[CMake] how to inherit includes from other directories

David Cole david.cole at kitware.com
Tue Sep 6 16:50:28 EDT 2011


CMake does not track dependencies of header-only "libraries". It only
tracks actual library dependencies given by target_link_libraries
commands.

You will have to come up with your own way to manage your projects
interconnections.

CMake provides the include_directories command so that you can say
where your header files are. If Z depends on A and B's header files
then Z is going to have to have include_directories commands for A and
B's include directories.

Sorry there's no magic bullet here.


Let us know if you have any further questions,
David


On Tue, Sep 6, 2011 at 4:39 PM, Victor Yankee
<victor.whiskey.yankee at gmail.com> wrote:
> Raymond,
>
> I appreciate your detailed reply.
>
> But apparently include_directories do not propagate UP, only down into
> subdirectories.
> The project has many such subdirectories each with its own headers. I think
> my example
> was therefore misleading and too simple :(
>
> There may 3 or 4 levels. At the top level, I would very much like to avoid
> needing to know all the dependencies at all the lower levels and
> exhaustively listing each one in an  'include_directories()' command.
>
> If utils/B.h needs utils/A.h which needs foo/Z.h, then in my top-level
> directory (that only needs to know about B.h)  what does its CMakeLists.txt
> look like? I would like to just be add_includes(utils/B) and have cmake
> figure out it also needs utils/A and foo.
>
> I have somewhat succeeded by using a global variable called "my_includes"
> and using PARENT_SCOPE in all the low-level cmakelist files. But then I
> basically end up including all of the subdirectories all of the time.
>
>
> -Victor
>
>
>
>
> On Sun, Sep 4, 2011 at 8:15 AM, Raymond Wan <r.wan at aist.go.jp> wrote:
>>
>> Hi Victor,
>>
>>
>> On Sat, Sep 3, 2011 at 02:27, Victor Yankee
>> <victor.whiskey.yankee at gmail.com> wrote:
>> > build/
>> > src/
>> >       utils
>> >               a
>> >                      A.h
>> >                      unittest_a.cpp
>> >
>> >               b
>> >                      B.h   // needs a.h
>> >
>> >                      unittest_b.cpp
>> >
>> >       common
>> >               c
>> >                     C.h      // needs A.h and B.h
>> >                     testit.cpp   // needs C.h, B.h and A.h
>> >
>> >
>> > The directory src/utils/a has a header file A.h. Likewise src/utils/b
>> > has a
>> >
>> > header file B.h that #includes a.h.
>> > Finally, c has a header file C.h that #includes a.h and b.h.
>> >
>> >
>> > This is just a short example of my large project. In reality there are
>> > other
>> > directories and levels of subdirectories.
>> >
>> >
>> > What can I do in the local CMakeLists.txt files so that the directories
>> > where the header files live are automatically made part of the others as
>> > needed,
>> > so I do not have to keep remembering all of them for every header-only
>> >
>> > library all the way down the dependency chain?
>>
>>
>>
>> I'm not much of a CMake expert, but it sounds like something I've done
>> and I think the INCLUDE_DIRECTORIES command is all you need:
>>
>>
>> http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:include_directories
>>
>> So in each of:
>>
>> src/utils/a
>> src/utils/b
>> src/common/c
>> src/
>>
>> you would have a CMakeLists.txt .  The first 3 performs the unit
>> testing.  And the top-level one in src/ is the one that builds your
>> executable.  In the CMakeLists.txt that refers to the header file in
>> another directory, you would put INCLUDE_DIRECTORIES.
>>
>> You would then tie up their dependencies using ADD_DEPENDENCIES so
>> that an executable is made once something else is made:
>>
>>
>> http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_dependencies
>>
>> I *think* that is all you need.  I've also used ADD_SUBDIRECTORY but
>> I'm not too sure if you need it too in your situation.
>>
>> Hope this helps!
>>
>> Ray
>
>
> _______________________________________________
> 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
>


More information about the CMake mailing list