gpt4 book ai didi

makefile - Gnu 在模式规则中使用多个 %?

转载 作者:行者123 更新时间:2023-12-04 03:19:50 24 4
gpt4 key购买 nike

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

我面临的情况是我的目标看起来像:
$(Home)/ecc_%_1st_%.gff: %.fpp
每当我试图匹配 /home/ecc_map_1st_map.gff: map.fpp提示找不到模式。

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

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

谢谢

最佳答案

你不能有两种模式。最好的方法是没有 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 )。

关于makefile - Gnu 在模式规则中使用多个 %?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39151235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com