web-dev-qa-db-fra.com

Comment définir le niveau d'avertissement dans CMake?

Comment définir le niveau d'avertissement pour un projet (pas la solution complète) en utilisant CMake? Devrait fonctionner sur Visual Studio et [~ # ~] gcc [~ # ~] .

J'ai trouvé différentes options mais la plupart semblent ne pas fonctionner ou ne sont pas conformes à la documentation.

94
Wernight

Voici la meilleure solution que j'ai trouvée jusqu'à présent (y compris une vérification du compilateur):

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

Cela définira le niveau d'avertissement 2 dans Visual Studio. Je suppose qu'avec un -W2 cela fonctionnerait aussi dans GCC (non testé).

Mise à jour de @Williams: Cela devrait être -Wall pour GCC.

7
Wernight

MISE À JOUR: Cette réponse est antérieure à l'ère Modern CMake. Tout utilisateur sain de CMake devrait s'abstenir de jouer avec CMAKE_CXX_FLAGS directement et appelez le target_compile_options commande à la place. Vérifiez la réponse de mrts qui présente la meilleure pratique recommandée.

Vous pouvez faire quelque chose de similaire à ceci:

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

Dans CMake moderne, ce qui suit fonctionne bien:

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

Remplacez ${TARGET_NAME} Par le nom cible réel. -Werror Est facultatif, il transforme tous les avertissements en erreurs.

Ou utilisez add_compile_options(...) si vous souhaitez l'appliquer à toutes les cibles comme suggéré par @aldo dans les commentaires.

43
mrts

Certains modules CMake que j'ai écrits incluent expérimental suppression d'avertissement cross-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}"
)

Résultat pour Xcode:

  • Ensemble CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION Attribut Xcode (aka paramètres de construction -> avertissements -> conversions implicites suspectes -> [~ # ~] oui [~ # ~] )
  • Ajouter l'indicateur du compilateur: -Werror

Makefile gcc et clang:

  • Ajoutez les drapeaux du compilateur: -Wconversion, -Werror

Visual Studio:

  • Ajoutez les drapeaux du compilateur: /WX, /w14244

Liens

23
user2288008