Frage Wie lege ich die Warnstufe in CMake fest?


Wie stelle ich das ein? Warnstufe Für ein Projekt (nicht die ganze Lösung) verwenden CMake? Sollte weiterarbeiten Visual Studio und GCC.

Ich habe verschiedene Optionen gefunden, aber die meisten scheinen entweder nicht zu funktionieren oder stimmen nicht mit der Dokumentation überein.


75
2018-03-03 04:37


Ursprung


Antworten:


Sie können etwas Ähnliches tun:

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

74
2017-09-29 00:57



Etwas CMake-Module, die ich geschrieben habe experimentell einschließen Cross-Plattform-Warnung Unterdrückung:

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}"
)

Ergebnis für Xcode:

  • einstellen CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION Xcode-Attribut (aka Einstellungen erstellen -> Warnungen -> verdächtige implizite Conversions -> JA)
  • Compiler-Flag hinzufügen: -Werror

Makefile gcc und klingeln:

  • Fügen Sie Compilerflags hinzu: -Wconversion, -Werror

Visuelles Studio:

  • Fügen Sie Compilerflags hinzu: /WX, /w14244

Links


20
2018-06-24 06:23



Hier ist die beste Lösung, die ich bisher gefunden habe (inklusive Compiler-Check):

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

Dies wird Warnstufe 2 in Visual Studio festlegen. Ich nehme an mit einem -W2 es würde auch in GCC funktionieren (ungetestet).

Update von @Williams: Es sollte sein -Wall für GCC.


10
2018-03-03 06:23



Im modernen CMake funktioniert das Folgende gut:

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

Ersetzen ${TARGET_NAME} mit dem tatsächlichen Zielnamen. -Werror ist optional, es macht alle Warnungen zu Fehlern.


1
2018-06-15 20:23