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

时间:2018-08-07 12:36:30

标签: makefile decorator gnu-make

我发现自己在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:
    ...

我怀疑类似这样的事情可能对应用程序有用,而不仅仅是发出规则欺骗,因为这只是我个人的喜好。因此,我的问题的标题更广泛。

1 个答案:

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