187 votes

Meilleure façon de spécifier les fichiers source dans Cmake

Dans Cmake, il existe plusieurs façons de spécifier les fichiers source pour une cible. La première consiste à utiliser globbing, par exemple:

 FILE (GLOB dir/*)
 

Une autre consiste à spécifier chaque fichier individuellement, et je suppose qu'il y a encore plus de façons de le faire.

Quel est le meilleur chemin? Best as in présente plus d'avantages que d'inconvénients.

Globbing semble facile, mais j'ai entendu dire qu'il a quelques inconvénients. Je ne me souviens plus lequel.

217voto

richq Points 29694

La divulgation complète: je préfère l'expansion de l'approche.

Les avantages d'expansion sont:

  • Il est facile d'ajouter de nouveaux fichiers à l' ne sont répertoriés dans un seul endroit: sur de disque. Pas d'expansion crée la duplication.

  • Votre CMakeLists.txt le fichier sera plus court. C'est un gros plus si vous le grand nombre de fichiers. Pas d'expansion vous fait perdre la logique de CMake parmi les grandes listes de fichiers.

Les avantages de l'utilisation codé en dur listes de fichiers sont:

  • CMake permettra de suivre les dépendances d'un nouveau fichier sur le disque correctement - si nous utilisons glob puis fichiers pas globbed la première fois lors de l'exécution de CMake n'obtiendrez pas ramassé

  • Vous assurer que seuls les fichiers que vous souhaitez sont ajoutés. D'expansion peut ramasser errants les fichiers que vous ne souhaitez pas.

Afin de contourner la première question, vous pouvez simplement "toucher" les CMakeLists.txt qui ne le glob, soit à l'aide de la touche de commande ou en écrivant le fichier sans aucune modification. Ce sera la force de cmake pour ré-exécuter et sélectionner le nouveau fichier.

Pour résoudre le deuxième problème, vous pouvez organiser votre code avec soin dans des répertoires, ce qui est probablement le faire de toute façon. Dans le pire des cas, vous pouvez utiliser la liste(REMOVE_ITEM) de commande pour nettoyer la globbed liste des fichiers:

file(GLOB to_remove file_to_remove.cpp)
list(REMOVE_ITEM list ${to_remove})

La seule vraie situation où cela peut vous mordre si vous utilisez quelque chose comme git-traversent, pour essayer d'anciennes versions de votre code dans le même répertoire build. Dans ce cas, vous pouvez avoir à nettoyer et à compiler plus que nécessaire pour vous assurer d'obtenir les bons fichiers dans la liste. C'est un coin de cas, et un autre où vous êtes déjà sur vos orteils, qu'il n'est pas vraiment un problème.

133voto

ideasman42 Points 1682

La meilleure façon de spécifier sourcefiles dans CMake est en les inscrivant explicitement.

Les créateurs de CMake eux-mêmes conseillent de ne pas utiliser d'expansion.

Voir: http://www.cmake.org/cmake/help/v2.8.10/cmake.html#command:file

(Nous ne recommandons pas d'utiliser GLOB pour collecter une liste de fichiers source de votre arborescence des sources. Si aucun CMakeLists.txt les modifications du fichier lorsqu'une source est ajouté ou supprimé, l'généré système de construction ne peut pas savoir quand demander de CMake pour se régénérer.)

Le gros désavantage de l'expansion est de créer de nouveaux fichiers ne sont pas automatiquement mise à jour de la construction du système.

Si vous êtes la personne à ajouter les fichiers, ce qui peut sembler un compromis acceptable, la question principale qui se passe lorsque d'autres personnes sont la construction de votre code, ils mettent à jour la le projet de contrôle de version, exécutez construire, avec vous, pour se plaindre que l'échec de la construction.

Pour aggraver les choses, l'échec typiquement donne une erreur de couplage qui ne donnent pas toutes les allusions à la cause du problème et le temps est perdu de dépannage.

Dans un projet, j'ai travaillé sur, nous avons commencé d'expansion, mais il a obtenu suffisamment de plaintes lorsque de nouveaux fichiers ont été ajoutés, que c'était une raison suffisante pour éloigner d'expansion.

Donc, je ne peux que recommander ce, les problèmes qu'elle provoque l'emportent de loin sur la commodité, lorsque quelqu'un ne peut pas construire votre logiciel de ce fait, ils risquent de perdre beaucoup de temps à traquer la question ou tout simplement abandonner.

Et une autre remarque, Juste se souvenir de toucher CMakeLists.txt n'est pas toujours suffisant, avec automatisation des builds je le programme d'installation lors de l'utilisation d'expansion, j'ai dû lancer cmake avant chaque génération depuis les fichiers peuvent avoir été ajoutés/supprimés depuis la dernière bâtiment *.

La seule fois où je recommanderais d'expansion est...

  • Pour la mise en place d'un CMakeLists.txt fichiers pour les projets existants qui ne sont pas utiliser CMake son d'un moyen rapide pour obtenir tous les source référencée rapidement (puis développez l'expansion dans les listes de fichiers lors de la construction du système est en place et en cours d'exécution).
  • Pour toute situation où la liste des fichiers change tellement souvent qu'il devient impossible à maintenir. Dans ce cas, il pourrait être utile, mais alors vous devez accepter l'exécution cmake à chaque fois pour obtenir un fiable/corriger construire (ce qui va à l'encontre de l'intention de CMake - la capacité de séparer la configuration de la construction).

* Oui, je pourrais avoir écrit un code de comparer l'arborescence des fichiers sur le disque avant et après une mise à jour, mais ce n'est pas une solution de contournement de nice et quelque chose de mieux à gauche jusqu'à la construction du système.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X