[CMake] Confusion with include() relativity

Robert Dailey rcdailey.lists at gmail.com
Fri Sep 6 10:55:38 EDT 2013


If this is indeed the case I think the behavior should be modified to
respect CMAKE_CURRENT_LIST_DIR. Because, the parent include() command
hasn't completed until the nested include() commands have completed,
and I think it's a huge limitation that nested include() commands are
still referencing the location of the file that initiated the first
include() command. This affects portability of common CMake scripts,
because the root location may not be in the same place at all times.

On Fri, Sep 6, 2013 at 1:46 AM, Andreas Pakulat <apaku at gmx.de> wrote:
> 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
>


More information about the CMake mailing list