2015-10-19 22 views
4

即使我不想將我的CMakeLists文件綁定到特定的編譯器,我仍然希望啓用某些選項,例如-Wall,我知道很多編譯器支持。在CMake中可移植設置編譯器選項的最佳方式,如-Wall和-pedantic

目前,我做這樣的設置-Wall -pedantic和旗幟,如果他們被當前的編譯器接受:

include(CheckCXXCompilerFlag) 

check_cxx_compiler_flag(-Wall temp) 
if(temp) 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") 
endif() 
check_cxx_compiler_flag(-pedantic temp) 
if(temp) 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic") 
endif() 

有沒有更好的辦法?或者至少有一個更好的方法來做基本相同的事情?上述內容對於其實現的內容而言非常冗長和難看。一個更好的命令會是這樣的:

enable_cxx_compiler_flags_if_supported(-Wall -pedantic) 
+0

也許你可以使用['CMAKE_CXX_COMPILER_ID'(https://cmake.org/Wiki/CMake_Useful_Variables#Compilers_and_Tools)變量設置標誌的每個編譯器列表。 (不知道這是否是一個「更好」的方法)。否則,您可以定義一個宏或一個函數,它接受所需標誌的列表並將'check_cxx_compiler_flag()'應用於它們。 – 865719

+0

自己寫入函數'enable_cxx_compiler_flags_if_supported'。也許你想添加-Werror(測試之後)。一些編譯器會警告他們不理解的標誌,並且會使用一系列忽略的標誌來混亂編譯器輸出。 – usr1234567

回答

4

正如在評論中建議我試圖寫一個函數我自己。我明顯不知道CMake,但這裏是我嘗試使用check_cxx_compiler_flag檢查標誌是否被支持的函數,並且還檢查了標誌還沒有被設置(以避免重複列表氾濫)。

include(CheckCXXCompilerFlag) 

function(enable_cxx_compiler_flag_if_supported flag) 
    string(FIND "${CMAKE_CXX_FLAGS}" "${flag}" flag_already_set) 
    if(flag_already_set EQUAL -1) 
     check_cxx_compiler_flag("${flag}" flag_supported) 
     if(flag_supported) 
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE) 
     endif() 
     unset(flag_supported CACHE) 
    endif() 
endfunction() 

# example usage 
enable_cxx_compiler_flag_if_supported("-Wall") 
enable_cxx_compiler_flag_if_supported("-Wextra") 
enable_cxx_compiler_flag_if_supported("-pedantic") 
相關問題