La meilleure façon de spécifier les fichiers source dans CMake est de les lister explicitement .
Les créateurs de CMake eux-mêmes conseillent de ne pas utiliser de globbing.
Voir: https://cmake.org/cmake/help/v3.15/command/file.html?highlight=glob#file
(Nous ne recommandons pas d'utiliser GLOB pour collecter une liste de fichiers source à partir de votre arborescence source. Si aucun fichier CMakeLists.txt ne change lorsqu'une source est ajoutée ou supprimée, le système de construction généré ne peut pas savoir quand demander à CMake de se régénérer.)
Bien sûr, vous voudrez peut-être savoir quels sont les inconvénients - continuez à lire!
Quand Globbing échoue:
Le gros inconvénient du globbing est que la création / suppression de fichiers ne met pas automatiquement à jour le système de construction.
Si vous êtes la personne qui ajoute les fichiers, cela peut sembler un compromis acceptable, mais cela pose des problèmes pour les autres personnes qui construisent votre code, ils mettent à jour le projet à partir du contrôle de version, exécutent la version, puis vous contactent, se plaignant que
"la version cassé".
Pour aggraver les choses, l'échec donne généralement une erreur de liaison qui ne donne aucune indication sur la cause du problème et du temps est perdu pour le dépanner.
Dans un projet sur lequel j'ai travaillé, nous avons commencé le globbing, mais nous avons reçu tellement de plaintes lorsque de nouveaux fichiers ont été ajoutés, que c'était une raison suffisante pour lister explicitement les fichiers au lieu de globbing.
Cela rompt également les flux de travail git courants
( git bisect
et le basculement entre les branches de fonctionnalités).
Je ne peux donc pas recommander cela, les problèmes que cela pose l'emportent de loin sur la commodité, lorsque quelqu'un ne peut pas créer votre logiciel à cause de cela, il peut perdre beaucoup de temps pour trouver le problème ou simplement abandonner.
Et une autre note, se souvenir de toucher CMakeLists.txt
n'est pas toujours suffisant, avec des builds automatisés qui utilisent le globbing, je devais exécuter cmake
avant chaque build car des fichiers pouvaient avoir été ajoutés / supprimés depuis le dernier bâtiment *.
Exceptions à la règle:
Il y a des moments où le globbing est préférable:
- Pour configurer des
CMakeLists.txt
fichiers pour des projets existants qui n'utilisent pas CMake.
C'est un moyen rapide d'obtenir toutes les sources référencées (une fois que le système de construction est en cours d'exécution - remplacez le globbing par des listes de fichiers explicites).
- Lorsque CMake n'est pas utilisé comme système de construction principal , si par exemple vous utilisez un projet qui n'utilise pas CMake et que vous souhaitez maintenir votre propre système de construction pour cela.
- Pour toute situation où la liste de fichiers change si souvent qu'il devient impossible de la maintenir. Dans ce cas, cela pourrait être utile, mais vous devez accepter de courir
cmake
pour générer des fichiers de construction à chaque fois pour obtenir une construction fiable / correcte (ce qui va à l'encontre de l'intention de CMake - la possibilité de séparer la configuration de la construction) .
* Oui, j'aurais pu écrire un code pour comparer l'arborescence des fichiers sur le disque avant et après une mise à jour, mais ce n'est pas une solution de contournement si agréable et quelque chose de mieux laissé au système de construction.