CMake La Compilation Des Fichiers Générés
J'ai une liste de fichiers qui se produit au cours de la CMake processus de construction. Je veux compiler ces fichiers à l'aide de "add_library" par la suite, mais je ne sais pas quels fichiers sont générés jusqu'à ce qu'ils se produit. Est-il de toute façon à l'intégrer dans un CMake script?
OriginalL'auteur Jonathan Sternberg | 2010-11-19
Vous devez vous connecter pour publier un commentaire.
Bien, je pense que c'est possible, donc je vais partager ce que j'ai fait. Mon problème était que je devais compiler plusieurs CORBA permis de conduire international pour une utilisation dans le cadre d'un projet de la source et je ne voulais pas manuellement la liste de tous les fichiers. J'ai pensé qu'il serait préférable de trouver les fichiers. Donc j'ai fait comme ceci:
Les propriétés GÉNÉRÉES est utile dans le cas où l'un de mes idl de compilation des résultats (*C.cpp, *C. h, *S.cpp et *S. h) n'est pas créé, de sorte que la commande de construction ne se plaint pas que le fichier n'existe pas.
OriginalL'auteur
Bien, il est possible de le faire avec deux CMake scripts à l'aide de CMake est ExternalProject fonctionnalité.
La solution la plus simple
Dans les principaux CMake script, vous devez ajouter une cible personnalisée qui génère les fichiers de la source comme suit et une référence à la 2e (externe) CMake
projet:
Maintenant, vous pouvez faire un fichier d'expansion dans le 2ème (externe) CMake script et le lien de tous les fichiers dans une bibliothèque statique:
Dans cette solution simple de vos fichiers sont générés et construit à chaque fois que vous exécutez l'étape de génération, même si rien n'a changé. Si vous voulez éviter cela, vous pouvez ajouter un timbre fichier sur votre cible personnalisée comme dans l'amélioration de la solution:
Le timbre fichier solution
Si un changement dans les fichiers d'entrée pour votre générateur de code n'entraîne pas nécessairement une modification de tous les fichiers générés vous pouvez améliorer encore la solution en utilisant CMake est
copy_if_different
de commande dans le projet externe comme dans l'avancée de la solution:La solution avancée
Dans cette solution tous les fichiers générés sont copiés vers un autre emplacement (
${CMAKE_CURRENT_BINARY_DIR}/generated
) si elles ont changé ou ont été ajoutés et sont construits à partir de là. Cette approche se traduit par une accumulation de fichiers modifiés (mais nécessite un nettoyage lorsque les fichiers ont été supprimés).OriginalL'auteur
Si vous ne connaissez pas le nom des fichiers qui seront générés, vous pouvez "glob", les dossiers où ils résident.
file( GLOB_RECURSE MY_SRC dest_folder/*.cpp )
add_library( libname SHARED ${MY_SRC} )
Maintenant, je ne suis pas sûr de ce qui déclenche la génération de ces fichiers. Le "globbing" ne pourra se produire que lorsque vous exécutez manuellement cmake: il ne sera pas en mesure de détecter automatiquement les nouveaux fichiers sont présents.
Alors peut-être vous avez besoin de partager votre processus de création en deux. La première cmake projet prendra fin avec la génération de ces fichiers. La deuxième glob le dossier avec les fichiers nouveaux et à construire. Une façon vous pouvez mettre en place que bien est à l'aide d'hudson (hudson.dev.java.net). Vous pouvez créer une dépendance entre les deux projets et de déclencher la construction de l'un après l'autre.
OriginalL'auteur
Traiter cela comme une non-réponse, juste plus d'infos:
J'ai récemment eu à faire quelque chose d'un cas où j'ai eu un .rpc fichier qui a été généré automatiquement, mais je ne pouvais pas comprendre comment obtenir CMake pour construire le fichier de projet Visual Studio qui serait ensuite le compiler. J'ai dû recourir à quelque chose tout à fait minable: j'ai dû
#include <the_generated.cpp>
fichier à partir d'un autre fichier qui a habité dans le${CMAKE_CURRENT_SOURCE}
répertoire. Qui ne sera pas beaucoup vous aider dans votre cas, parce que je soupçonne que vous en avez plusieurs .fichiers cpp, de sorte que cette approche n'est pas évolutif.Aussi, j'ai trouvé que le
GENERATED
fichier source de la propriété, lorsqu'il est ajouté à la file, n'a pas aidé du tout.Je considère que cette condition soit un bug dans Visual Studio (dans mon cas, cela a été VS2008 SP1), ou dans la façon dont CMake génère l' .vcproj fichiers, ou les deux.
OriginalL'auteur