【发布时间】:2015-08-10 18:55:26
【问题描述】:
这似乎是一个微不足道的问题,因为 CMake 是一种脚本语言,所以一般的答案是:严格顺序。但是我遇到了几个案例,其中 CMake 解析某些文件的时间或顺序很重要。所以我想知道:
- 是否有可用的文档来描述其中的顺序 文件(包括内部 CMake 文件)被解析?
- 文件顺序是否取决于 CMake 版本或某些 CMake 选项/设置/环境,包括。选择的生成器或主机 环境?
到目前为止我遇到的案例,其中上述信息很重要:
- 在识别编译器之前解析工具链文件,因此您必须首先在缓存中/在工具链文件中填充某些 CMake 变量:CMake cross-compile with specific linker doesn't pass arguments to armlink
- 工具链文件被多次解析,因此例如打印工具链文件中的消息多次显示:CMake toolchain includes multiple files
- 可以从主
CMakeLists.txt文件已解析的范围之外的范围调用变量监视:Execute command or macro in CMake as the last step before the 'configure' step finishes
也许你知道得更多。
为了找到答案,我尝试了以下方法:我设置了一个简单的主 CMakeLists.txt,如下所示并运行 cmake --trace … 来分析解析顺序。
cmake_minimum_required(VERSION 2.8)
include(BeforeProjectCmd.cmake)
project(ParserTest CXX)
add_subdirectory(LibTarget1)
add_subdirectory(LibTarget2)
add_executable(ExeTarget Test.cpp)
variable_watch(CMAKE_BACKWARDS_COMPATIBILITY)
当我然后运行时,例如cmake --debug-output --trace -G"Visual Studio 12 2013" -DCMAKE_TOOLCHAIN_FILE:FILE_PATH=Toolchain.txt我有一个很长的痕迹,我试图总结:
# Begin try to read
CMakeCache.txt
${CMAKE_BINARY_DIR}/CMakeCache.txt
PreLoad.cmake
${CMAKE_BINARY_DIR}/PreLoad.cmake
# End try to read
┌ CMakeLists.txt(1): cmake_minimum_required(VERSION 2.8 )
│ CMakeLists.txt(3): include(BeforeProjectCmd.cmake )
│
├─ BeforeProjectCmd.cmake
│
│ CMakeLists.txt(5): project(ParserTest CXX )
├┬ share/cmake-3.2/Modules/CMakeDetermineSystem.cmake
││
│└─ Toolchain.txt
│
├┬ ${CMAKE_PLATFORM_INFO_DIR}/CMakeSystem.cmake
││
│└─ Toolchain.txt
│
├─ share/cmake-3.2/Modules/CMakeSystemSpecificInitialize.cmake
├┬ share/cmake-3.2/Modules/CMakeDetermineCXXCompiler.cmake
│├┬ share/cmake-3.2/Modules/CMakeDetermineCompiler.cmake
││├ share/cmake-3.2/Modules/Platform/Windows-CXX.cmake
…
││├ share/cmake-3.2/Modules/CMakeDetermineCompilerId.cmake
││├─ share/cmake-3.2/Modules/CMakeCompilerIdDetection.cmake
…
││├ share/cmake-3.2/Modules/Compiler/MSVC-DetermineCompiler.cmake
…
│├ ${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/3.2.2/CMakeCXXCompiler.cmake
│├ share/cmake-3.2/Modules/CMakeSystemSpecificInformation.cmake
│├┬ share/cmake-3.2/Modules/CMakeGenericSystem.cmake
││├ share/cmake-3.2/Modules/Platform/Windows.cmake
││└─ share/cmake-3.2/Modules/Platform/WindowsPaths.cmake
│├ share/cmake-3.2/Modules/CMakeCXXInformation.cmake
│├┬ share/cmake-3.2/Modules/Compiler/MSVC-CXX.cmake
││├ share/cmake-3.2/Modules/Platform/Windows-MSVC-CXX.cmake
││├┬ share/cmake-3.2/Modules/Platform/Windows-MSVC.cmake
│││└─ share/cmake-3.2/Modules/CMakeRCInformation.cmake
││└ share/cmake-3.2/Modules/CMakeCommonLanguageInclude.cmake
│├ share/cmake-3.2/Modules/CMakeTestCXXCompiler.cmake
│├┬ share/cmake-3.2/Modules/CMakeTestCompilerCommon.cmake
││├ share/cmake-3.2/Modules/CMakeDetermineCompilerABI.cmake
││├ share/cmake-3.2/Modules/CMakeDetermineCompileFeatures.cmake
││├ share/cmake-3.2/Modules/Internal/FeatureTesting.cmake
││└ share/cmake-3.2/Modules/Compiler/MSVC-CXX-FeatureTests.cmake
│└ ${CMAKE_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/3.2.2/CMakeCXXCompiler.cmake
│
│ CMakeLists.txt(7): add_subdirectory(LibTarget1 )
│
├─ LibTarget1/CMakeLists.txt
│
│ CMakeLists.txt(8): add_subdirectory(LibTarget2 )
│
├─ LibTarget2/CMakeLists.txt
│
│ CMakeLists.txt(10): add_executable(ExeTarget Test.cpp )
│ CMakeLists.txt(12): variable_watch(CMAKE_BACKWARDS_COMPATIBILITY )
│
│ CMake Debug Log in CMakeLists.txt:
│ Variable "CMAKE_BACKWARDS_COMPATIBILITY" was accessed using UNKNOWN_READ_ACCESS with value "".
-- Configuring done
-- Generating ${CMAKE_BINARY_DIR}
-- Generating ${CMAKE_BINARY_DIR}/LibTarget1
-- Generating ${CMAKE_BINARY_DIR}/LibTarget2
-- Generating done
# Writes
${CMAKE_BINARY_DIR}/CMakeCache.txt
所以看到上面的输出,到目前为止,我得出了以下结论(我希望这是真实的并且有点笼统):
- CMakeCache.txt文件只在配置启动时读取一次,在生成完成后写入。它只是保持“全局变量”缓存的状态。
-
project()命令触发了 CMake 的大部分检测魔法(包括从Toolchain.txt文件中读取)。 - 工具链文件被读取两次。在检测到 make/compile 系统之前一次,然后在生成的
CMakeSystem.cmake内部一次。 -
variable_watch()挂钩可以随时触发,因此未定义最佳“执行命令”的调用范围。
【问题讨论】:
-
也许您应该与一些 CMake 核心开发人员分享您的问题。使用 CMake3.0,他们开始大量改进他们的文档,所以这对他们来说可能很有趣。 cmake-developers 邮件列表非常活跃
-
我认为this 可能会对您有所帮助。
-
@Florian:是的,这个问题非常好。有一个完整的答案会很棒。因此,如果您认为自己已经了解了足够的信息,请随时准备好发布答案。
-
@thiagowfx 好的。我已经添加了到目前为止我遇到的内容。
标签: cmake