2009-04-07 8 views
8

J'apprends makefiles et je sais comment créer un simple makefile. Je passe aux makefiles imbriqués. Voici ma structure de répertoireCréation de makefile imbriqué

/src 
...makefile 
...main.cpp 
...foo 
......makefile 
......foo.cpp 
......foo.h 

Lorsque la racine makefile est appelée, elle appelle le makefile dans le répertoire foo. Voici mes questions

  1. qui makefile dois-je utiliser pour écrire du code pour lier tous les fichiers d'objet? Si c'est dans le makefile racine, dois-je spécifier tous les noms de fichiers d'objets là-bas?
  2. Est-ce que les makefiles imbriqués sont une bonne pratique? Ou est-ce bon d'avoir seulement un makefile qui est à la racine?

Toute aide serait géniale!

Répondre

15

Il y a beaucoup à dire pour et non. Lire Recursive Make Considered Harmful. Également au PDF form.

La version courte courte est que la création récursive génère efficacement plusieurs arbres de dépendances disjoints mais pouvant se chevaucher et ne peut garantir une construction correcte ou au maximum efficace. Le problème s'aggrave si vous espérez construire en parallèle.

Pour résoudre le problème, vous disposez d'une marque unique, non récursive, qui génère un seul arbre de dépendances qui permet de résoudre tous les problèmes ci-dessus.

structures Exemple pour faire non récursive et des solutions aux divers problèmes épineux qui surgissent dans leur écriture se trouvent dans le document original et dans les réponses à:

+1

Si ne pas le faire est une mauvaise idée, peut-être une solution alternative devrait être suggérée comme réponse. – deadalnix

+1

Ouais. Cette réponse est sous une forme qui n'est plus acceptable sur le site. Les modifications ne réparent que partiellement la déficience, mais c'est quelque chose. – dmckee

3

La fabrication récursive est généralement considérée comme dangereuse.

Si vous voulez vraiment pouvoir taper "make" dans le répertoire racine et le faire tout construire en utilisant seulement des makefiles POSIX, c'est le seul moyen. Dans ce cas, liez les sous-projets dans leur propre répertoire, et les éléments finaux ensemble dans root.

Si vous êtes prêt à utiliser la syntaxe gmake, jetez un oeil au Makefile ici: http://github.com/singpolyma/theveeb-ecosystem

+1

Vous pouvez utiliser une marque POSIX (non-GNU) pour effectuer une construction non récursive en la décomposant en deux étapes: 1) concaténer tous les fichiers make.inc de tous les sous-répertoires; 2) exécutez le fichier Make résultant. Mais la plupart des gens utilisent GNU make, qui a la directive "include". –

+0

Ah, c'est vrai, je n'ai jamais pensé au hack de concaténation. J'ai tendance à utiliser include. Normalement je veux être très POSIX, mais avec makefiles c'est parfois un peu poilu à cause de la directive no include :) – singpolyma

0

Il existe des systèmes de construction les plus modernes comme SCons qui ont une syntaxe plus facile que faire et éviter de nombreux écueils de faire. Par exemple, SCons analyse les fichiers sources pour déterminer les dépendances par rapport à lui-même, tandis que pour make, il faut spécifier les dépendances manuellement. Si par exemple vous ajouter une nouvelle instruction #include à un fichier d'implémentation make ne recompilera pas ce fichier d'implémentation si l'en-tête change (sauf si vous ajoutez la nouvelle dépendance). SCons détectera automatiquement la nouvelle dépendance et recompilera tout ce qui est nécessaire.