Je suis en train de réécrire une configuration CMake héritée pour utiliser des fonctionnalités modernes comme la propagation automatique des dépendances. (c'est-à-dire en utilisant des choses comme target_include_directories(<target> PUBLIC <dir>)
au lieu de include_directories(<dir>)
.) Actuellement, nous traitons manuellement toutes les informations de dépendance du projet en définissant un tas de propriétés de répertoire global.
Lors de mes tests, j'ai trouvé quelques exemples où une cible dans la nouvelle version sera liée à une bibliothèque que l'ancienne version ne ferait pas. Je n'y suis pas lié explicitement, donc je sais que cela vient des dépendances de la cible, mais afin de trouver celles que je dois parcourir récursivement à travers tous les projets CMakeLists.txt
, en suivant la hiérarchie des dépendances jusqu'à ce que je trouve celui qui tire dans la bibliothèque en question. Nous avons des dizaines de bibliothèques, ce n'est donc pas un processus trivial.
CMake fournit-il un moyen de voir, pour chaque cible, lesquelles de ses dépendances ont été ajoutées explicitement et lesquelles ont été propagées via des dépendances transitives?
Il semble que la --graphviz
sortie ne montre cette distinction, si clairement CMake connaît le contexte interne. Cependant, je voudrais écrire un tree
script de type similaire pour afficher les informations de dépendance sur la ligne de commande, et l'analyse des fichiers Graphviz sonne à la fois comme un cauchemar et un hack.
Pour autant que je sache, cmake-file-api
ne comprend pas ces informations. Je pensais que le codemodel/target/dependencies
champ pourrait fonctionner, mais il répertorie les dépendances locales et transitives mélangées ensemble. Et le backtrace
champ de chaque dépendance n'est lié qu'à l' appel add_executable
/ add_library
de la cible actuelle.
--graphiz
option ne répond-elle pas à votre question? Pourquoi analyser des fichiers dot ressemble à un cauchemar? Les fichiers de points sont le moyen le plus simple, commun et flexible de représenter des points connectés lisibles par l'homme. Avec l'gvpr
utilitaire, vous pouvez faire n'importe quoi avec eux dans un style awk-ish, et vous pouvez les importer dans d'autres langues. Pourquoi un fichier de points, qui représente littéralement une structure arborescente de dépendances entre les cibles, pas une "façon de voir" ce que vous demandez?Réponses:
Vous pouvez analyser le
dot
fichier généré pargraphviz
et extraire les détails que vous souhaitez. Voici un exemple de script python pour le faire.Vous pouvez également ajouter ce script à exécuter à partir de cmake en tant que cible personnalisée, afin de pouvoir l'appeler à partir de votre système de génération. Vous pouvez trouver un exemple de projet cmake ici
la source
pydot
.