Nous construisons avec CMake et des makefiles Unix normaux. Il existe des contrôles d'analyse statique, par exemple Cppcheck , nous exécutons chaque fichier C / C ++ du projet pour détecter les erreurs lors de la compilation. p >
J'ai créé une cible personnalisée pour cppcheck et l'ai jointe à la cible "all". Cela vérifie tous les fichiers * .c et * .cpp du projet.
Nous souhaitons effectuer une vérification à chaque fois qu'un fichier est modifié et recompilé et uniquement sur ce fichier . La vérification doit être exécutée automatiquement et sans que l'utilisateur ait à ajouter des commandes supplémentaires dans CMake. Essentiellement, la vérification doit être "attachée / accrochée" aux commandes CMake normales add_library ()
et add_executable ()
. Y a-t-il un moyen de faire cela dans CMake?
3 Réponses :
Alors que add_executable
(et add_library
) est fourni par CMake lui-même, vous pouvez définir une fonction ou une macro avec le même nom, qui "cacherait" le CMake original fonction. À l'intérieur de votre fonction / macro, vous pouvez appeler la fonction CMake d'origine en utilisant le nom précédé de soulignement:
function(add_executable target_name) # Call the original function _add_executable(${target_name} ${ARGN}) ... perform additional steps... endfunction(add_executable target_name)
En supposant que vous ayez une liste de fichiers source (ce que vous devriez).
Parcourez les fichiers source avec une boucle for_each. Pour chaque fichier source, utilisez add_custom_command qui exécutera l'outil cppcheck sur le fichier. Rendez cette commande_personnalisée DEPEND sur le fichier dans la boucle actuelle. Vous devriez maintenant avoir des commandes personnalisées pour tous les fichiers source individuels, qui se déclencheront si et seulement si les fichiers changent à cause de l'instruction DEPENDS.
Non pas que ces commandes devront créer une sorte de fichier de sortie. Je suggère de rediriger la sortie de cppcheck dans un fichier nommé $ source $ _test.
Documentation: https://cmake.org/cmake/help/latest /command/add_custom_command.html
Vous pouvez essayer la fonctionnalité de raccordement de la bibliothèque tacklelib: https://sf.net/p/ tacklelib / tacklelib / HEAD / tree / trunk / cmake / tacklelib / Handlers.cmake
Je ne garantis pas que cela fonctionnera pour une fonction système, mais vous pouvez essayer en suivant les exemples des tests: https://sourceforge.net/p / tacklelib / tacklelib / HEAD / tree / trunk / cmake_tests / 01_unit / 01_script_mode / 11_Handlers /
Quelques exemples tirés des tests:
include(tacklelib/Handlers) include(tacklelib/Props) macro(custom_pre_handler) tkl_test_assert_true("a STREQUAL \"111\"" "1 call context variables is not visible: a=${a}") tkl_append_global_prop(. call_sequence -1) endmacro() macro(custom_macro) tkl_test_assert_true("a STREQUAL \"111\"" "2 call context variables is not visible: a=${a}") tkl_append_global_prop(. call_sequence 0) endmacro() tkl_enable_handlers(PRE_POST function custom_macro) tkl_add_last_handler(PRE custom_macro custom_pre_handler) set(a 111) custom_macro() tkl_get_global_prop(call_sequence call_sequence 0) tkl_test_assert_true("call_sequence STREQUAL \"-1;0\"" "call sequence is invalid: call_sequence=${call_sequence}") return() tkl_test_assert_true(0 "unreachable code")
p>
Bien que ces liens soient utiles, il est préférable d'inclure les parties essentielles de ces sources dans le message de réponse lui-même . Le lien peut devenir obsolète avec le temps et votre réponse deviendra moins utile. Veuillez fournir un exemple d'utilisation, si possible.
@squareskittles En fait, il y a trop de code source à inclure ici. Je ne peux inclure ici qu'un petit exemple qui ne montrerait pas grand-chose de toute façon. D'autre part, l'exemple peut changer après un certain temps et perdre l'actualité.
Ce sont des fonctions cmake intégrées. Si vous voulez des fonctionnalités personnalisées, vous devez généralement modifier votre CMakeLists.txt. C'est là que réside le code personnalisé.