2014-02-13 38 views
2

作爲構建過程的一部分,我們需要記錄機器和編譯器的細節。由於編譯器可以通過設置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無法看到它們的方式內化其變量的值?

+0

在我的工具鏈文件中使用「CACHE STRING」可以解決這個問題,但我不確定它是否是正確的解決方案......思考? –

回答

0

你需要寫這個變量緩存,example

集(CMAKE_CXX_FLAGS 「$ {} CMAKE_CXX_FLAGS -std = C++ 11」 CACHE STRING 「一些信息」 FORCE)

注意標誌之後project命令更新:

message("release flags: ${CMAKE_CXX_FLAGS_RELEASE}") 
cmake_minimum_required(VERSION 2.8.4) 
project(foo CXX) 
message("release flags: ${CMAKE_CXX_FLAGS_RELEASE}") 

輸出:

release flags: 
-- The CXX compiler identification is GNU 4.8.2 
-- Check for working CXX compiler: /usr/bin/c++.exe 
-- Check for working CXX compiler: /usr/bin/c++.exe -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
release flags: -O3 -DNDEBUG 
-- Configuring done 
-- Generating done 
-- Build files have been written to: ...