Cara tradisional adalah memiliki Makefile
di setiap subdirektori (part1
, part2
, dll.) memungkinkan Anda membuatnya secara mandiri. Selanjutnya, miliki Makefile
di direktori root proyek yang membangun segalanya. "Akar" Makefile
akan terlihat seperti berikut:
all:
+$(MAKE) -C part1
+$(MAKE) -C part2
+$(MAKE) -C part3
Karena setiap baris dalam make target dijalankan dalam cangkangnya sendiri, tidak perlu khawatir untuk menelusuri kembali pohon direktori atau ke direktori lain.
Saya sarankan untuk melihat manual make GNU bagian 5.7; ini sangat membantu.
Anda dapat menambahkan aturan ke Makefile root Anda untuk mengkompilasi file cpp yang diperlukan di direktori lain. Contoh Makefile di bawah harus menjadi awal yang baik untuk membawa Anda ke tempat yang Anda inginkan.
CC=g++ TARGET=cppTest OTHERDIR=../../someotherpath/in/project/src SOURCE = cppTest.cpp SOURCE = $(OTHERDIR)/file.cpp ## End sources definition INCLUDE = -I./ $(AN_INCLUDE_DIR) INCLUDE = -I.$(OTHERDIR)/../inc ## end more includes VPATH=$(OTHERDIR) OBJ=$(join $(addsuffix ../obj/, $(dir $(SOURCE))), $(notdir $(SOURCE:.cpp=.o))) ## Fix dependency destination to be ../.dep relative to the src dir DEPENDS=$(join $(addsuffix ../.dep/, $(dir $(SOURCE))), $(notdir $(SOURCE:.cpp=.d))) ## Default rule executed all: $(TARGET) @true ## Clean Rule clean: @-rm -f $(TARGET) $(OBJ) $(DEPENDS) ## Rule for making the actual target $(TARGET): $(OBJ) @echo "=============" @echo "Linking the target [email protected]" @echo "=============" @$(CC) $(CFLAGS) -o [email protected] $^ $(LIBS) @echo -- Link finished -- ## Generic compilation rule %.o : %.cpp @mkdir -p $(dir [email protected]) @echo "=============" @echo "Compiling $<" @$(CC) $(CFLAGS) -c $< -o [email protected] ## Rules for object files from cpp files ## Object file for each file is put in obj directory ## one level up from the actual source directory. ../obj/%.o : %.cpp @mkdir -p $(dir [email protected]) @echo "=============" @echo "Compiling $<" @$(CC) $(CFLAGS) -c $< -o [email protected] # Rule for "other directory" You will need one per "other" dir $(OTHERDIR)/../obj/%.o : %.cpp @mkdir -p $(dir [email protected]) @echo "=============" @echo "Compiling $<" @$(CC) $(CFLAGS) -c $< -o [email protected] ## Make dependancy rules ../.dep/%.d: %.cpp @mkdir -p $(dir [email protected]) @echo "=============" @echo Building dependencies file for $*.o @$(SHELL) -ec '$(CC) -M $(CFLAGS) $< | sed "s^$*.o^../obj/$*.o^" > [email protected]' ## Dependency rule for "other" directory $(OTHERDIR)/../.dep/%.d: %.cpp @mkdir -p $(dir [email protected]) @echo "=============" @echo Building dependencies file for $*.o @$(SHELL) -ec '$(CC) -M $(CFLAGS) $< | sed "s^$*.o^$(OTHERDIR)/../obj/$*.o^" > [email protected]' ## Include the dependency files -include $(DEPENDS)
Opsi VPATH mungkin berguna, yang memberi tahu membuat direktori apa yang harus dicari untuk kode sumber. Anda masih memerlukan opsi -I untuk setiap jalur penyertaan. Contoh:
CXXFLAGS=-Ipart1/inc -Ipart2/inc -Ipart3/inc
VPATH=part1/src:part2/src:part3/src
OutputExecutable: part1api.o part2api.o part3api.o
Ini akan secara otomatis menemukan file partXapi.cpp yang cocok di salah satu direktori yang ditentukan VPATH dan mengompilasinya. Namun, ini lebih berguna saat direktori src Anda dipecah menjadi subdirektori. Untuk apa yang Anda gambarkan, seperti yang dikatakan orang lain, Anda mungkin lebih baik menggunakan makefile untuk setiap bagian, terutama jika setiap bagian dapat berdiri sendiri.
Jika Anda memiliki kode di satu subdirektori yang bergantung pada kode di subdirektori lain, Anda mungkin lebih baik menggunakan satu makefile di tingkat teratas.
Lihat Membuat Rekursif Dianggap Berbahaya untuk alasan lengkapnya, tetapi pada dasarnya Anda ingin make memiliki informasi lengkap yang diperlukan untuk memutuskan apakah suatu file perlu dibangun kembali atau tidak, dan itu tidak akan terjadi jika Anda hanya menceritakannya sekitar sepertiga dari proyek Anda.
Tautan di atas sepertinya tidak dapat dijangkau. Dokumen yang sama dapat dijangkau di sini:
- aegis.sourceforge.net (diarsipkan)
- lcgapp.cern.ch