j'ai une structure de répertoires suivante dans mon projet:Bonnes pratiques de Makefile
bin/
dist/
include/
├── module_a/
└── module_b/
Makefile
src/
├── module_a/
└── module_b/
dossier include/
contient *.hpp
's tandis que *.cpp
' s sont src/
. Je voudrais compiler toutes les sources à bin/
, puis les lier ensemble à . Semble un souhait assez raisonnable pour moi.
Je voudrais connaître les meilleures pratiques pour un Makefile pour ce cas. Tout ce que je peux trouver est %.o: %.cpp
cible, mais cela ne fonctionne pas vraiment, en raison de la source différente et le dossier binaire.
je tentais d'utiliser quelque chose comme ceci:
D_SRC = src
D_BIN=bin
F_CPP := $(shell find $(D_SRC) -iname '*.cpp' -type f)
F_OBJ := $(shell echo $(F_CPP) | sed s:\ :\\n:g | sed s:$(D_SRC):$(D_BIN): | sed 's:^\(.*\)\.cpp$$:\1\.o:')
$(F_OBJ): $(F_SRC)
$(foreach file, $(F_SRC), \
$(GXX) $(CXXFLAGS) -c $(file)\
)
Cet objectif ne fonctionne pas, car $(F_OBJ)
chemins commencent par bin/
, tandis que foreach
compile les sources de répertoire de travail courant. Je pourrais le faire compiler à bin/
, mais cela n'arriverait qu'avec quelques autres expressions sed
et c'est assez moche comme ça.
C'est probablement si difficile pour moi, parce que je ne connais pas très bien le make
, mais je ne peux pas être le seul avec cette configuration de projet. À mon avis, il doit être assez commun. Je sais que je peux écrire un Makefile
pour chaque module séparément, mais est-ce vraiment le meilleur choix ici?
EDIT: Je me demandais maintenant ce que j'allais obtenir avec plusieurs Makefiles. Si l'un était à la racine et l'autre au src/module_a
, comment ce dernier connaîtrait-il le bin/
? Si vous l'exécutez avec make -f src/module_a/Makefile
, ce serait comme si vous l'exécutiez à partir du répertoire racine, car son répertoire de travail serait root. Une autre façon, je suppose, serait de changer de répertoire avant de l'exécuter, comme ceci: make -C include/module_a
, mais dans ce cas, comment trouverait-il bin/
? Je ne voudrais pas avoir quelque chose comme D_BIN = ../../bin
dans un Makefile.
Mis à jour ma réponse ... –