这似乎是一个琐碎的问题,因为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 readCMakeCache.txt${CMAKE_BINARY_DIR}/CMakeCache.txtPreLoad.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()钩可以随时触发,所以在其中最优“命令来执行”被称为范围是未定义的。
添加回答
举报
0/150
提交
取消