我从另一个调用一个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
告诉我它正在进入当前的工作目录。在第一种情况下,它认为它没有工作要做(当它这样做)而在第二种情况下,它能够找到适当的指令(当输出告诉我它正在查找错误的目录时)它尝试在rm
中运行/path/to/project
命令,而不是/path/to/makefile/gtest-1.4.0/make/
。
我是否遗漏了从彼此调用makefile的基本内容?我是否犯了一个令人震惊的概念错误,或者遇到了常见的陷阱?如何有效地更改目录并从第一个内部调用第二个makefile?我的理解是,简单地调用make -f <name>
就足够了。
这是bash中的make / gmake 3.81。
答案 0 :(得分:108)
您可能希望使用-f
选项,而不是make
-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
答案 1 :(得分:95)
我不太清楚你在问什么,但使用-f
命令行选项只是指定一个文件 - 它不会告诉make更改目录。如果要在另一个目录中完成工作,则需要cd
到目录:
clean:
cd gtest-1.4.0 && $(MAKE) clean
请注意,Makefile
中的每一行都在一个单独的shell中运行,因此无需更改目录。
答案 2 :(得分:29)
http://www.gnu.org/software/make/manual/make.html#Recursion
subsystem:
cd subdir && $(MAKE)
或等效地:
subsystem:
$(MAKE) -C subdir
答案 3 :(得分:1)
很明显$(TESTS)
为空,因此1.4.0 makefile实际上是
all:
clean:
rm -f gtest.a gtest_main.a *.o
确实,一切都无关。和干净完全按照rm -f gtest.a ...