Réponses:
MISE À JOUR: Cette réponse est antérieure à l'ère Modern CMake. Tout utilisateur sain d'esprit de CMake doit s'abstenir de jouer CMAKE_CXX_FLAGS
directement avec et appeler la target_compile_options
commande à la place. Vérifiez la réponse du mrts qui présente les meilleures pratiques recommandées.
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()
/Wall
est utilisable si vous souhaitez suivre une stratégie «soustractive» pour les avertissements, tout comme celle de clang -Weverything
. Au lieu de sélectionner les avertissements à activer, vous activez tout, puis sélectionnez des avertissements spécifiques à désactiver.
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()
Mon collègue a suggéré une version alternative:
target_compile_options(${TARGET_NAME} PRIVATE
$<$<CXX_COMPILER_ID:MSVC>:/W4 /WX>
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Wextra -pedantic -Werror>
)
Remplacez-le ${TARGET_NAME}
par le nom réel de la cible. -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.
Assurez-vous également de comprendre la différence entre PRIVATE
et PUBLIC
(les options publiques seront héritées par les cibles qui dépendent de la cible donnée).
add_compile_options(...)
si vous souhaitez l'appliquer à toutes les cibles.
else()
ou endif()
.
add_compile_options()
est que les avertissements se propageront aux cibles ajoutées via add_subdirectory()
. Si vous incluez des bibliothèques externes de cette façon, vous pouvez recevoir de nombreux avertissements si cette bibliothèque a été conçue avec un niveau d'avertissement différent.
Certains modules CMake que j'ai écrits incluent la suppression expérimentale des avertissements 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:
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION
attribut Xcode (aka paramètres de construction -> avertissements -> conversions implicites suspectes -> OUI )-Werror
Makefile gcc et clang:
-Wconversion
,-Werror
Visual Studio:
/WX
,/w14244
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: ça devrait être -Wall
pour GCC.
-Wall
et peut-être -Wextra
aussi détaillé sur gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-W -Wall -Wextra -pedantic
. -Wextra
L'IIRC a été remplacé -W
dans une version ultérieure de GCC, mais je laisse les deux pour des raisons de compatibilité.
Selon la documentation de Cmake 3.17.1 :
if (MSVC)
# warning level 4 and all warnings as errors
add_compile_options(/W4 /WX)
else()
# lots of warnings and all warnings as errors
add_compile_options(-Wall -Wextra -pedantic -Werror)
endif()
GCC et Clang partagent ces drapeaux, donc cela devrait couvrir les 3.
add_compile_options
est à l'échelle du répertoire, alors que target_compile_options
c'est juste pour une seule cible.
if(MSVC)
string(REGEX REPLACE "/W[1-3]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
Si vous utilisez target_compile_options
- cmake essaiera d 'utiliser un double /W*
drapeau, qui donnera un avertissement par le compilateur.
add_compile_options
seul pour obtenir des tonnes d'avertissements qui /W3
sont annulés /W4
. Le fait que CMake n'aborde pas cette option rudimentaire (définition du niveau d'avertissement) est incroyable.
/Wall
indicateur (qui est nomméEnableAllWarnings
). Il produit encore plus d'avertissements que/W4
. Cependant, d'après mon expérience, cela produit beaucoup trop d'avertissements.