Inheritance 生成、继承子目录Makefile中的规则

Inheritance 生成、继承子目录Makefile中的规则,inheritance,makefile,Inheritance,Makefile,我想在我的项目目录中设置一个Makefiles系统,以便在其中一个目录中定义的规则将在其他目录中定义。比如说,我有一个名为“test”的目录,里面是“test.c”,但我想使用根目录中Makefile中定义的规则构建test.c 这里有一个例子 #Makefile (inside base dir) %.o: %.c gcc -Wall -c $^ all: make -C test out.a #test/Makefile out.a: test.o ar rcs $@

我想在我的项目目录中设置一个Makefiles系统,以便在其中一个目录中定义的规则将在其他目录中定义。比如说,我有一个名为“test”的目录,里面是“test.c”,但我想使用根目录中Makefile中定义的规则构建test.c

这里有一个例子

#Makefile (inside base dir)
 %.o: %.c
   gcc -Wall -c $^

 all:
  make -C test out.a

#test/Makefile
 out.a: test.o
  ar rcs $@ $^

#test/test.c
 int main() {
   return 0;
 }

#inside root dir
$make
make -C test
make[1]: Entering directory `test'
cc    -c -o test.o test.c
/usr/ucb/cc:  language optional software package not installed
make[1]: *** [test.o] Error 1
make[1]: Leaving directory `test'
make: *** [all] Error 2
注意它是如何使用根makefile中定义的gcc调用cc而不是我的规则的


总之,我不想在每个Makefile中定义相同的规则。对于Microsoft nmake,请使用以下命令:

!INCLUDE ..\makefile.defs
include ../makefile.defs
(假设父目录中的makefile.defs包含基本规则)

对于Gnu make,请使用以下命令:

!INCLUDE ..\makefile.defs
include ../makefile.defs

请参见

您可以将一个makefile转换为另一个。

我遇到的问题是,makefile变得依赖于路径。这是可行的,但如果规则能以某种方式传递给孩子会更好Make@Mike:通常会将非路径相关部分分离出来,如
%.o:%.c
规则,以便将它们包括在内。使用make有问题,这就是为什么有这么多不同的选择。@迈克:你可能会发现递归make被认为是有害的()有用。