有没有办法复制依赖项,但在 GNU Make 中添加后缀/前缀?

问题描述 投票:0回答:1

我首先要说的是:

foo: bar baz

baz: bar

我想自动生成这个:

foo-suffix: bar-suffix baz-suffix

baz-suffix: bar-suffix

并且通过调用

make
来考虑所有这些依赖关系。

有没有办法在

makefile
中做到这一点,而不必求助于外部脚本来生成带有后缀的依赖项?

我之前依赖于编写一个获取

make -qprR
输出的脚本,但如果有一种方法可以直接在 makefile 中执行此操作,那就太好了。

makefile gnu-make
1个回答
0
投票

使用 GNU 实现此目的的两种方法

make
:

  • 使用自动生成的 包括 文件——多一点工作但更透明
    • 如果目标与
      %clean
      匹配,则不会(重新)制作 过滤器 表情
    • (重新)制作如果 makefile 较新(参见
      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
© www.soinside.com 2019 - 2024. All rights reserved.