J'ai un projet où la structure du répertoire est comme ceci:
$projectroot
|
+---------------+----------------+
| | |
part1/ part2/ part3/
| | |
+------+-----+ +---+----+ +---+-----+
| | | | | | |
data/ src/ inc/ src/ inc/ src/ inc/
Comment dois-je écrire un makefile qui serait dans la partie / src (ou n'importe où vraiment) qui pourrait compléter / lien sur les fichiers source c / c ++ en partie? / Src?
Puis-je faire quelque chose comme -I $ projectroot / part1 / src -I $ projectroot / part1 / inc -I $ projectroot / part2 / src ...
Si cela fonctionne, y a-t-il un moyen plus simple de le faire. J'ai vu des projets où il y a un makefile dans chacune des parties correspondantes? Dossiers. [dans cet article, j'ai utilisé le point d'interrogation comme dans la syntaxe bash]
recursive invocation
, qui peut être assez élégant.Réponses:
La manière traditionnelle est d'avoir un
Makefile
dans chacun des sous - répertoires (part1
,part2
, etc.) vous permettant de les construire de manière indépendante. De plus, ayez unMakefile
dans le répertoire racine du projet qui construit tout. La "racine"Makefile
ressemblerait à ceci:Puisque chaque ligne dans une cible de création est exécutée dans son propre shell, il n'y a pas besoin de s'inquiéter de la remontée de l'arborescence de répertoires ou vers d'autres répertoires.
Je suggère de jeter un œil à la section 5.7 du manuel de création de GNU ; c'est très utile.
la source
+$(MAKE) -C part1
etc. Cela permet au contrôle des tâches de Make de fonctionner dans les sous-répertoires.Si vous avez du code dans un sous-répertoire dépendant du code dans un autre sous-répertoire, vous êtes probablement mieux avec un seul makefile au niveau supérieur.
Voir Récursif Rendre considéré comme nocif pour la justification complète, mais en gros, vous voulez faire en sorte d'avoir toutes les informations dont il a besoin pour décider si un fichier doit être reconstruit ou non, et il ne l'aura pas si vous lui dites seulement environ un tiers de votre projet.
Le lien ci-dessus ne semble pas accessible. Le même document est accessible ici:
la source
L'option VPATH peut s'avérer utile, car elle indique à make quels répertoires rechercher le code source. Cependant, vous aurez toujours besoin d'une option -I pour chaque chemin d'inclusion. Un exemple:
Cela trouvera automatiquement les fichiers partXapi.cpp correspondants dans l'un des répertoires spécifiés par VPATH et les compilera. Cependant, cela est plus utile lorsque votre répertoire src est divisé 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, surtout si chaque partie peut être autonome.
la source
VPATH=..
fonctionné pour moi!Vous pouvez ajouter des règles à votre Makefile racine afin de compiler les fichiers cpp nécessaires dans d'autres répertoires. L'exemple Makefile ci-dessous devrait être un bon début pour vous amener là où vous voulez être.
la source
Si les sources sont réparties dans de nombreux dossiers et qu'il est logique d'avoir des Makefiles individuels, comme suggéré précédemment, la création récursive est une bonne approche, mais pour les petits projets, je trouve plus facile de lister tous les fichiers source dans le Makefile avec leur chemin relatif au Makefile comme ceci:
Je peux ensuite définir de
VPATH
cette façon:Ensuite, je construis les objets:
Maintenant, la règle est simple:
Et la création de la sortie est encore plus facile:
On peut même
VPATH
automatiser la génération en:Ou en utilisant le fait qui
sort
supprime les doublons (bien que cela ne devrait pas avoir d'importance):la source
Je pense qu'il est préférable de souligner que l'utilisation de Make (récursif ou non) est quelque chose que vous voudrez peut-être généralement éviter, car par rapport aux outils d'aujourd'hui, il est difficile à apprendre, à maintenir et à faire évoluer.
C'est un outil merveilleux mais son utilisation directe devrait être considérée comme obsolète en 2010+.
Sauf si, bien sûr, vous travaillez dans un environnement spécial, c'est-à-dire avec un projet hérité, etc.
Utilisez un IDE, CMake ou, si vous êtes un noyau dur, les Autotools .
(édité en raison de votes négatifs, ty Honza pour le souligner)
la source
Le message de RC a été SUPER utile. Je n'ai jamais pensé à utiliser la fonction $ (dir $ @), mais elle a fait exactement ce dont j'avais besoin.
Dans parentDir, ayez un tas de répertoires contenant des fichiers source: dirA, dirB, dirC. Différents fichiers dépendent des fichiers objet dans d'autres répertoires, donc je voulais pouvoir créer un fichier à partir d'un répertoire et le faire créer cette dépendance en appelant le makefile associé à cette dépendance.
Essentiellement, j'ai créé un Makefile dans parentDir qui avait (parmi beaucoup d'autres choses) une règle générique similaire à celle de RC:
Chaque sous-répertoire incluait ce makefile de niveau supérieur afin d'hériter de cette règle générique. Dans le Makefile de chaque sous-répertoire, j'ai écrit une règle personnalisée pour chaque fichier afin de pouvoir garder une trace de tout ce dont chaque fichier individuel dépendait.
Chaque fois que j'avais besoin de créer un fichier, j'utilisais (essentiellement) cette règle pour créer de manière récursive toutes les dépendances. Parfait!
NOTE: il y a un utilitaire appelé "makepp" qui semble faire cette tâche même de manière encore plus intuitive, mais pour des raisons de portabilité et ne dépendant pas d'un autre outil, j'ai choisi de le faire de cette façon.
J'espère que cela t'aides!
la source
Utilisation récursive de Make
Cela permet de
make
se diviser en travaux et d'utiliser plusieurs cœursla source
make -j4
?make
d'utiliser le contrôle des tâches. Lors de l'exécution d'un processus de fabrication distinct, il n'est pas soumis au contrôle des travaux.Je cherchais quelque chose comme ça et après quelques essais et chutes je crée mon propre makefile, je sais que ce n'est pas la "manière idiomatique" mais c'est un début pour comprendre make et ça marche pour moi, peut-être que tu pourrais essayer dans ton projet.
Je sais que c'est simple et pour certaines personnes, mes indicateurs sont faux, mais comme je l'ai dit, c'est mon premier Makefile à compiler mon projet dans plusieurs répertoires et à lier le tout ensemble pour créer mon bac.
J'accepte les suggestions: D
la source
Je suggère d'utiliser
autotools
://##
Placez les fichiers objets générés (.o) dans le même répertoire que leurs fichiers source, afin d'éviter les collisions lorsque make non récursif est utilisé.juste l'inclure dans
Makefile.am
les autres trucs assez simples.Voici le tutoriel .
la source