J'envisage de passer d'un projet multiplateforme à partir de systèmes de gestion de build séparés dans Visual C ++, XCode et makefiles vers CMake.
Une fonctionnalité essentielle dont j'ai besoin est d'ajouter automatiquement tous les fichiers d'un répertoire à une cible. Bien que cela soit facile à faire avec make, ce n'est pas facilement faisable avec Visual C ++ et XCode (corrigez-moi si je me trompe). Est-il possible de le faire directement dans CMake? Comment?
c++
cross-platform
cmake
Martjno
la source
la source
Réponses:
C'est possible. Par exemple avec
file(GLOB
:Notez que cela nécessite manuel réexécuter de
cmake
si un fichier source est ajouté ou supprimé, étant donné que le système de construction généré ne sait pas quand demander CMake à se régénérer, et de le faire à chaque construction augmenterait le temps de construction.la source
GLOB
:file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]...)
.La réponse de Kleist fonctionne certainement, mais il y a une mise en garde importante:
Lorsque vous écrivez un
Makefile
manuellement, vous pouvez générer uneSRCS
variable en utilisant une fonction pour sélectionner tous les fichiers.cpp
et.h
. Si un fichier source est ajouté ultérieurement, la réexécutionmake
l'inclura.Cependant, CMake (avec une commande comme
file(GLOB ...)
) générera explicitement une liste de fichiers et la placera dans le fichier auto-généréMakefile
. Si vous avez un nouveau fichier source, vous devrez le régénérer en leMakefile
réexécutantcmake
.edit: Pas besoin de supprimer le Makefile.
la source
Extension pour la réponse @Kleist :
Depuis CMake 3.12, l'option supplémentaire CONFIGURE_DEPENDS est prise en charge par les commandes
file(GLOB)
etfile(GLOB_RECURSE)
. Avec cette option, il n'est pas nécessaire de réexécuter manuellement CMake après l'ajout / la suppression d'un fichier source dans le répertoire - CMake sera réexécuté automatiquement lors de la prochaine construction du projet.Cependant, l'option CONFIGURE_DEPENDS implique que le répertoire correspondant sera revérifié chaque fois que la construction est demandée, donc le processus de construction prendrait plus de temps que sans CONFIGURE_DEPENDS .
Même avec l' option CONFIGURE_DEPENDS disponible, la documentation CMake ne recommande toujours pas d' utiliser
file(GLOB)
oufile(GLOB_RECURSE)
de collecter les sources.la source
file(GLOB)
oufile(GLOB_RECURSE)
de collecter les sources" Que recommandent-ils alors? Vous utilisez autre chose pour collecter les sources ou pour lister manuellement chaque fichier source?Alors pourquoi ne pas utiliser PowerShell pour créer la liste des fichiers source pour vous. Jetez un œil à ce script
Supposons que vous ayez un dossier avec cette structure
Maintenant, enregistrez ce fichier sous "generateSourceList.ps1" par exemple, et exécutez le script en tant que
Le fichier out.txt contiendra
la source