如何从另一个Makefile调用Makefile?

如何从另一个Makefile调用Makefile?,makefile,gnu-make,Makefile,Gnu Make,我从一个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)/$

我从一个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
中的
rm
命令,而不是
/path/to/makefile/gtest-1.4.0/make/

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


这是bash中的make/gmake 3.81。

我不太清楚您在问什么,但是使用
-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

事实上,一切都与此无关。clean完全按照它所说的那样执行
rm-f gtest.a…

而不是
-f
-make
您可能需要使用
-C
选项。这首先将更改为路径“
”,然后在那里调用
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

或者,相当于:

 subsystem:
         $(MAKE) -C subdir

$(TESTS)是用
通配符和
patsubst
定义的,但是由于没有有效地更改目录,因此它们从主makefile返回空。好眼力。我想,与其说
make-f gtest-1.4.0/make/Makefile clean
不如说
$(make)-C gtest-1.4.0/make clean
。为什么您没有定义虚假目标?您应该使用
make
-C
选项,或者至少,您应该在cd和make命令之间明确使用
&
,而不是手动将
cd
设置到
gtest-1.4.0
目录。否则,如果cd出现故障,它仍将运行
makeclean
。。。在错误的目录中!!此外,在递归时,您应该始终只使用
$(MAKE)
,而不要使用裸词
MAKE
。所以像:
cd gtest-1.4.0&&$(MAKE)clean
@Tader:
-C
这样的东西不在关于gnu MAKE的问题中,而
-C
在规范中:这种方式似乎是最好的。使用
cd
的其他回复导致终端进入无限循环。$(MAKE)-C gtest-1.4.0/MAKE clean对我不起作用。我想应该是$(MAKE)-cgtest-1.4.0,谢谢你参考官方文件。
 subsystem:
         $(MAKE) -C subdir