如何从另一个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 ...