2013-10-10 76 views
3

我有一些C++類,每一個到自己的文件夾生成文件,TEST.CPP用於測試目的等如何將makefile包含到其他makefile中?

Main folder 
|-> Class1 folder 
|-> Class2 folder 
     |-> Class2.1 folder 
|-> Class2 folder 

我有一個主要項目,必須包括這些類。我試圖將所有的子makefile包含到主makefile中。

我有tryed「INCLUDE POO/Makefile文件」,但這種解決方案有2個問題:

  • 子makefile文件的路徑不正確,所以都沒有找到文件(「沒有規則,以建立目標'Vector3D.cpp'「)。
  • 的「TEST.CPP」文件overrided,可能是因爲路的問題(「警告:壓倒一切的配方目標......」)。

我想獨立於所有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) 

子生成文件例子(簡化的)

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

爲彩色/生成文件比的Vector3D

回答

4

類似我想獨立於所有生成文件,所以我可以複製/通過類文件夾到一個新的項目,它仍然工作,或者我可以執行makefi獨自一人,沒有改變就可以了。

我很確定這是不可能的。您的makefile或者需要是獨立的,在這種情況下,您可以使頂層文件以較低級別的目錄遞歸調用make(所以不要使用include您可以通過包含其他makefile來構建單個非遞歸makefile 。我不認爲這兩種做法都是可能的。

如何將makefile正確地包含到其他生成文件中?

唯一有效的答案是「使用include指令」(而不是通常的「看情況」等。)任何其他意見取決於makefile文件的結構。包含Makefile 設計的顯然會更容易包含。只是包括一些隨機makefile,並希望它會工作...將無法正常工作。查看Implementing non-recursive makeBoilermake瞭解如何使非遞歸makefile工作。

請注意,不需要將它們包含在文件的頂部,因爲默認目標將成爲包含文件中的第一個目標。

+0

感謝您的回答,我已經寫了與我所使用的解決方案的答案 –

0

感謝@Jonathan Wakely爲我提供了一些有關此解決方案的出發點。

可能有很多事情可以改進,但它的工作。

需求量的總結:

  • Makefile文件應該是獨立的
  • 主要生成文件應包括子的makefile
  • shouls出現任何衝突或路徑問題。

一個簡單的解決方法是調用遞歸的Makefile:

  • 創建葉的makefile
  • 使用的空的目標允許執行總是例如所謂的「正常」腳本「子使:「沒有任何要求之後」:「
  • 使用」-C「參數來設置make調用的根目錄。
  • 使用子makefile創建的二進制文件創建最終鏈接。
  • 主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,它必須調用子清理規則。

clean: 
    make -C Vector3D clean 
    make -C Color clean 
    rm -f *.o main 

編輯:

這裏是生成文件的結構我也做,因爲如果它可能是有用的人。

有效,所有的類都必須是在IS自己的文件夾:

  • .HPP頭
  • 的.cpp代碼
  • 的main.cpp測試
  • 所需的類(LIBS)目錄中與「$(LIBSPATH)LibName」相關的makefile指定。

的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),[email protected]),$(dir))))