GCC dépendance génération pour un autre répertoire de sortie
Je suis en utilisant GCC de générer un fichier de dépendance, mais mon élaborer des règles de mettre la sortie dans un sous-répertoire. Est-il un moyen de demander à GCC de mettre mon préfixe de sous-répertoire dans le fichier de dépendance qu'il génère pour moi?
gcc $(INCLUDES) -E -MM $(CFLAGS) $(SRC) >>$(DEP)
Vous devez vous connecter pour publier un commentaire.
La réponse est dans la Manuel de GCC: utiliser le
-MT
drapeau.-MT
n'est pas disponible pour mon gcc 2.9.5, invité devrait être disponible 3.x.x au-dessus de-MT
de soutien. 🙁Je suis en supposant que vous êtes à l'aide de GNU Make et GCC. Tout d'abord ajouter une variable pour contenir la liste de vos fichiers de dépendance. En supposant que vous avez déjà un qui répertorie l'ensemble de nos sources:
Alors inclure les dépendances générées dans le fichier makefile:
Puis ajouter ce modèle à la règle:
"$@" est la cible (le truc sur le côté gauche de l' : ), "$<" est la condition préalable (le truc sur le côté droit de l' : ). L'expression "$(<:.c=.o)" remplace le .c extension avec la .o.
L'astuce ici est de générer la règle avec deux objectifs par l'ajout d'-MT à deux reprises, ce qui en fait à la fois l' .o fichier et le .d fichier dépend de la source du fichier et de ses en-têtes, de cette façon, le fichier de dépendance est automatiquement régénéré à chaque fois que le correspondant .c ou .h fichiers sont modifiés.
La MG et MP options de garder de faire de paniquer si un en-tête de fichier est manquant.
Vous aimerez cette version plus courte de Ne McCaughey réponse:
DEPS = $(SRCS:.c=.d)
Ajouter
-include $(DEPS)
note le-
préfixe, qui fait taire les erreurs si le.d
fichiers n'existent pas encore.Il n'y a pas besoin d'un autre modèle de règle pour générer les fichiers de dépendance. Ajoutez simplement
-MD
ou-MMD
à la normale de votre ligne de la compilation, et le.d
les fichiers sont générés dans le même temps, votre source, les fichiers sont compilés. Par exemple:De détails sur DGentry réponse, ce qui a bien fonctionné pour moi:
Cela fonctionne aussi dans le cas où il y a seulement un fichier de dépendance qui contient les règles de dépendances pour tous les fichiers source.
Ok, juste pour s'assurer que j'ai le droit de la question: je suis en supposant que vous avez
test.c
qui comprendtest.h
, et vous voulez générersubdir/test.d
(alors que pas générersubdir/test.o
) oùsubdir/test.d
contientplutôt que
qui est ce que vous obtenez dès maintenant. Est ce que le droit?
Je n'étais pas en mesure de venir avec un moyen facile de faire exactement ce que vous demandez. Cependant, en regardant La Dépendance De La Génération Des Améliorations, si vous souhaitez créer le
.d
fichier alors que vous générer l' .o fichier, vous pouvez utiliser:(Donnée
SRC=test.c
,SUBDIR=subdir
, etOBJ=test.o
.) Cela va créer deux subdir/test.o et subdir/test.d, oùsubdir/test.d
contient la sortie désirée comme ci-dessus.Si il y a un argument de GCC pour ce faire, je ne sais pas ce que c'est. Nous finissons la tuyauterie de la dépendance de sortie à travers la sed à réécrire toutes les occurrences de
<blah>.o
comme${OBJDIR}/<blah>.o
.[GNU] s'obtient en colère si vous ne placez pas la sortie dans le répertoire courant. Vous devriez vraiment se faire à partir du répertoire de construction, et d'utiliser le VPATH rendre variable de trouver le code source. Si vous mentez à un compilateur, tôt ou tard, il va prendre sa revanche.
Si vous insistez sur la production de vos objets et dépendances dans un autre répertoire, vous devez utiliser le
-o
argument, comme répondu par Emile.