假设work文件夹下有三个文件夹a,b,c.各自可以独立编译成一个目标,且a,b,c文件夹下已经存在makefile。在work下面写一个总的makefile来调用a,b,c各自的makefile
在写一个clean,清理所有target
TARGET=a b c
LDIR=$(shell pwd) #LDIR=/work
CTARGET=$(foreach n,$(TARGET),$(LDIR)/$n) #/work/a /work/b /work/c
all:$(TARGET)
#多目标编译
$(TARGET):
$(MAKE) -C $(LDIR)/$@ -f $(LDIR)/$@/makefile
#多目标清理
clean:$(CTARGET)
$(CTARGET):
$(MAKE) -C $@ -f $@/makefile clean
.PHONY:$(TARGET) all clean $(CTARGET)
#需要设置成伪目标,因为a,b,c并不是执行文件,只是文件夹的名字。
#$@指代$(TARGET). 这样执行make,等于是make all,all是默认的项目。
#自动推导的时候就会一次执行a,b,c。如果不写all的话,make,执行的只是make a, a是默认的项目。
#观察make命令,其中—C表示切换工作目录,切换以后,会在该目录下寻找源文件
#不能有相同的伪目标名字,否则会冲突,所以一个用CTARGET(全路径),一个用TARGET(相对路径)
#函数$(foreach),foreach是函数名,总共三个参数,不同的参数用逗号隔开,表示把TARGET里的元素一个个取出来,赋值给n,然后拼接成$(LDIR)/$n
多目标安装和卸载
TARGET=a