簡體   English   中英

如何將一個makefile包含到另一個makefile中?

[英]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的路徑不正確,所以找不到文件(“沒有規則可以構建目標'Vector3D.cpp'”)。
  • “test.cpp”文件被覆蓋,可能是因為路徑問題。(“警告:覆蓋目標的配方......”)

我希望所有的 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 並希望它會起作用......不會起作用。 查看實現非遞歸 makeBoilermake以了解如何使非遞歸 makefile 工作。

請注意,沒有必要將它們包含在文件的頂部,這樣做可能是個壞主意,因為默認目標成為包含文件中的第一個目標。

感謝@Jonathan-wakely 為這個解決方案提供了最初的概念。

可能有很多事情可以改進,但它確實有效。

要求總結:

  • Makefile 應該獨立工作
  • 主 makefile 將包括子 makefile
  • 不應出現沖突或路徑問題。

一個簡單的解決方案是遞歸調用 makefile:

  • 為葉生成文件創建一個“正常”腳本
  • 使用空目標允許執行總是調用例如“sub-make:”在“:”之后沒有任何要求
  • 使用“ -C ”參數設置make調用的根目錄。
  • 創建與子生成文件創建的二進制文件的最終鏈接。

主生成文件的示例:

#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 結構,因為它可能對任何人有用。

要工作,所有類必須在它自己的文件夾中:

  • .hpp 標頭
  • .cpp 代碼
  • 用於測試的 main.cpp
  • 所需的類 (LIBS) 目錄使用與此 makefile 相關的“$(LIBSPATH)LibName”指定。

生成文件

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM