2010-02-05 67 views
83

我得到一些意外的結果,從另一個調用一個生成文件。我有兩個makefile,一個叫做/path/to/project/makefile,另一個叫/path/to/project/gtest-1.4.0/make/Makefile。我試圖讓前者稱呼後者。在/路徑/到/項目/ Makefile中,我有如何從另一個Makefile調用Makefile?

dev: $(OBJ_FILES) 
    $(CPPC) $(LIBS) $(FLAGS_DEV) $(OBJ_FILES) -o $(BIN_DIR)/$(PROJECT) 
    $(MAKE) -f ./gtest-1.4.0/make/Makefile 

clean: 
    rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o 
    rm -f ../svn-commit.tmp~ 
    rm -f $(BIN_DIR)/$(PROJECT) 
    make -f gtest-1.4.0/make/Makefile clean 

而在/path/to/project/gtest-1.4.0/make/Makefile我有

all: $(TESTS) 

clean: 
    rm -f $(TESTS) gtest.a gtest_main.a *.o 

發出以下:

cd /path/to/project 
make 

輸出:

make -f ./gtest-1.4.0/make/Makefile 
make[1]: Entering directory `/path/to/project' 
make[1]: Nothing to be done for `all'. 
make[1]: Leaving directory `/path/to/project' 

但是,當我發佈這些命令:

cd /path/to/project 
make clean 

我看到:

make -f gtest-1.4.0/make/Makefile clean 
make[1]: Entering directory `/path/to/project' 
rm -f gtest.a gtest_main.a *.o 
make[1]: Leaving directory `/path/to/project' 

我不明白:在這兩種情況下,/path/to/project/makefile是告訴我它進入當前工作目錄。在第一種情況下,它不認爲它有工作要做(當它做),在第二種情況下,它能夠找到適當的指令(當輸出告訴我它正在尋找錯誤的目錄),但它嘗試運行rm命令/path/to/project而不是/path/to/makefile/gtest-1.4.0/make/

我是否錯過了從別的方面調用makefiles的基礎知識?我犯了一個嚴重的概念錯誤,還是遇到了一個常見的陷阱?如何有效更改目錄並從第一個內部調用第二個生成文件?我的理解是,簡單地調用make -f <name>就足夠了。

這是在bash中的make/gmake 3.81。

+3

我想,而不是'作,-f GTEST-1.4.0 /製造/ Makefile乾淨''你最好說'$(MAKE)-C gtest-1.4.0/make clean'。爲什麼你還沒有定義假目標? – 2010-06-22 15:43:22

+0

http://stackoverflow.com/questions/3494999/subdirectories-and-makefiles – 2014-06-08 15:34:08

回答

81

我不太清楚你在問什麼,但是使用-f命令行選項只是指定一個文件 - 它不告訴make改變目錄。如果你想要做的工作在其他目錄,則需要cd到以下目錄:

clean: 
    cd gtest-1.4.0 && $(MAKE) clean 

注意,每一行都在Makefile運行在一個單獨的外殼,所以沒有必要改變目錄回來。

+0

釘在頭上 - 謝謝! – 2010-02-05 17:48:03

+49

而不是手動'cd'到'gtest-1.4.0'目錄,你應該使用''''的'-C'選項。 – Tader 2012-05-02 14:40:17

+22

或者至少應該在cd和make命令之間使用'&&'。否則,如果CD失敗,它仍然會運行'make clean' ...在錯誤的目錄中!在遞歸時,你也應該總是隻使用'$(MAKE)',而不是'make'。所以像這樣:'cd gtest-1.4.0 && $(MAKE)clean' – MadScientist 2012-05-03 15:36:56

1

似乎很清楚,$(TESTS)是空的,所以你的makefile文件1.4.0有效地

all: 

clean: 
    rm -f gtest.a gtest_main.a *.o 

事實上,所有無關。並乾淨它確切地說它rm -f gtest.a ...

+0

$(TESTS)是用'wildcard'和'patsubst'定義的,但是它們從主makefile中返回空,因爲目錄沒有被有效地改變。好眼睛。 – 2010-02-05 17:47:46

89

而不是-fmake你可能想要使用-C <path>選項。首先將其更改爲路徑'<path>',然後在那裏調用make

例子:

clean: 
    rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o 
    rm -f ../svn-commit.tmp~ 
    rm -f $(BIN_DIR)/$(PROJECT) 
    $(MAKE) -C gtest-1.4.0/make clean 
+0

這種方式似乎是最好的。來自其他使用'cd'的回覆會導致終端陷入無限循環。 – gbmhunter 2013-05-30 00:31:31