[CMake] how to inherit includes from other directories

Raymond Wan r.wan at aist.go.jp
Sun Sep 4 09:15:20 EDT 2011


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


More information about the CMake mailing list