如何从另一个Makefile调用Makefile?

Chr*_*son 111 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
Run Code Online (Sandbox Code Playgroud)

/path/to/project/gtest-1.4.0/make/Makefile我有

all: $(TESTS)

clean:
  rm -f $(TESTS) gtest.a gtest_main.a *.o
Run Code Online (Sandbox Code Playgroud)

发布以下内容:

cd /path/to/project
make
Run Code Online (Sandbox Code Playgroud)

输出:

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'
Run Code Online (Sandbox Code Playgroud)

但是,当我发出这些命令时:

cd /path/to/project
make clean
Run Code Online (Sandbox Code Playgroud)

我知道了:

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'
Run Code Online (Sandbox Code Playgroud)

我不明白:在这两种情况下,/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.

Tad*_*der 116

取而代之的是-fmake,你可能要使用的-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
Run Code Online (Sandbox Code Playgroud)

  • 这种方式似乎是最好的。其他使用 `cd` 的回复导致终端进入无限循环。 (2认同)

小智 97

我不太清楚你在问什么,但使用-f命令行选项只是指定一个文件 - 它不会告诉make更改目录.如果要在另一个目录中进行工作,则需要cd到以下目录:

clean:
    cd gtest-1.4.0 && $(MAKE) clean
Run Code Online (Sandbox Code Playgroud)

请注意,每一行都在Makefile一个单独的shell 中运行,因此无需更改目录.

  • 而不是手动`cd`'ing到`gtest-1.4.0`目录,你应该使用`make`的`-C`选项. (62认同)
  • 或者至少,你应该在cd和make命令之间使用`&&`.否则,如果cd失败,它仍然会在错误的目录中运行`make clean` ... 另外,在递归时,你应该总是只使用`$(MAKE)`,而不是使用bareword`make`.所以类似:`cd gtest-1.4.0 && $(MAKE)clean` (27认同)
  • 关于 gnu-make 和 `-C` 的问题在规范中:https://www.gnu.org/software/make/manual/make.html#Recursion (4认同)
  • @Tader:`-C`不在[规范]中(http://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html) (3认同)