我发现自己在 Makefile 中声明 GNU make 目标是假的两种可能性之间有点左右为难。
一是一次性宣布所有假货:
.PHONY: targ1 targ2 targ3
targ1:
...
targ2:
...
targ3:
...
其优点是(对我来说)更具可读性并且更整洁。但人们无法很快看出哪些目标是假的。
另一种可能性是与规则一起声明虚假性(直接在前面或后面):
.PHONY: targ1
targ1:
...
.PHONY: targ2
targ2:
...
targ3:
...
.PHONY: targ3
这(对我来说)更难阅读。我也不喜欢重复的规则名称。 python中有类似函数装饰器的解决方案吗?像这样的事情:
@pny
targ1:
...
@pny
targ2:
...
@pny
targ3:
...
我怀疑这样的东西对于应用程序来说可能更有用,而不仅仅是伪造规则,因为这只是我个人品味的问题。因此我的问题的标题更广泛。
我不知道有内置的 Make 来实现这一点。但对于(不太便携,不可取)解决方案,你可以这样做:
MAKEFILE = $(lastword $(MAKEFILE_LIST))
.PHONY: $(shell grep -E -A1 "^\s*\#\s*phy" $(MAKEFILE) | \
grep -Pio "^[a-z][-_.a-z0-9]+\s*(?=:)")
#phy
targ1:
...
#phy
targ2:
...
#phy
targ3:
...
该解决方案在 Makefile 中搜索字符串#phy
在每条规则上方的行中。它提取规则名称。两者都使用unix程序grep
和一个 shell 调用。然后将规则名称作为源.PHONY
.
要制作更通用的“装饰器”,您可以将其与此答案中的技术结合起来:https://stackoverflow.com/a/36941727/8655091 https://stackoverflow.com/a/36941727/8655091,即其中的部分define
用于根据输入参数构建 make 规则的文本。该定义稍后call
-ed 在 aforeach
循环以实际创建规则。
然而,grep
尤其是与-P
选项可能并不存在于每个系统上。另外,包含子 makefile 可能会产生问题。另外,大多数人遇到这种情况肮脏的黑客,会想要伤害你。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)