这似乎是一个琐碎的问题,因为CMake是一种脚本语言,通常的答案是:严格顺序执行。但是我遇到了几种情况,在什么情况下CMake解析特定文件的时间或顺序很重要。所以我想知道:
是否有可用的文档描述文件(包括内部CMake文件)的解析顺序?
文件顺序取决于CMake版本还是某些CMake选项/设置/环境(包括)。选择的生成器或主机环境?
到目前为止,我所遇到的案例很重要,上述信息很重要:
工具链文件是在识别编译器之前进行分析的,因此您必须先在工具链文件中/在工具链文件中填充某些CMake变量:使用特定链接器的CMake交叉编译不会将参数传递给armlink
工具链文件被多次分析,因此,例如,来自工具链文件的打印消息显示多次:CMake工具链包括多个文件
可以从CMakeLists.txt已解析主文件之外的作用域调用变量watch :在CMake中执行命令或宏,这是“配置”步骤完成之前的最后一步
也许您知道更多。
为了找到答案,我尝试了以下操作:我已经设置了一个简单的主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
…
# Writes
${CMAKE_BINARY_DIR}/CMakeCache.txt
因此,到目前为止,看到以上输出,我得出了以下结论(我希望这是正确的,并且有些通用):
CMakeCache.txt文件仅在启动配置时读取一次,并在生成完成后写入。它只是保留“全局变量”缓存的状态。
该project()命令触发CMake的大多数检测魔术(包括从Toolchain.txt文件读取)。
工具链文件被读取两次。一次在检测到make / compile系统之前,一次在内部之后生成CMakeSystem.cmake。
所述variable_watch()钩可以随时触发,所以在其中最优“命令来执行”被称为范围是未定义的。