Как установить уровень предупреждения для проекта (а не для всего решения) с помощью CMake? Должен работать в Visual Studio и GCC.
Я нашел различные варианты, но большинство из них либо не работают, либо не согласуются с документацией.
Как установить уровень предупреждения для проекта (а не для всего решения) с помощью CMake? Должен работать в Visual Studio и GCC.
Я нашел различные варианты, но большинство из них либо не работают, либо не согласуются с документацией.
Вот лучшее решение, которое я нашел до сих пор (включая проверку компилятора):
if(CMAKE_BUILD_TOOL MATCHES "(msdev|devenv|nmake)")
add_definitions(/W2)
endif()
Это установит уровень предупреждения 2 в Visual Studio. Я полагаю, что с -W2
он будет работать и в GCC (непроверенный).
Обновление от @Williams: для GCC должно быть -Wall
.
ОБНОВЛЕНИЕ: Этот ответ предшествует эре современного 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()
В современном 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 в комментариях.
Некоторые написанные мной модули 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