如何从另一个Makefile调用Makefile?

我得到一些意想不到的结果从另一个调用一个生成文件。 我有两个makefile,一个叫/path/to/project/makefile ,一个叫/path/to/project/gtest-1.4.0/make/Makefile 。 我试图让前者称呼后者。 在/ path / to / project / 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告诉我它正在进入当前的工作目录。 在第一种情况下,它不认为它有工作要做(当它做),在第二种情况下,它能够find适当的指令(当输出告诉我它正在寻找错误的目录),但它试图在/path/to/project运行rm命令,而不是/path/to/makefile/gtest-1.4.0/make/

我错过了从别的方面调用makefiles的基础知识吗? 我犯了一个严重的概念错误,还是遇到了一个共同的陷阱? 如何有效地更改目录并从第一个内部调用第二个生成文件? 我的理解是,简单地调用make -f <name>就足够了。

这是bash中的make / gmake 3.81。

我不太清楚你在问什么,但使用-f命令行选项只是指定一个文件 – 它不告诉make改变目录。 如果你想在另一个目录下做这个工作,你需要cd到目录:

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

请注意, Makefile中的每一行都在单独的shell中运行,因此不需要将目录改回。

而不是-f make你可能想要使用-C <path>选项。 这首先更改为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 

http://www.gnu.org/software/make/manual/make.html#Recursion

  subsystem: cd subdir && $(MAKE) 

或者等同地,这是:

  subsystem: $(MAKE) -C subdir 

$(TESTS)显然是空的,所以你的1.4.0 makefile是有效的

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

事实上,一切都无关紧要。 和干净的确如它所说rm -f gtest.a ...