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

Comment définir le niveau d’avertissement d’un projet (pas la solution complète) à l’aide de 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 compatibles avec la documentation.

Vous pouvez faire quelque chose de similaire à ceci:

if(MSVC) # Force to always comstack with W4 if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") ssortingng(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() 

Certains modules CMake que j’ai écrits incluent la suppression expérimentale d’avertissements croisés :

 sugar_generate_warning_flags( target_comstack_options target_properties ENABLE conversion TREAT_AS_ERRORS ALL ) set_target_properties( foo PROPERTIES ${target_properties} COMPILE_OPTIONS "${target_comstack_options}" ) 

Résultat pour Xcode:

  • Définissez l’ CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION Xcode CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION ( parameters de construction aka -> warnings -> conversions implicites suspectes -> YES )
  • Ajouter un indicateur de compilation: -Werror

Makefile gcc et clang:

  • Ajouter des indicateurs de compilateur: -Wconversion , -Werror

Visual Studio:

  • Ajouter les indicateurs du compilateur: /WX , /w14244

Liens

  • Liste des avertissements disponibles
  • Utilisation et plus d’options

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 2 d’avertissement 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.

Dans CMake moderne, ce qui suit fonctionne bien:

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

Remplacez ${TARGET_NAME} par le nom de la cible. -Werror est facultatif, il transforme tous les avertissements en erreurs.