从另一个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
都告诉我它正在进入当前工作目录。在第一种情况下,它认为它没有工作要做(当它有工作时),在第二种情况下,它能够找到适当的指令(当输出告诉我它在错误的目录中查找时)但它会尝试在 /path/to/project
而不是 /path/to/makefile/gtest-1.4.0/make/
中运行 rm
命令。
我是否遗漏了一些基本的相互调用 makefile 的东西?我是否犯了一个严重的概念错误,或者遇到了一个常见的陷阱?如何有效地更改目录并从第一个 makefile 中调用第二个?我的理解是简单地调用 make -f <name>
就足够了。
这是 bash 中的 make/gmake 3.81。
$(MAKE) -C gtest-1.4.0/make clean
而不是 make -f gtest-1.4.0/make/Makefile clean
。为什么你没有定义虚假目标?
我不太清楚你在问什么,但使用 -f
命令行选项只是指定一个文件 - 它不会告诉 make 更改目录。如果您想在另一个目录中进行工作,您需要 cd
到该目录:
clean:
cd gtest-1.4.0 && $(MAKE) clean
请注意,Makefile
中的每一行都在单独的 shell 中运行,因此无需将目录改回来。
您可能想要使用 -C <path>
选项而不是 make
的 -f
。这首先将 更改为路径“<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
cd
的其他回复会导致终端进入无限循环。
http://www.gnu.org/software/make/manual/make.html#Recursion
subsystem:
cd subdir && $(MAKE)
或者,等效地,这个:
subsystem:
$(MAKE) -C subdir
.PHONY: db db: $(MAKE) -C db/ build start
很明显 $(TESTS)
是空的,所以你的 1.4.0 makefile 是有效的
all:
clean:
rm -f gtest.a gtest_main.a *.o
的确,一切都无关紧要。并且 clean 完全按照它所说的rm -f gtest.a ...
wildcard
和 patsubst
定义的,但是它们从主 makefile 返回空,因为目录没有被有效地更改。好眼力。
make
的-C
选项,而不是手动cd
到gtest-1.4.0
目录。&&
。否则如果 cd 失败,它仍然会在错误的目录中运行make clean
...!!此外,在递归时,您应该始终只使用$(MAKE)
,而不是裸词make
。所以像:cd gtest-1.4.0 && $(MAKE) clean
-C
不在 the spec 中-C
的问题在规范中:gnu.org/software/make/manual/make.html#Recursion