我首先要说的是:
foo: bar baz
baz: bar
我想自动生成这个:
foo-suffix: bar-suffix baz-suffix
baz-suffix: bar-suffix
并且通过调用
make
来考虑所有这些依赖关系。
有没有办法在
makefile
中做到这一点,而不必求助于外部脚本来生成带有后缀的依赖项?
我之前依赖于编写一个获取
make -qprR
输出的脚本,但如果有一种方法可以直接在 makefile 中执行此操作,那就太好了。
使用 GNU 实现此目的的两种方法
make
:
%clean
匹配,则不会(重新)制作
过滤器
表情MAKEFILE_LIST
变量)eval
函数——除非适度使用,否则可能会导致晦涩的代码demo := foo bar foo-suffix bar-suffix quux pre-quux pre-bar
demo.d := demo.d
.PHONY : all clean
all : $(demo)
$(demo) : ; touch $@
clean : ; rm -f -- $(demo) $(demo.d)
ifndef use-eval
# $(call *fix-rule, *fix, targets, dependencies)
prefix-rule = printf '%s : %s\n' '$2' '$3' '$(addprefix $1,$2)' '$(addprefix $1,$3)'
suffix-rule = printf '%s : %s\n' '$2' '$3' '$(addsuffix $1,$2)' '$(addsuffix $1,$3)'
$(demo.d) : $(word 1,$(MAKEFILE_LIST)) ; \
{ $(call suffix-rule,-suffix,foo,bar baz) ; \
$(call suffix-rule,-suffix,baz,bar) ; \
$(call prefix-rule,pre-,quux,bar) ; \
} > $@
# Unless cleaning up cause dependency file to be made
ifeq (,$(filter %clean,$(MAKECMDGOALS)))
-include $(demo.d)
endif
else
# $(call *fix-rule, *fix, targets, dependencies)
prefix-rule = $(eval $2 : $3) $(eval $(addprefix $1,$2) : $(addprefix $1,$3))
suffix-rule = $(eval $2 : $3) $(eval $(addsuffix $1,$2) : $(addsuffix $1,$3))
$(call suffix-rule,-suffix,foo,bar baz)
$(call suffix-rule,-suffix,baz,bar)
$(call prefix-rule,pre-,quux,bar)
endif
调用
make
:
$ make
\
{ printf '%s : %s\n' 'foo' 'bar baz' 'foo-suffix' 'bar-suffix baz-suffix' ; \
printf '%s : %s\n' 'baz' 'bar' 'baz-suffix' 'bar-suffix' ; \
printf '%s : %s\n' 'quux' 'bar' 'pre-quux' 'pre-bar' ; \
} > demo.d
touch bar
touch foo
touch bar-suffix
touch foo-suffix
touch quux
touch pre-bar
touch pre-quux
$ :
$ make
touch foo
touch foo-suffix