[英]How to include a makefile into an other makefile?
我有一些 C++ 類,每個類都放入他自己的文件夾中,並帶有一個 makefile、test.cpp 用於測試目的等。
Main folder
|-> Class1 folder
|-> Class2 folder
|-> Class2.1 folder
|-> Class2 folder
我有一個主要項目,必須包括這些類。 我試圖將所有子生成文件包含到主生成文件中。
我試過“INCLUDE POO/makefile”,但這個解決方案有兩個問題:
我希望所有的 makefile 都是獨立的,所以我可以將類文件夾復制/粘貼到一個新項目中並且它仍然可以工作,或者我可以單獨執行 makefile 而不對其進行更改。
所以問題是:如何(正確地)將一個 makefile 包含到另一個 makefile 中?
示例,僅用於測試目的。
主makefile(簡化)
include Vector3D/makefile
include Color/makefile
CPP = g++
CXXFLAGS = $(CXXINCS) -Wall -O0
all: main
main: main.o Vector3D.o Color.o
$(CPP) main.o Vector3D.o Color.o -o main
main.o: main.cpp
$(CPP) -c main.cpp -o main.o $(CXXFLAGS)
子makefile示例(簡化)
#Vector3D
CPP = g++
CXXFLAGS = $(CXXINCS) -Wall -O0
all: test
test: Vector3D.o test.o
$(CPP) Vector3D.o test.o -o test
Vector3D/test.o: test.cpp
$(CPP) -c test.cpp -o test.o $(CXXFLAGS)
Vector3D.o: Vector3D.cpp Vector3D.hpp
$(CPP) -c Vector3D.cpp -o Vector3D.o $(CXXFLAGS)
Color/makefile 與 Vector3D 相似。
我希望所有的 makefile 都是獨立的,所以我可以將類文件夾復制/傳遞到一個新項目中並且它仍然可以工作,或者我可以單獨執行 makefile 而不對其進行更改。
我很確定這是不可能的。 您的 makefile 要么需要是獨立的,在這種情況下,您可以使頂層文件遞歸調用較低級別目錄中的make
(因此不要include
它們),或者您可以通過包含其他 makefile 來形成單個非遞歸 makefile。 我認為兩者都不可能做到。
如何(正確)將一個 makefile 包含到另一個 makefile 中?
唯一有效的答案是“使用include
指令”(除了通常的“取決於”。)任何其他建議都取決於 makefile 的結構。 設計為包含的 Makefile 顯然更容易包含。 只是包括一些隨機的 makefile 並希望它會起作用......不會起作用。 查看實現非遞歸 make和Boilermake以了解如何使非遞歸 makefile 工作。
請注意,沒有必要將它們包含在文件的頂部,這樣做可能是個壞主意,因為默認目標成為包含文件中的第一個目標。
感謝@Jonathan-wakely 為這個解決方案提供了最初的概念。
可能有很多事情可以改進,但它確實有效。
要求總結:
一個簡單的解決方案是遞歸調用 makefile:
主生成文件的示例:
#all make recursive calls
sub-make:
make -C Vector3D
make -C Color
#final linking
CPP = g++
FLAGS = $(CXXINCS) -Wall -O0
all: main
main: main.o Vector3D/Vector3D.o Color/Color.o
$(CPP) main.o Vector3D/Vector3D.o Color/Color.o -o main
main.o: main.cpp
$(CPP) -c main.cpp -o main.o $(FLAGS)
可能有更好的方法可以在不編寫所有完整路徑的情況下向鏈接器提供 *.o 二進制文件,但這是另一個問題。
創建干凈的目標。 對於葉子makefile,沒有特殊的考慮,但是對於主makefile,它必須調用sub-clean 規則。
clean:
make -C Vector3D clean
make -C Color clean
rm -f *.o main
編輯:
這是我所做的 makefile 結構,因為它可能對任何人有用。
要工作,所有類必須在它自己的文件夾中:
生成文件
#Following configuration may be set with a parameter:
# e.g: make FLAGS="-Wall -O0"
FLAGS = $(CXXINCS) -Wall -O0
#Configurable variables
EXEC = main
CLASS = World
LIBS = Color Vector3D Triangle
LIBSPATH = ../
#Static content
CPP = g++
OBJS = $(foreach dir, $(LIBS), $(LIBSPATH)$(dir)/$(dir))
all: $(EXEC)
clean:
rm -f *.o $(EXEC)
$(foreach dir,$(LIBS),make clean --no-print-directory -C $(LIBSPATH)$(dir);)
$(EXEC): $(CLASS).o $(EXEC).o $(OBJS:=.o)
$(CPP) $(CLASS).o $(OBJS:=.o) $(EXEC).o -o $(EXEC)
$(EXEC).o: $(EXEC).cpp
$(CPP) -c $(EXEC).cpp -o $(EXEC).o $(CXXFLAGS)
$(CLASS).o: $(CLASS).cpp $(CLASS).hpp
$(CPP) -c $(CLASS).cpp -o $(CLASS).o $(CXXFLAGS)
$(OBJS:=.o): $(OBJS:=.cpp) $(OBJS:=.hpp)
make --no-print-directory -C $(LIBSPATH)$(strip $(foreach dir,$(LIBS),$(if $(findstring $(dir),$@),$(dir))))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.