ho una struttura di directory seguente nel mio progetto:buone pratiche di Makefile
bin/
dist/
include/
├── module_a/
└── module_b/
Makefile
src/
├── module_a/
└── module_b/
cartella include/
contiene *.hpp
's mentre *.cpp
' s sono in src/
. Vorrei compilare tutte le fonti a bin/
e quindi collegarle insieme a dist/
. Sembra un desiderio abbastanza ragionevole per me.
Mi piacerebbe conoscere le migliori pratiche per un Makefile per questo caso. Tutto quello che posso trovare è il target %.o: %.cpp
, ma questo non funziona, a causa della diversa cartella sorgente e binaria.
stavo cercando di usare qualcosa di simile:
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)\
)
Questo obiettivo non funziona, perché $(F_OBJ)
percorsi iniziano con bin/
, mentre foreach
compila fonti al corrente dir lavorare. Potrei farlo compilare a bin/
, ma ciò accadrebbe solo con alcune altre espressioni sed
ed è abbastanza brutto com'è.
Probabilmente è così difficile per me, perché non conosco lo make
tutto bene, ma non posso essere l'unico con questa configurazione di progetto. Secondo me, deve essere piuttosto comune. So che posso scrivere uno Makefile
separatamente per ogni modulo, ma è davvero la scelta migliore qui?
EDIT: Ora mi chiedevo cosa avrei ottenuto con diversi Makefile. Se uno era alla radice e un altro in src/module_a
, come avrebbe saputo quest'ultimo sullo bin/
? Se lo si eseguisse con make -f src/module_a/Makefile
, sarebbe come eseguirlo dalla directory principale, perché la directory di lavoro sarebbe root. Un altro modo, immagino, sarebbe quello di cambiare directory prima di eseguirlo, in questo modo: make -C include/module_a
, ma in tal caso, come troverà bin/
? Non vorrei avere qualcosa come D_BIN = ../../bin
in un Makefile.
Aggiornato la mia risposta ... –