CMake:文件的解析顺序(缓存,工具链等)?

这似乎是一个琐碎的问题,因为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()钩可以随时触发,所以在其中最优“命令来执行”被称为范围是未定义的。


SMILET
浏览 2270回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP