Как установить уровень предупреждения в CMake?

настройка предупреждения на проект (не весь) с помощью CMake? Должен работать на Visual Studio и GCC.

Я нашел различные варианты, но большинство из них либо не работают, либо не согласуются с документацией.

4 ответов


вы можете сделать что-то похожее на это:

if(MSVC)
  # Force to always compile with W4
  if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
    string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
  endif()
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
  # Update if necessary
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
endif()

некоторые модули CMake, которые я написал включить экспериментальную кросс-platfrom предупреждение подавления:

sugar_generate_warning_flags(
    target_compile_options
    target_properties
    ENABLE conversion
    TREAT_AS_ERRORS ALL
)

set_target_properties(
    foo
    PROPERTIES
    ${target_properties}
    COMPILE_OPTIONS
    "${target_compile_options}"
)

результат для Xcode:

  • Set CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION атрибут Xcode (ака параметры построения ->предупреждения ->подозрительные неявные преобразования ->да)
  • добавить флаг компилятора: -Werror

Makefile gcc и лязг:

  • добавить флаги компилятора: -Wconversion, -Werror

Visual studio:

  • добавить флаги компилятора: /WX, /w14244

ссылки


здесь-это лучшее решение я нашел до сих пор (включая проверку):

if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
    add_definitions(/W2)
endif()

это установит уровень предупреждения 2 в Visual Studio. Я полагаю, с -W2 он будет работать и в GCC (непроверенный).

обновление от @Williams: это должно быть -Wall для GCC.


в современном CMake хорошо работает следующее:

if(MSVC)
  target_compile_options(${TARGET_NAME} PRIVATE /W4 /WX)
else(MSVC)
  target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra -pedantic -Werror)
endif(MSVC)

заменить ${TARGET_NAME} с фактическим именем цели. -Werror является необязательным, он превращает все предупреждения в ошибки.