GNU Makefile 中是否有类似 python 装饰器的机制?
Is there a mechanism for something like python decorators in GNU Makefiles?
我发现自己在 Makefile 中声明 GNU make tragets phony 的两种可能性之间有点纠结。
一口气宣布所有骗子:
.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
的来源。
要制作更通用的 "decorator",您可以将其与此答案中的技术相结合:,即 define
用于构建 make 文本的部分规则,取决于输入参数。该定义随后在 foreach
循环中 call
-ed 以实际创建规则。
但是,grep
,尤其是 -P
选项可能不会出现在每个系统上。此外,包含子 makefile 可能会产生问题。此外,大多数遇到这种 DIRTY HACK 的人都会想要伤害你。
我发现自己在 Makefile 中声明 GNU make tragets phony 的两种可能性之间有点纠结。
一口气宣布所有骗子:
.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
的来源。
要制作更通用的 "decorator",您可以将其与此答案中的技术相结合:define
用于构建 make 文本的部分规则,取决于输入参数。该定义随后在 foreach
循环中 call
-ed 以实际创建规则。
但是,grep
,尤其是 -P
选项可能不会出现在每个系统上。此外,包含子 makefile 可能会产生问题。此外,大多数遇到这种 DIRTY HACK 的人都会想要伤害你。