Les Makefiles avec la source des fichiers dans des répertoires différents
J'ai un projet où la structure de répertoire est comme ceci:
$projectroot
|
+---------------+----------------+
| | |
part1/ part2/ part3/
| | |
+------+-----+ +---+----+ +---+-----+
| | | | | | |
data/ src/ inc/ src/ inc/ src/ inc/
Comment devrais-je écrire un makefile qui serait en partie/src (ou partout où vraiment) qui pourrait comple/lien sur le c/c++ source des fichiers dans la partie?/src ?
Puis-je faire quelque chose comme
-I$projectroot/part1/src -I$projectroot/part1/inc -I$projectroot/part2/src ...
Si cela allait fonctionner, est-il un moyen plus facile de le faire. J'ai vu les projets où il y a un makefile dans chaque de la partie correspondante? des dossiers. [dans ce post, j'ai utilisé le point d'interrogation, comme dans la syntaxe bash]
- stackoverflow.com/questions/7123431/...
- Dans l'original de la gnu manuel ( gnu.org/software/make/manual/html_node/Phony-Targets.html ) en vertu de Faux Objectifs, il est un exemple sur
recursive invocation
, que la coulée être assez élégant. - Quel outil avez-vous utilisés pour créer cette illustration du texte?
Vous devez vous connecter pour publier un commentaire.
La manière traditionnelle est d'avoir un
Makefile
dans chacun des sous-répertoires (part1
,part2
, etc.) vous permettant de construire de manière indépendante. De plus, avoir unMakefile
dans le répertoire racine du projet, qui s'appuie tout. La "racine" deMakefile
ressemblerait à quelque chose comme ce qui suit:Depuis chaque ligne dans une cible est exécuté dans sa propre coquille, il n'y a pas besoin de s'inquiéter à propos de la traversée de sauvegarder l'arborescence de répertoires ou d'autres répertoires.
Je suggère de prendre un coup d'oeil à la GNU make manuel de la section 5.7; il est très utile.
+$(MAKE) -C part1
etc. Cela permet de Faire du travail de contrôle dans les sous-répertoires.Si vous disposez d'un code dans un sous-répertoire dépend de code dans un autre sous-répertoire, vous êtes probablement mieux avec un seul fichier makefile à haut-niveau.
Voir Version Récursive Considéré Comme Nocif pour la logique, mais, fondamentalement, vous voulez faire de toute information dont il a besoin pour décider si oui ou non un fichier doit être reconstruit, et il n'aura pas que si vous ne le dire environ un tiers de votre projet.
Le lien ci-dessus ne semble pas être accessible. Le même document est accessible ici:
La VPATH option pourrait venir dans maniable, qui dit de faire ce que les répertoires de regarder dans le code source. Vous auriez encore besoin d'une option-I pour chaque chemin, cependant. Un exemple:
Cela va automatiquement trouver la correspondance partXapi.cpp fichiers dans l'un des VPATH les répertoires spécifiés et les compiler. Cependant, c'est plus utile lorsque votre répertoire src est décomposé en sous-répertoires. Pour ce que vous décrivez, comme d'autres l'ont dit, vous êtes probablement mieux avec un makefile pour chaque partie, en particulier si chaque partie de manière autonome.
VPATH=..
a fonctionné pour moi!Vous pouvez ajouter des règles à la racine de votre Makefile pour compiler le nécessaire fichiers cpp dans d'autres répertoires. Le Makefile exemple ci-dessous devrait être un bon début pour vous de l'endroit où vous voulez être.
Si les sources sont réparties dans de nombreux dossiers, et il est logique de se Makefiles puis comme suggéré précédemment, version récursive est une bonne approche, mais pour les petits projets que je trouve plus facile de la liste de tous les fichiers source dans le Makefile avec leur chemin d'accès relatif à la Makefile comme ceci:
Je pouvez ensuite définir
VPATH
de cette façon:Puis-je construire les objets:
Maintenant, la règle est simple:
Et la construction de la sortie est encore plus facile:
On peut même faire de la
VPATH
génération automatisée par:Ou en utilisant le fait que
sort
supprime les doublons (même s'il ne devrait pas d'importance):Je pense que c'est mieux de souligner que l'utilisation Faire (récursif ou non) est quelque chose qui, généralement, vous voudrez peut-être éviter, parce que par rapport à aujourd'hui, les outils, il est difficile d'apprendre, de maintenir et d'échelle.
C'est un merveilleux outil, mais c'est l'utilisation directe doit être considérée comme obsolète en 2010+.
À moins, bien sûr, vous travaillez dans un environnement spécial, c'est à dire avec un projet de l'héritage etc.
Utiliser un IDE, CMake ou, si vous êtes integrés, le Autotools.
(modifié en raison de l'downvotes, ty Honza pour souligner)
RC post a été SUPER utile. Je n'ai jamais pensé à utiliser le $($dir@) de la fonction, mais il a fait exactement ce dont j'avais besoin qu'il fasse.
Dans parentDir, ont un tas de répertoires avec les fichiers source en eux: dirA, dirB, dirC. Divers fichiers dépendent de l'objet des fichiers dans d'autres répertoires, si je voulais être en mesure de faire un fichier dans un répertoire, et l'avoir de cette dépendance en appelant le makefile associés à cette dépendance.
Essentiellement, j'ai fait un Makefile dans parentDir qui avait (entre autres choses) un générique règle analogue à celle de RC:
Chaque sous-répertoire inclus ce niveau supérieur makefile afin d'hériter de ce générique de la règle. Dans chaque sous-répertoire du Makefile, j'ai écrit une règle personnalisée pour chaque fichier afin que je puisse garder une trace de tout ce que chaque fichier en dépendait.
Chaque fois que je besoin de créer un fichier, j'ai utilisé (pour l'essentiel) de la présente règle récursive de faire tout/toutes les dépendances. Parfait!
REMARQUE: il y a un utilitaire appelé "makepp" qui semble faire de cette tâche encore plus intuitive, mais pour des raisons de portabilité et non pas en fonction d'un autre outil, j'ai choisi de faire de cette façon.
Espérons que cette aide!
Récursive Utilisation de Faire
Cela permet
make
à se diviser en emplois et l'utilisation de plusieurs cœursmake -j4
?make
pour utiliser le contrôle du travail à tous. Lors de l'exécution de processus distinct de faire, il n'est pas soumis au contrôle du travail.Je cherchais quelque chose comme ça, et après quelques tentatives, et tombe, je créer mon propre makefile, je sais que ce n'est pas le "idiomatiques façon", mais c'est un début pour comprendre faire et cela fonctionne pour moi, peut-être que vous pouvez essayer dans votre projet.
Je sais que c'est simple et pour certaines personnes, mon indicateurs sont mauvais, mais comme je l'ai dit c'est mon premier Makefile pour compiler mon projet dans plusieurs répertoires et les relier tous ensemble à la création de mon bac.
Je suis accepter les suggestions 😀
Je suggère l'utilisation de
autotools
://##
Place généré les fichiers objets (.o) dans le même répertoire que leurs fichiers source, afin d'éviter les collisions lors de la non-récursive est utilisée.juste, y compris dans
Makefile.am
avec l'autre tout à fait simple.Ici est la tutoriel.