如何在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)
命令。
上一篇: 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?