GNU Makefiles 中是否有类似 python 装饰器的机制?

2024-01-01

我发现自己在 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(使用前将#替换为@)

GNU Makefiles 中是否有类似 python 装饰器的机制? 的相关文章

随机推荐