web-dev-qa-db-fra.com

Pourquoi le fichier cmake GLOB est-il mauvais?

Le doc CMake dit à propos de la commande fichier GLOB :

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 génération généré ne peut pas savoir quand demander à CMake de se régénérer.

Plusieurs fils de discussion sur le Web indiquent que la globalisation des fichiers source est mauvaise.

Cependant, pour faire savoir au système de construction qu'une source a été ajoutée ou supprimée, il suffit de dire

touch CMakeLists.txt

Droite?

C'est moins d'effort que d'éditer CMakeLists.txt pour insérer ou supprimer un nom de fichier source. Il n'est pas plus difficile de s'en souvenir. Je ne vois donc aucune bonne raison de déconseiller file GLOB.

Quel est le problème avec cet argument?

25
Joachim W

Le problème est lorsque vous n'êtes pas seul à travailler sur un projet.

Disons que le projet a le développeur A et B.

A ajoute un nouveau fichier source x.c. Il ne change pas CMakeLists.txt et valide une fois l'implémentation terminée x.c.

Maintenant, B fait un git pull, et comme aucune modification n'a été apportée à CMakeLists.txt, CMake n'est pas exécuté à nouveau et B provoque des erreurs de l'éditeur de liens lors de la compilation, car x.c n'a pas été ajouté à sa liste de fichiers source.

24

Ce n'est pas intrinsèquement mal - il a des avantages et des inconvénients, relativement bien couverts dans cette réponse ici sur StackOverflow. Mais si vous l'utilisez sans précaution, vous pourriez finir par ignorer les changements de dépendance et nécessiter des reconstructions propres de grandes parties de votre base de code.

Je suis personnellement en faveur de son utilisation - dans des projets plus petits, ou sur certains sous-répertoires dans les plus grands - pour éviter d'avoir à saisir manuellement chaque fichier dans les fichiers de construction. Edit: Ma préférence a changé et j'ai tendance à l'éviter.

4
einpoklum

En plus des raisons pour lesquelles d'autres personnes ont posté ici, le pire problème avec glob est qu'il peut produire des listes de fichiers différentes sur différentes plates-formes. Selon moi, c'est un bug. Dans OSX glob ignore la sensibilité à la casse et dans une boîte Ubuntu, il ne le fait pas.

2
Albino Cordeiro

Globbing rompt toutes les inspections de code dans des choses comme CLion qui autrement comprennent des sous-ensembles limités de CMakeLists.txt et ne prennent pas en charge et ne prendront jamais en charge la globalisation car elle n'est pas sûre.

Écrivez un script pour vider la liste globalisée et collez-la, c'est très simple, puis CLion peut réellement trouver les fichiers référencés et les déduire comme utiles. Peut-être même mettre un tel script dans l'arborescence pour que les autres développeurs puissent l'exécuter sans être un crétin OR set git hooks pour y arriver.

En aucun cas, un fichier aléatoire déposé dans un répertoire ne devrait être automatiquement lié, c'est ainsi que les chevaux de Troie se produisent.

Aussi CLion sans contexte sautant aux définitions connues et ce qui ne l'est pas, c'est comme marcher pieds nus /// pourquoi s'embêter.

1
Tony Butler