即使我不想将CMakeLists文件绑定(bind)到特定的编译器,我仍然希望启用某些选项,例如-Wall,我知道许多编译器都支持。

目前,我正在这样做,以设置-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)

最佳答案

如评论中所建议,我尝试自己编写一个函数。我显然不太了解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")

09-30 14:47
查看更多