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

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

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

Ответ 1

Вот лучшее решение, которое я нашел до сих пор (включая проверку компилятора):

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

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

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

Ответ 2

ОБНОВЛЕНИЕ: Этот ответ предшествует эре современного CMake. Каждый здравомыслящий пользователь CMake должен воздерживаться от CMAKE_CXX_FLAGS с CMAKE_CXX_FLAGS напрямую и вместо этого вызывать команду target_compile_options. Проверьте ответ MRT, который представляет рекомендуемые лучшие практики.

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

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()

Ответ 3

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

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

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

Или используйте add_compile_options(...) если вы хотите применить его ко всем целям, как предложено @aldo в комментариях.

Ответ 4

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

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:

  • Установите CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION атрибут CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION (он же настройки сборки → предупреждения → подозрительные неявные преобразования → ДА)
  • Добавить флаг компилятора: -Werror

Makefile gcc и clang:

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

Визуальная студия:

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

связи