我想遵守以下规则:
foo_% bar_%:
@echo "Complex building instructions for $@"
all: foo_xyz bar_xyz
然后运行'make all'并获取:
Complex building instructions for foo_xyz
Complex building instructions for bar_xyz
但是,因为'%'匹配相同的字符串两次(xyz),它只是第一次“构建”,所以我得到的只是第一行。
当'$ @'第二次不同时,有没有办法让GNU make执行'echo'两次?毕竟,由于$ @不同,构建说明不同:/
答案 0 :(得分:1)
正如您所注意到的,多个模式目标的行为与正常目标不同:Make会考虑负责制作所有模式的配方。
解决此问题的方法是使用define:
define complex-rule
$1:
@echo "Complex building instructions for $$@"
endef
$(eval $(call complex-rule,foo_%))
$(eval $(call complex-rule,bar_%))
all: foo_xyz bar_xyz
请注意,由于它是eval
,因此我将$@
转发到$$@
,因为我希望在配方运行时将其展开,而不是在eval
时它。另一方面,我没有逃避$1
,因为我希望第一个参数扩展到call
。