【问题标题】:Gnu make with multiple % in pattern rule?Gnu在模式规则中使用多个%?
【发布时间】:2016-08-25 17:20:26
【问题描述】:

如果我正确理解了 make 文档,我只能在目标模式中使用字符 % 一次!

我正面临我的目标看起来像这样的情况:

$(Home)/ecc_%_1st_%.gff: %.fpp

每当我尝试匹配/home/ecc_map_1st_map.gff: map.fpp 抱怨找不到规律。

我知道这是因为两次使用 % ($(Home)/ecc_map_1st_%.gff: %.fpp runes 完美)

无论如何我可以在一个目标中使用 2%!?

谢谢

【问题讨论】:

标签: makefile


【解决方案1】:

你不能有两种模式。最好的方法是不要在目标名称中包含两次 map

如果必须,并且您正在使用 GNU make,secondary expansion 可能会有用:

.SECONDEXPANSION:
$(Home)/ecc_%.gff: $$(word 1,$$(subst _, ,$$*)).fpp

通常你不能在先决条件中使用automatic variables,例如$*,但是二次扩展允许你这样做。请注意,我使用$$ 代替了$,因此真正的扩展发生在第二遍而不是第一遍。

假设您正在制作$(Home)/ecc_map_1st_map.gff$* 变量将成为词干,即map_1st_map。然后$(subst _, ,...)将下划线替换为空格,得到map 1st map。现在$(word N,...) 在其中提取第 N 个空格分隔的单词。第一个词是第一个map,第二个是1st,第三个是第二个map。我选择第一个。

当然,这是相当宽松的,并不能保证你会完全匹配你想要的目标($(Home)/ecc_map_2nd_notmap__foo.gff 会匹配并给出map.fpp)。你可以做进一步的检查(1st 在中间,其他两个必须匹配)并退出:

extract-name = $(call extract-name-helper,$1,$(word 1,$(subst _, ,$1)))
extract-name-helper = $(if $(filter $2_1st_$2,$1),$2,$(error Invalid .gff target))

.SECONDEXPANSION:
ecc_%.gff: $$(call extract-name,$$*).fpp

但这看起来不是一个明智的解决方案。

总结一下,如果没有类似命名的文件,那么第一个解决方案会很好用。此外,如果您事先知道目标名称,则可以使用明确的模式规则使其更安全(甚至生成它们on the fly)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多