IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Systèmes de compilation Discussion :

CMake : comment bien lister les sources ?


Sujet :

Systèmes de compilation

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut CMake : comment bien lister les sources ?
    Bonjour,

    Je viens de passer 2 semaines à prendre en main cmake. Après pas mal d'efforts, je suis capable de générer deux makefiles : un pour mon simulateur, un pour mon exécutable pour MCU. Tout est scriptable et c'est impeccable pour atteindre mon objectif d'automatiser les builds avec Jenkins. C'est cool.

    Je réfléchis maintenant à comment cela va être utiliser au jour le jour par les développeurs et je viens de me prendre un mur : c'est le bazar pour ajouter un nouveau fichier cpp au projet. C'est pas cool du tout.

    Comme je l'ai expliqué dans une discussion précédente, je génère des sources à partir de ressources lors de l'appel à cmake. Enfin, j'utilise des file(GLOB[_RECURSE] ...) pour lister mes fichiers sources (celles générées et les autres). Comme je fais du globbing pour récupérer mes fichiers sources, je suis obligé de ré-exécuter cmake à chaque fois que je créé un nouveau fichier cpp. Comme je ré-éxecute cmake, je re-génère mes sources à partir des ressources. Comme ces sources contiennent des hpp inclus dans d'autres fichiers, je me retrouve à recompiler énormément de fichiers à chaque fois je créé un nouveau fichier cpp, en plus de devoir rappeler cmake à la main.

    J'ai lu plusieurs discussions stackoverflow disant qu'il ne faudrait pas faire de globbing et lister manuellement les sources. Ainsi, quand on créé un fichier cpp, on doit donc le rajouter dans le CMakeLists.txt. Au-delà des emmerdes pour lister manuellement mes fichiers actuels, je trouve ça bien relou de devoir éditer CMakeLists.txt à chaque que je vais créer un fichier cpp ou hpp. Cela va ré-évaluer le build system, je pense qu'en plus ça va re-générer mes sources et donc je tombe dans le même problème qu'au-dessus... Enfin, quand le projet fera des centaines de fichiers, j'imagine même pas le gueule du fichier CMakeLists.txt

    D'un seul coup, je suis bien moins convaincu par cmake...

    Comment listez-vous vos sources ?

    Merci d'avance pour vos retours d'expérience

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    Tu touches un problème pour lequel il n'existe pas de solutions "canonique". Changer le chaîne de build n'y changera pas grand chose, aucune n'offre réellement de services de ce type. Le gros souci du GLOB de cmake est qu'il nécessite effectivement de devoir ré-exécuter l'initialisation du build. Donc je serais aussi d'avis de ne pas utiliser GLOB non plus. Mais comment faire alors pour que ça reste pratique ? Quelques pistes tirées de mon expérience perso.

    Première chose : générer les fichiers out of source pour garantir que le code généré soit séparé du code écrit manuellement. Cela a de multiples avantages : pas de risque de pollution du système de versioning avec des fichiers générés, "clean" beaucoup plus facile à écrire (il suffit de supprimer le répertoire de build), maîtrise du contexte de compilation sur le code généré et du code écrit.

    Deuxième chose : Ne pas utiliser GLOB pour le code écrit manuellement. Devoir modifier le CMakeLists.txt pour ajouter une unité de compilation n'est pas gênant, au contraire, je trouve que c'est une très bonne pratique. Ajouter une unité de compilation n'est pas anodin et son contexte de compilation doit être maîtrisé. A ce titre, ça ne fait pas de mal si le développeur fait l'effort d'ajouter une ligne. Mais surtout, ça a un avantage majeur sur le GLOB : si le code est bien séparé du code généré, il n'y a pas besoin d'exécuter CMake en entier pour prendre en compte le changement. Un simple rebuild_cache fonctionnera, sans avoir à appeler toute la partie génératrice. Et il se lance même tout seul si tu essayes de compiler une target existante. Seul l'ajout de target nécessite un rebuild_cache explicite.

    Troisième chose : Si tu redoutes les listings de fichiers trop longs, alors casse ton CMaleLists.txt en plusieurs avec des include ou des add_subdirectory. De ce que je comprend de ton projet, il est assez gros avec potentiellement du monde dessus. Cela signifie qu'il va falloir imposer une discipline et un certain nombre de conventions. La structure à adopter dans les CMakeLists de listing en fait partie.
    Find me on github

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Les concepteurs de CMake eux-même recommandent de ne pas utiliser glob. Et pour cette raison précise.
    En fait, glob est un bon outil pour un programme terminé.

    Ce n'est pas du tout adapté pour un programme en cours de développement.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Salut !

    J'avais lu vos réponses en fin de semaine dernière mais je n'avais pas eu le temps de répondre ^^

    Citation Envoyé par jblecanard
    Le gros souci du GLOB de cmake est qu'il nécessite effectivement de devoir ré-exécuter l'initialisation du build. Donc je serais aussi d'avis de ne pas utiliser GLOB non plus.
    [...]
    Devoir modifier le CMakeLists.txt pour ajouter une unité de compilation n'est pas gênant, au contraire, je trouve que c'est une très bonne pratique.
    Citation Envoyé par ter nel
    Les concepteurs de CMake eux-même recommandent de ne pas utiliser glob. Et pour cette raison précise.
    J'ai bien vu que GLOB était déconseillé justement pour ces raisons. En tant que tel, je ne suis pas fan de devoir rajouter manuellement ton fichier. J'ai bossé ces dernières années avec Java/Eclipse et j'ai justement apprécié cette simplicité : tu crées une classe, ça te crée le fichier au bon endroit (limite tu ne sais pas où) et il est automatiquement utilisé. En parallèle de ces développements Java, j'ai fait des développements C avec plusieurs IDE : IAR Embedded Workbench, Keil µVision et Eclipse CDT. Et j'ai retrouvé dans Eclipse CTD la simplicité du Java : tu crées ton fichier au bon endroit dans ta hiérarchie de dossiers et le builder du CDT l'ajoute automatiquement au build. Quand le projet devient stable, je trouverai ça peut déranger de lister manuellement les fichiers : on en ajoute peu souvent. En revanche, en début de projet, tu en ajoutes souvent... Et comme je souhaite présenter le process de build le plus simple possible à mes collègues, ça ne va pas le faire.

    Soit dit en passant, j'ai regardé plusieurs projets a priori de qualité sur Github et plusieurs utilisent GLOB, y compris des petits projets comme https://github.com/electronicarts/EASTL. Donc c'est pas la meilleure solution mais tu n'es pas un vaut-rien que tout le monde va montrer si tu le fais

    En revanche, j'avais découvert la target rebuild_cache avant de lire vos réponses et elle semble être la solution à mon problème :

    Citation Envoyé par http://www.macesystems.org/wiki/documentation:installation
    rebuild_cache (make rebuild_cache) re-runs cmake to regenerate the build system.
    Citation Envoyé par https://cmake.org/runningcmake/
    rebuild_cache – This target runs cmake on the source tree and picks up additional cache entries if they exist.
    J'ai testé et cela ré-évaluer bien les GLOB. J'ai donc modifié mon fichier CMakeLists.txt pour ne générer les fichiers sources que s'ils n'existent pas. Quand j'ajoute un fichier, j'exécute la cible rebuild_cache et le nouveau fichier est pris en compte. Enfin, j'ai rajouté une cible force_generate_resources au nom explicite, qui me sert quand j'ajoute de nouvelles ressources (j'avais déjà une cible pour re-générer le code si les ressources existantes avaient changées).

    Au final, c'est pas totalement parfait mais c'est satisfaisant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Include/Require] Comment bien gérer les chemins ?
    Par Wookai dans le forum Langage
    Réponses: 1
    Dernier message: 11/04/2007, 09h11
  2. Comment bien gérer les utilisateurs multiples
    Par Vesta dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/06/2006, 08h48
  3. [JDesktopPane] Comment bien gérer les JInternalFrame ?
    Par calogerogigante dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 05/04/2006, 12h45
  4. [MFC]Lister les sources de données ODBC
    Par Cédric_07 dans le forum MFC
    Réponses: 11
    Dernier message: 23/03/2006, 11h20
  5. comment lister les sources de données utilisateur
    Par lassad dans le forum Bases de données
    Réponses: 1
    Dernier message: 12/10/2005, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo