我发现自己在Makefiles中声明GNU make traphons phony的两种可能性之间有些挣扎。
一个人一口气宣布所有假人:
.PHONY: targ1 targ2 targ3
targ1:
...
targ2:
...
targ3:
...
(对我而言)哪个更具可读性和整洁度。但是人们看不到哪个目标是假的。
另一种可能性是声明音律以及规则(直接在前面或后面):
.PHONY: targ1
targ1:
...
.PHONY: targ2
targ2:
...
targ3:
...
.PHONY: targ3
(对我来说)哪个更难读。我也不喜欢规则名称的重复。是否有类似python中的函数装饰器的解决方案?像这样:
@pny
targ1:
...
@pny
targ2:
...
@pny
targ3:
...
我怀疑类似这样的事情可能对应用程序有用,而不仅仅是发出规则欺骗,因为这只是我个人的喜好。因此,我的问题的标题更广泛。
答案 0 :(得分:2)
我不知道内置的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,即define
用于构建生成规则文本的部分,具体取决于输入参数。然后稍后在call
循环中foreach
编辑该定义,以自动创建规则。
但是,并非grep
(尤其是使用-P
选项)并不是在每个系统上都存在。另外,包含子makefile可能会引起问题。另外,大多数遇到此 DIRTY HACK 的人都会想伤害你。