CMake: ajouter la dépendance à add_custom_command dynamiquement
J'ai un CMake projet avec de nombreux sous-projets.
Chacun d'eux peut utiliser une fonction-je fournir pour générer un petit fichier texte avec certaines informations (en appelant add_custom_command).
À l'étape finale, je tiens à combiner tous ces fichiers en un seul gros fichier texte.
J'ai créé une commande personnalisée, qui cherche les fichiers créés (tous en un seul lieu) et les fusionne.
Le problème est que je voudrais faire cette dernière étape dependend sur de tous petits pas accomplis dans des sous-projets alors que je ne sais pas vraiment combien de fichiers seront fournis.
Ma dernière commande ressemble à ceci:
add_custom_command(OUTPUT combination.txt
COMMAND create combination.txt from all files from /path/)
et de créer mon-petit-texte-fichier-pour-chaque-sous-projet de commande ressemble à ceci:
add_custom_command(OUTPUT /path/${sub_project_name}.txt
COMMAND create /path/${sub_project_name}.txt)
Et quand j'ai créer ces petits fichiers que je voudrais faire quelque chose comme pour le faire "combination.txt" dépendent de l' /chemin/${sub_project_name}.txt
Donc, je souhaite que je pourrais:
add_dependency(combination.txt /path/${sub_project_name}.txt)
Toutefois, cela ne fonctionne que pour les cibles.
J'ai aussi essayé d'utiliser set_source_files_properties avec OBJECT_DEPENDS, mais il semble qu'il ne fonctionne pas (peut-être son intention d'être utilisé avec add_target de fichiers cpp ?)
Le dernier moyen de le faire fonctionner, je vois est d'utiliser un cache variable qui permettrait d'accumuler tous ces petits fichiers de chemins et de l'utiliser ensuite comme ceci:
add_custom_command(OUTPUT combination.txt
COMMAND create combination.txt from all files from /path/
DEPENDS ${all_small_files_list})
mais c'est la dernière chose que je veux faire.
OriginalL'auteur Michał Walenciak | 2012-10-16
Vous devez vous connecter pour publier un commentaire.
Au lieu d'utiliser
add_custom_command
vous pouvez utiliseradd_custom_target
avec une dépendance de la définition (de sorte qu'il n'est pas construit à chaque fois).De nouveau: assurez-vous que vous utilisez le
DEPENDS
argument deadd_custom_target
de créer une véritable chaîne de dépendances ainsi qu'un projet-cible et donc de la combinaison-cible devient hors de date.Mise à JOUR: j'ai été trop prématuré. En fait cmake (au moins jusqu'à 2.8.9) fonctionne comme suit pour les dépendances: un appel à la
add_dependencies
vous ne pouvez pas ajouter une dépendance qui est laOUTPUT
d'une commande personnalisée à l'OIE un (généré) fichier. Avecadd_dependencies
vous pouvez uniquement ajouter destarget
créé paradd_custom_target
. Cependant, dans unadd_custom_target
vous pouvez compter sur une sortie deadd_custom_command
à l'aide de laDEPENDS
-directive. Cela dit, ce qui fait que cela fonctionne:Cela rendra la combinaison cible toujours être régénérés comme il n'a pas de
MAIN_DEPENDENCY
ouDEPENDS
, mais l'utilisation deadd_dependencies
est autorisé.Qu'utilisez-vous comme la dépendance à générer project.txt? I
Eh bien, après une bonne lecture de la façon dont nous le faisons, je dois avouer que j'ai été trop prématuré. Voir ma mise à jour de la réponse.
la solution que Vous avez fourni fonctionne, mais a un inconvénient: à chaque fois vous tapez: make combinaison - un chat de commande sera lancé. C'est redundand 😉 jetez un oeil à add_custom_target description: "add_custom_target: Ajouter une cible avec pas de sortie de sorte qu'il sera toujours construit. (...) La cible n'a pas de fichier de sortie et est TOUJOURS CONSIDÉRÉ comme HORS DE la DATE, même si les commandes essayez de créer un fichier avec le nom de la cible."
Eh bien, alors vous allez être lier à
add_custom_target(... DEPENDS file1 file2)
. Ce sera le travail.OriginalL'auteur Patrick B.