如何在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

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

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

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

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

这可能吗?


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

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

链接地址: http://www.djcxy.com/p/24449.html

上一篇: How to apply different compiler options for different compilers in cmake?

下一篇: How do I force git to use LF instead of CR+LF under windows?