编写这样的 Makefile 的简洁有效的方法是什么?
可以给定输入列表和生成输出文件名的 shell 脚本,以使用 GNU make 功能生成目标、依赖项和规则:
all :
inputs := in1.c in2.txt in3 sub/in1.c
outputs :=
define make_dependency
${1} : ${2}
outputs += ${1}
endef
# replace $(shell echo ${in}.out) with your $(shell generate ${in})
$(foreach in,${inputs},$(eval $(call make_dependency,$(shell echo ${in}.out),${in})))
# generic rule for all outputs, and the common dependency
# replace "echo ..." with a real rule
${outputs} : % : ${common}
@echo "making $@ from $<"
all : ${outputs}
.PHONY : all
输出:
$ make
making in1.c.out from in1.c
making in2.txt.out from in2.txt
making in3.out from in3
making sub/in1.c.out from sub/in1.c
在上面的 makefile 中,使用了一个强大的 GNU make 构造所使用的一点点:$(eval $(call ...))
. 它要求make扩展宏以产生一段文本,然后将该段文本评估为一段makefile,即make生成飞行的makefile。