Makefile 编写可重用代码的最佳实践

Makefile 编写可重用代码的最佳实践,makefile,Makefile,在Makefiles中编写可重用代码的最佳实践是什么 假设我有一个Makefile: .PHONY: all task01-all task01-clean task01-run task02-all task02-clean task02-run all: task01-all task02-all ############################################################################### task01-all: task

Makefile
s中编写可重用代码的最佳实践是什么

假设我有一个Makefile:

.PHONY: all task01-all task01-clean task01-run task02-all task02-clean task02-run

all: task01-all task02-all

###############################################################################
task01-all: task01-clean task01 task01-run

task01-clean:
     rm task01 task01.{exi,o} -f

task01:
    compiler task01.ext -O2 --make

task01-run:
    ./task01

###############################################################################
task02-all: task02-clean task02 task02-run

task02-clean:
    rm task02 task02.{exi,o} -f

task02:
    compiler task02.ext -O2 --make

task02-run:
    ./task02
现在我想添加新的任务系列(task03),我需要复制粘贴整个部分,为它制作
s/02/03/
,并将它们添加到
.PHONY
部分-它很吵,很恶心,而且不合适


我怎样才能避免呢?我是否可以用模板重新定义所有任务,使其具有在一行中添加新任务组的良好机制?

看起来像我正在寻找的:

ALLS=task01-all task02-all
BUILDS=${ALLS:-all=-build}
CLEANS=${ALLS:-all=-clean}
RUNS=${ALLS:-all=-run}

.PHONY: all $(ALLS) $(CLEANS) $(BUILDS) $(RUNS)

all: $(ALLS)

###############################################################################
$(ALLS): $(CLEANS) $(BUILDS) $(RUNS)

$(CLEANS):
        rm ${@:-clean=} ${@:-clean=}.{ext,o} -f

$(BUILDS):
        compiler ${@:-build=}.ext -O2 --make

$(RUNS):
        ./${@:-run=}

因为问题是关于在Makefiles中编写可重用代码,所以我将给出一个如何在GNU Make中使用模式规则的示例(因为您提到了
.PHONY
目标,所以看起来这就是您正在使用的)。但是,如果您不使用Make的任何依赖项检查,那么使用shell脚本执行此操作可能会更简单,例如:

#!/bin/sh
TASKS="task01 task02 task03"

for i in $TASKS; do
    rm $i $i.ext $i.o -f;
    compiler $i.ext -O2 --make;
    ./$i;
done
但是,为了扩大这一原则,我们还有另一个问题需要解决。表格的行:

task01-all: task01-clean task01 task01-run
不要告诉Make以什么顺序构建先决条件——只需在构建
task01 all
之前完成它们即可。相反,要运行的每个步骤都应该取决于它之前的步骤。大概是这样的:

TASKS=task01-run task02-run task03-run

.PHONY: all $(TASKS) $(TASKS:run=clean)

all: $(TASKS)

$(TASKS:run=clean): %-clean:
    rm $* $*.ext $*.o -f

%: %.ext | %-clean
    compiler $< -O2 --make

$(TASKS): %-run: %
    ./$<
值得一提的是,Make最大的优点之一是它可以通过不重复不需要重复的工作来节省时间,也就是说,它只在依赖项比目标项新的情况下运行规则。因此,您可以取消对
%-clean
的依赖,这将导致make仅在
%更新时运行
编译器$<-O2--make

%: %.ext
    compiler $< -O2 --make

最后一件事:我在食谱中使用了一些特殊变量<代码>$@
表示正在生成的目标<代码>$很好的解释。谢谢
%: %.ext
    compiler $< -O2 --make
.PHONY: all $(TASKS) $(TASKS:run=clean) clean

clean: $(TASKS:run=clean)