【问题标题】:Is there a mechanism for something like python decorators in GNU Makefiles?GNU Makefiles 中是否有类似 python 装饰器的机制?
【发布时间】:2018-08-07 12:36:29
【问题描述】:

我发现自己有点纠结于在 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:
    ...

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

【问题讨论】:

    标签: makefile decorator gnu-make


    【解决方案1】:

    我不知道为此内置了 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的人都会想伤害你。

    【讨论】:

    • 哦,我真的很想为你的狡猾投赞成票,同时为你对同事的残忍投反对票。如果我继承了一个包含这样的 Makefile 的项目,我会……好吧,我会说一些坏话。我可能还会知道你住在哪里。哦,还有谷歌搜索附近的斧头店。
    • 为了您的理智和安心,我的回答中添加了免责声明。现在,斧头店老板会失望的。我猜,不可能取悦所有人。
    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2018-03-10
    相关资源
    最近更新 更多