[CMake] Confusion with include() relativity

Andreas Pakulat apaku at gmx.de
Fri Sep 6 02:46:47 EDT 2013


Hi,

On Fri, Sep 6, 2013 at 12:26 AM, Robert Dailey <rcdailey.lists at gmail.com>wrote:

> I have an interesting structure for my code & build scripts:
>
> root/
>   source/
>     CMakeLists.txt
>     build/
>       CMakeLists.txt
>   cmake/
>     common.cmake
>
> My root CMakeLists.txt is actually in 'root/source/build", and my
> common scripts are in "root/cmake".
>
> From my root CMakeLists.txt file, I do this:
>
> get_filename_component( BUILD_PRODUCT_ROOT ${CMAKE_SOURCE_DIR}/../..
> ABSOLUTE )
> set( CMAKE_MODULE_PATH
>     "${BUILD_PRODUCT_ROOT}/cmake"
>     "${BUILD_PRODUCT_ROOT}/cmake/find"
> )
>
> add_subdirectory( ${BUILD_PRODUCT_ROOT}/source source )
>
> Note that the script "root/source/CMakeLists.txt" is where I begin
> defining targets, and it never steps into "build" (to avoid infinite
> recursion).
>
> Later on (still in the root script) I do:
>
> include( common )
>
> This includes "root/cmake/common.cmake" as expected, but inside
> common.cmake when I try to include a file (not a module) relative to
> common.cmake, it says it can't find it. Example:
>
> include( foo/bar/stuff.cmake )
>
> The absolute path for this would be:
>
> root/cmake/foo/bar/stuff.cmake
>
> Naturally I assume that when including a FILE (not a module!) that it
> is relative to the CMAKE_CURRENT_LIST_DIR, which in this case
> correctly displays as "root/cmake".
>
> Can anyone explain why I can't include files from common.cmake? Thanks
> in advance.
>

Your expectation is wrong here, IMO. The include() command works very much
like the preprocessor's #include in C/C++, it takes the content of the file
and puts it verbatim into the place where the include() occurs. In
particular once the data has been read the command forgets where it came
from and this is before the code gets executed. So the 'context'
CMakeLists.txt file is still the one in root/build/.

Andreas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20130906/dbb9acd5/attachment.htm>


More information about the CMake mailing list