如何使用cmake跨平台添加警告标志?

时间:2016-03-28 04:18:42

标签: cmake

我看到一些文章建议您检查编译器并根据需要添加标记,例如

if (CMAKE_COMPILER_IS_GNUCC) ... endif() if (MSVC) ... endif()

这是一个非常不利的情况。

它依赖于您为每个项目添加对您支持的每个编译器的特定支持,一次一个。

其他内容,例如C++11 featuresdebug flags由cmake自动为其支持的每个编译器生成。

是否没有通过cmake设置将等效的-Wall / /W3添加到编译中的等效解决方案?

2 个答案:

答案 0 :(得分:1)

  

它依赖于您为每个项目添加对您支持的每个>编译器的特定支持,一次一个。

现在,您只能使用compiler.cmake之类的内容,为每个编译器配置合适的标志,并在项目中共享compiler.cmake

  

是否没有相同的解决方案只需通过cmake设置将-Wall / / W3等效添加到>编译?

不,现在只有关于类似功能的讨论及其可能的实施,请参阅

https://cmake.org/pipermail/cmake-developers/2016-March/028107.html

答案 1 :(得分:1)

对于任何发现此事的人......

有一个相当强大的实现,可以在这里找到,作为第三方添加:

https://github.com/ruslo/sugar/wiki/Cross-platform-warning-suppression

你这样使用它:

## Project
cmake_minimum_required(VERSION 3.1)
project(npp)

# Dependencies
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/npp)
... whatever ...

# Clone entire sugar repo to source folder and import
include(${CMAKE_CURRENT_SOURCE_DIR}/sugar/cmake/Sugar)
include(sugar_generate_warning_flags)

# Generate flags, included excluded flags, etc.
# see: https://github.com/ruslo/leathers/wiki/List
sugar_generate_warning_flags(
  flags
  properties
  ENABLE ALL
  DISABLE c++98-compat padded
  TREAT_AS_ERROR ALL
  CLEAR_GLOBAL)

# Library / executable if any
file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/npp/*.cpp)
add_library(npp STATIC ${SOURCES})

# Set flags
set_target_properties(npp PROPERTIES ${properties} COMPILE_OPTIONS "${flags}")

# Local tests
enable_testing()
add_executable(tests "${CMAKE_CURRENT_SOURCE_DIR}/tests/tests.cpp")

# Set flags
set_target_properties(tests PROPERTIES ${properties} COMPILE_OPTIONS "${flags}")
target_link_libraries(tests npp)
add_test(tests tests)

显然这远非理想,因为必须克隆一组模块非常恼火,但目前它是实用的。