如何在cmake中为不同的编译器应用不同的编译器选项?

时间:2010-06-28 17:28:36

标签: cmake

我目前正在使用cmake构建一些项目,主要平台是Visual C ++,MinGW GCC和Linux GCC。使用GCC构建时,我需要指定-Wno-invalid-offsetof编译器选项。

我目前的修复方法如下......

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

这是有效的,但假设除了视觉工作室之外的所有生成器都将使用gcc构建,这显然是不安全的。首先,Borland编译器有IIRC发生器。更重要的是,使用make并不总是意味着使用gcc。

我可能使用的其他编译器是llvm-gcc和clang。幸运的是,我认为即使是clang也支持gcc兼容的选项。但只要相关代码永远不会发布,这种逻辑才有用。

Cmake似乎检查可用的编译器并专门为该编译器生成一个makefile(提出问题 - 为什么不能直接构建项目,而不需要像make这样的中间人?)。 / p>

既然如此,我希望能够在我的CMakeLists.txt文件中直接测试gcc。但到目前为止,我找不到合适的变量来测试或任何其他明显的解决方案。

这可能吗?

1 个答案:

答案 0 :(得分:36)

要创建可移植的构建系统,最好不要测试平台,而是测试功能。

不测试“如果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)命令。