如果我正确理解了make文档,我只能在目标模式中使用一次字符%!
我正面临着我的目标看起来像一个条件:
$(Home)/ecc_%_1st_%.gff: %.fpp
每当我尝试匹配/home/ecc_map_1st_map.gff: map.fpp
时
抱怨无法找到模式。
我知道这是因为使用%两次($(Home)/ecc_map_1st_%.gff: %.fpp
符文完美)
无论如何,我可以在一个目标中使用2%!?
由于
答案 0 :(得分:0)
你不能有两种模式。最好的方法是在目标名称中没有resetCommand.setRef( "< SHA-1 >" );
两次。
如果您必须,并且您正在使用GNU make,secondary expansion可能会有用:
map
通常情况下,您不能在先决条件中使用automatic variables,例如.SECONDEXPANSION:
$(Home)/ecc_%.gff: $$(word 1,$$(subst _, ,$$*)).fpp
,但二次扩展可以让您这样做。请注意,我使用$*
代替$$
,以便真正的扩展发生在第二遍而不是第一遍。
假设您正在制作$
。 $(Home)/ecc_map_1st_map.gff
变量将成为词干,即$*
。然后map_1st_map
用空格替换下划线,以获得$(subst _, ,...)
。现在map 1st map
提取第N个以空格分隔的单词。第一个单词是第一个$(word N,...)
,第二个单词是map
,第三个单词是第二个1st
。我正在挑选第一个。
当然这非常宽松,并不能保证您完全匹配您想要的目标(map
会匹配并给予$(Home)/ecc_map_2nd_notmap__foo.gff
)。你可以做进一步的检查(中间是map.fpp
,其他两个必须匹配)并纾困:
1st
但这看起来不是一个明智的解决方案。
总结一下,如果没有类似命名的文件,那么第一个解决方案就可以正常工作。此外,如果您事先知道目标名称,则可以使用显式模式规则使其更安全(甚至生成它们on the fly)。