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)