2016-05-26 2 views
0

J'essaie actuellement d'utiliser Gcov et Gcovr de CMake sur Windows en utilisant MinGW. La compilation des fichiers avec les bons indicateurs fonctionne comme un charme. Cependant, CLion utilise une version hors-source que Gcov ne comprend pas.Rechercher et déplacer des fichiers avec l'extension au moment de la construction en utilisant CMake

Sur Linux j'ai utilisé ce qui suit pour copier tous les *.gcda et *.gcno aux CMAKE_SOURCE_DIR de CMAKE_BINARY_DIR sous-dossiers:

set(GCOV_DATA_DIR "${CMAKE_SOURCE_DIR}/gcov_data") 
add_custom_target(prepare_coverage 
    # Copy necessary files to CMAKE_SOURCE_DIR 
    COMMAND ${CMAKE_COMMAND} -E make_directory ${GCOV_DATA_DIR} 
    COMMAND find ${CMAKE_BINARY_DIR} -name \"*.gcda\" -o -name \"*.gcno\" | xargs -l -i cp {} "${GCOV_DATA_DIR}" 
) 

Notez que les fichiers binaires de test sont exécutés dans CMAKE_BINARY_DIR. Cela fonctionne plutôt bien et je peux ensuite appeler Gcovr avec des drapeaux supplémentaires pour obtenir un bon rapport.

Cependant, sur Windows je n'ai pas xargs (j'étais déjà pris que find a fonctionné). Pour rendre cette commande CMake indépendante de la plate-forme, je cherche un moyen de faire en sorte que CMake trouve et copie/déplace les fichiers pendant la construction (comme pour créer le répertoire).

Quelqu'un peut-il me dire si c'est possible et comment je devrais le faire? Bien sûr, je peux toujours installer des programmes ou des scripts supplémentaires, mais je préfère résoudre cela dans CMake au lieu d'avoir à demander à tous les développeurs d'installer des outils différents.

+0

En ce qui concerne 'find' et' cmake', veuillez jeter un coup d'oeil [ici] (http://stackoverflow.com/a/34995590/2436175). Le fait que vous puissiez utiliser 'find 'comme ça me fait penser que vous avez quelque chose comme [msys] (http://www.mingw.org/wiki/msys) installé. – Antonio

+0

Comme je l'ai mentionné, j'utilise MinGW. J'ai aussi les paquets MSYS installés. –

+0

Comme vous pouvez le voir dans mon commentaire sur la réponse acceptée, j'ai maintenant une solution qui implique des outils Windows standard. –

Répondre

0

Si vous n'utilisez pas CMAKE_RUNTIME_OUTPUT_PATH dans votre projet, puis .gcda et .gcno fichiers sont créés dans le répertoire avec exécutable, vous pouvez calculer ce répertoire avec $<TARGET_FILE_DIR:tgt>generator-expression. Comme vous connaissez les noms des fichiers source, vous pouvez calculer les chemins absolus de tous les fichiers liés à gcov et générer les commandes de copie appropriées sans find.

Une autre approche pourrait être d'écrire par vous-même un programme/script similaire à xargs, en l'expédiant avec votre projet, et en l'utilisant dans COMMAND. Donc

... mais je préfère résoudre ceci dans CMake au lieu d'avoir à demander à tous les développeurs d'installer des outils différents.

ne serait pas un problème.

+0

Terminé à l'aide d'un fichier de commandes et d'un fichier bash (sélectionné en fonction du système d'exploitation hôte) appelé pendant la génération. En batch ce n'est pas trop dur aussi d'accomplir le comportement que je voulais et le fichier bash contient essentiellement ce que j'ai mentionné dans ma question. –