2017-06-07 36 views
1

使用CMake獲取C預處理器定義的值是否有一種不完全的方法?例如,我可能想要做這樣的事情來得到確切的MSVC版本。使用CMake獲取預處理器定義值

if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") 
    get_preprocessor_value("_MSC_FULL_VER" msvc_version) 
    if (msvc_version LESS 190023918) 
     message(FATAL_ERROR "Visual C++ 2015 Update 2 or later is required due to a bug in std::atomic.") 
    endif() 
    target_compile_definitions(mytarget PRIVATE "_ENABLE_ATOMIC_ALIGNMENT_FIX") 
endif() 

我編了get_preprocessor_value()。有沒有這樣做的功能,或者一個簡單的方法來做到這一點。很明顯,我可以讓CMake編譯一個打印它的簡單程序,並捕獲標準輸出,但是我想知道是否有內置函數可以幫我實現。

回答

0

有沒有內置的CMake功能來做到這一點,CMake也沒有運送一個standard module做這樣的事情。

對於編譯器版本的特殊情況,CMake具有變量CMAKE_<LANG>_COMPILER_VERSION(例如,用於C++的CMAKE_CXX_COMPILER_VERSION)。

如果該變量沒有爲您提供足夠的信息,那麼最好的方法是使用try_run()編譯&列印宏的值,正如您在問題中提到的那樣。我根本沒有發現這種黑客行爲,我認爲這實際上是一種在CMake中做這種事情的非常習慣的方式。

+0

是的,我想到了很多。不幸的是,我找不到任何地方MSVC的CMAKE_CXX_COMPILER_VERSION值實際上是每個版本的。呃,好吧。 – Timmmm

+0

實際上,這是一個相當簡單的[_MSC_FULL_VER'值](https://sourceforge.net/p/predef/wiki/Compilers/)翻譯的例子, 190023918對應於19.0.23918的'CMAKE_CXX_COMPILER_VERSION'。 – Timmmm