如何从另一个 Makefile 调用 Makefile?

我从一个 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'

我不明白: 在这两种情况下,ABc0都告诉我它正在进入当前的工作目录。在第一种情况下,它不认为它有工作要做(当它这样做时) ,在第二种情况下,它能够找到适当的指令(当输出告诉我它正在查找错误的目录时) ,但它尝试在 /path/to/project中运行 rm命令,而不是在 /path/to/makefile/gtest-1.4.0/make/中。

我是否遗漏了从彼此调用 makefile 的一些基本要素?我是否犯了一个严重的概念性错误,或者遇到了一个常见的陷阱?如何有效地更改目录并从第一个目录中调用第二个 makefile?我的理解是,只要调用 make -f <name>就足够了。

这是 bash 中的 make/gmake 3.81。

193115 次浏览

我不是很清楚你在问什么,但是使用 -f命令行选项只是指定一个文件-它不告诉 make 更改目录。如果您想在另一个目录中完成工作,则需要将 cd转到该目录:

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

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

很明显,$(TESTS)是空的,因此您的1.4.0 makefile 是有效的

all:


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

事实上,一切都没有什么关系。和清洁做的正是它所说的 rm -f gtest.a ...

您可能希望使用 -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

Http://www.gnu.org/software/make/manual/make.html#recursion

 subsystem:
cd subdir && $(MAKE)

或者,相当于:

 subsystem:
$(MAKE) -C subdir