我目前正在使用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。但到目前为止,我找不到合适的变量来测试或任何其他明显的解决方案。
这可能吗?
答案 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)
命令。