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 的人都会想要伤害你。