這似乎是一個瑣碎的問題,因為CMake是一種腳本語言,通常的答案是:嚴格順序執(zhí)行。但是我遇到了幾種情況,在什么情況下CMake解析特定文件的時間或順序很重要。所以我想知道:是否有可用的文檔描述文件(包括內(nèi)部CMake文件)的解析順序?文件順序取決于CMake版本還是某些CMake選項/設(shè)置/環(huán)境(包括)。選擇的生成器或主機環(huán)境?到目前為止,我所遇到的案例很重要,上述信息很重要:工具鏈文件是在識別編譯器之前進行分析的,因此您必須先在工具鏈文件中/在工具鏈文件中填充某些CMake變量:使用特定鏈接器的CMake交叉編譯不會將參數(shù)傳遞給armlink工具鏈文件被多次分析,因此,例如,來自工具鏈文件的打印消息顯示多次:CMake工具鏈包括多個文件可以從CMakeLists.txt已解析主文件之外的作用域調(diào)用變量watch :在CMake中執(zhí)行命令或宏,這是“配置”步驟完成之前的最后一步也許您知道更多。為了找到答案,我嘗試了以下操作:我已經(jīng)設(shè)置了一個簡單的主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我得到了很長的蹤跡,試圖對其進行總結(jié):# 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因此,到目前為止,看到以上輸出,我得出了以下結(jié)論(我希望這是正確的,并且有些通用):CMakeCache.txt文件僅在啟動配置時讀取一次,并在生成完成后寫入。它只是保留“全局變量”緩存的狀態(tài)。該project()命令觸發(fā)CMake的大多數(shù)檢測魔術(shù)(包括從Toolchain.txt文件讀取)。工具鏈文件被讀取兩次。一次在檢測到make / compile系統(tǒng)之前,一次在內(nèi)部之后生成CMakeSystem.cmake。所述variable_watch()鉤可以隨時觸發(fā),所以在其中最優(yōu)“命令來執(zhí)行”被稱為范圍是未定義的。
CMake:文件的解析順序(緩存,工具鏈等)?
SMILET
2019-09-21 15:47:27