首页 > 解决方案 > 制作配方中的管道超出规则?

问题描述

假设我有以下情况:

.SECONDEXPANSION:
rule-%: etc/$$*
    some other things
    here
    something-something -c "cat $< | envsubst | ..." \
        > $@

而且我想重写这条规则,因为它是跨 n 项的常见模式,而不会变得聪明:

.SECONDEXPANSION:
rule-%: etc/$$*
   some other things
   here
   make something-something-$< > $@

something-something-%:
   something-something -c "cat $* | envsubst | ..."

但是我找不到任何保证这会起作用,假设我将外部规则rule-%称为来自不同目录的子制作(根据我的经验,制作有时会将目录位置打印到管道中 - 这可以通过默默地执行 make,但我永远不会假设用户知道这一点)。

这在所有情况下都有效吗?或者,我知道我可以:

etc...
    make something-something arg1=... arg2=...

something-something:
    something-something -c "cat ${arg1} | envsubst | ..." > ${arg2}

但我想避免这种情况。

标签: makefilegnu-make

解决方案


我不认为我理解你的问题,但是:首先你不应该make在递归调用 make 时使用 raw :你必须始终使用$(MAKE)变量。

其次,如果您希望递归 make 不打印目录信息,或者甚至静默运行,您可以将这些选项添加到 submake:调用外部 make 的人指定的选项无关紧要:

$(MAKE) -s --no-print-directory something-something-$< > $@

推荐阅读