Mam następującą strukturę katalogów w moim projekcie:Dobre praktyki Makefile
bin/
dist/
include/
├── module_a/
└── module_b/
Makefile
src/
├── module_a/
└── module_b/
Folder include/
zawiera *.hpp
's podczas *.cpp
' s są w src/
. Chciałbym skompilować wszystkie źródła do bin/
, a następnie połączyć je razem do dist/
. Wydaje mi się całkiem sensowne życzenie.
Chciałbym poznać najlepsze praktyki dla pliku Makefile dla tej sprawy. Wszystko, co mogę znaleźć, to cel %.o: %.cpp
, ale to nie działa, z powodu innego źródła i folderu binarnego.
starałem się używać mniej więcej tak:
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)\
)
Cel ten nie działa, ponieważ $(F_OBJ)
ścieżki zacząć bin/
, natomiast foreach
kompiluje źródeł do bieżącego katalogu roboczego. Mogę go skompilować do bin/
, ale stanie się tak tylko z kilkoma dodatkowymi wyrażeniami sed
i jest wystarczająco brzydki, jak jest.
To chyba dla mnie takie trudne, ponieważ nie znam dobrze tego, make
, ale nie mogę być jedynym z tym projektem. Moim zdaniem musi to być dość powszechna. Wiem, że mogę napisać Makefile
dla każdego modułu osobno, ale czy to naprawdę najlepszy wybór?
EDYCJA: Zastanawiam się teraz, co chciałbym osiągnąć dzięki kilku plikom Makefile. Jeśli jedna była u podstaw, a inna w src/module_a
, to w jaki sposób ta ostatnia wiedziała o bin/
? Jeśli zrobiłbyś to z make -f src/module_a/Makefile
, to byłby taki sam, jak wykonanie z katalogu głównego, ponieważ jego katalogiem roboczym będzie root. Innym sposobem, jak sądzę, byłoby zmienić katalog przed jego wykonaniem, tak jak: make -C include/module_a
, ale w takim przypadku, jak by to było znaleźć bin/
? Nie chciałbym mieć czegoś takiego jak D_BIN = ../../bin
w pliku Makefile.
Zaktualizowałem moją odpowiedź ... –