作爲構建過程的一部分,我們需要記錄機器和編譯器的細節。由於編譯器可以通過設置CMAKE_CXX_COMPILER從系統默認值進行更改,因此我認爲檢測編譯器的最安全方法是向cmake自己詢問它正在使用的內容。如何檢查cmake內部變量?
這是(的重要組成部分),我們使用了我們的項目的工具鏈文件:
SET(CMAKE_CXX_FLAGS "-std=c++11")
SET(CMAKE_BUILD_TYPE Release)
SET(CMAKE_OSX_ARCHITECTURES "x86_64")
SET(CMAKE_CXX_COMPILER /usr/bin/clang++)
SET(CMAKE_C_COMPILER /usr/bin/clang)
所以,現在我已經創建了一個文件的CMakeLists.txt,從我們使用我們的主要的一個獨立項目,看起來像這樣:
cmake_minimum_required(VERSION 2.8)
execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version
OUTPUT_VARIABLE cxx_version)
FILE(WRITE "/tmp/compiler.txt" "Compiler: ${CMAKE_CXX_COMPILER} is ${cxx_version}")
當我運行此的CMakeLists.txt cmake並把它傳遞工具鏈文件,我已經有了一個相當安全的方法來確定正在使用的主要項目,該項目的編譯器。也就是說,儘管一些懶散的開發人員可能會在主項目的命令行中添加一個「-DCMAKE_CXX_COMPILER」(然後/tmp/compiler.txt會出錯),但開發人員更可能會編輯工具鏈文件(然後/tmp/compiler.txt將包含正確的信息)。
問題是,我想也檢查是否已啓用C++ 11,但在我的CMakeLists.txt文件中,我無法檢查任何CMAKE變量的設置。如果我這樣做:
MESSAGE(STATUS "CMAKE_OSX_ARCHITECTURES are ${CMAKE_OSX_ARCHITECTURES}")
MESSAGE(STATUS "CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}")
MESSAGE(STATUS "CMAKE_CXX_FLAGS are ${CMAKE_CXX_FLAGS}")
消息說所有這些值都是空的。如果我將我自己的一些值添加到我的工具鏈文件中,並在我的CMakeLists.txt中輸出它們的值,那麼它們是正確的,所以我知道工具鏈文件正在處理中。
我已經看到一些提示,也許cmake放棄CMAKE_CXX_FLAGS的價值,因爲我的CMakeLists.txt沒有編譯任何東西。這可能嗎?或者,cmake只是以我的CMakeLists.txt無法看到它們的方式內化其變量的值?
在我的工具鏈文件中使用「CACHE STRING」可以解決這個問題,但我不確定它是否是正確的解決方案......思考? –