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

时间:2016-08-25 17:20:27

标签: makefile

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

我正面临着我的目标看起来像一个条件:

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

每当我尝试匹配/home/ecc_map_1st_map.gff: map.fpp时 抱怨无法找到模式。

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

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

由于

1 个答案:

答案 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)。