2010-06-28 472 views
24

我目前正在使用cmake來構建一些項目,主要平臺是Visual C++,MinGW GCC和Linux GCC。在使用GCC構建時,我需要指定-Wno-invalid-offsetof編譯器選項。如何在cmake中爲不同的編譯器應用不同的編譯器選項?

我目前的解決方法是如下...

if ( "${CMAKE_GENERATOR}" MATCHES "^Visual Studio" 
    OR "${CMAKE_GENERATOR}" MATCHES "^NMake" 
    ) 
    set (CPPLIB_COMPILER_OPTS "") 
else() 
    set (CPPLIB_COMPILER_OPTS "-Wno-invalid-offsetof") 
endif() 

... 

set_target_properties(sh_core PROPERTIES COMPILE_FLAGS "${CPPLIB_COMPILER_OPTS}") 
# repeated for all targets 

這工作,但假設除視覺工作室以外的其他所有發電機將建立與海灣合作委員會顯然是不安全的。首先,用於Borland編譯器的IIRC發生器。更重要的是,使用make並不總是意味着使用gcc。

我很可能會使用的其他編譯器是llvm-gcc和clang。幸運的是,我認爲即使是clang也支持與gcc兼容的選項。但是,只要相關的代碼永遠不會被釋放,這個邏輯就是有益的。 (提出問題 - 爲什麼不直接構建項目,而不需要像make這樣的中間人?)爲什麼不能直接構建項目?爲什麼不能直接構建項目,而不需要像make這樣的中間人?)。Cmake似乎檢查可用的編譯器並生成專門用於該編譯器的makefile。

既然如此,我希望能夠直接在我的CMakeLists.txt文件中測試gcc。但是到目前爲止,我找不到一個合適的變量來測試或者其他明顯的解決方案。

這可能嗎?

回答

35

要創建一個可移植的構建系統,最好不要測試平臺,而是測試功能。

而不是測試「如果Windows然後執行此操作」,測試「如果-Wno-invalid-offsetof標誌起作用然後使用它」。你可以做到這一點與CheckCCompilerFlag模塊,例如:

include(CheckCCompilerFlag) 
check_c_compiler_flag(-Wno-invalid-offsetof HAS_NO_INVALID_OFFSETOF) 
if (HAS_NO_INVALID_OFFSETOF) 
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-invalid-offsetof") 
endif() 

對於C++也有類似的CheckCXXCompilerFlag與check_cxx_compiler_flag(flag var)命令。

+1

非常完美!一個不相干的事情,雖然......沒有太多的觀點檢查C的選項,因爲在C中沒有無效的偏移量 - 它只發生在C++中。 – Steve314 2010-06-28 20:40:10

+0

我不知道。事實上,我不知道該選項是什麼,但它非常有意義,因爲C只有POD類型http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html。 CMake在測試期間會忽略編譯器警告 - 「如果它編譯成功」。 – richq 2010-07-07 18:18:29

+0

有沒有辦法檢查選項的組合?此外,我想確保沒有編譯時警告,所以也在尋找調查警告的方法。 – thoni56 2017-01-10 07:27:33