如何从另一个Makefile调用Makefile?

时间:2010-02-05 09:20:34

标签: makefile gnu-make

我从另一个调用一个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。

4 个答案:

答案 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 ...

的说法完成