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 <[email protected]> wrote: > Hi, > > On Fri, Sep 6, 2013 at 12:26 AM, Robert Dailey <[email protected]> > 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 > -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake
