Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GNU Makefiles中是否有类似python装饰器的机制?_Makefile_Decorator_Gnu Make - Fatal编程技术网

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

GNU Makefiles中是否有类似python装饰器的机制?,makefile,decorator,gnu-make,Makefile,Decorator,Gnu Make,我发现自己在两种可能性之间有点左右为难,即在makefile中声明GNU使tragets是假的 一个是一次性宣布所有虚假信息: .PHONY: targ1 targ2 targ3 targ1: ... targ2: ... targ3: ... 这样做的好处是(对我来说)更容易阅读,也更整洁。但人们无法很快看出哪些目标是假的 另一种可能是在规则的前面或后面声明虚假: 这(对我来说)更难读。我也不喜欢规则名称的重复。python中是否有类似函数装饰器的解决方案

我发现自己在两种可能性之间有点左右为难,即在makefile中声明GNU使tragets是假的

一个是一次性宣布所有虚假信息:

.PHONY: targ1 targ2 targ3

targ1:
     ...

targ2:
     ...

targ3:
     ...
这样做的好处是(对我来说)更容易阅读,也更整洁。但人们无法很快看出哪些目标是假的

另一种可能是在规则的前面或后面声明虚假:

这(对我来说)更难读。我也不喜欢规则名称的重复。python中是否有类似函数装饰器的解决方案?大概是这样的:

@pny
targ1:
    ...

@pny
targ2:
    ...

@pny
targ3:
    ...
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:
    ...

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

我不知道有什么内置的。但对于一个(不太便携,不可取)解决方案,您可以这样做:

@pny
targ1:
    ...

@pny
targ2:
    ...

@pny
targ3:
    ...
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
的源

要制作一个更通用的“装饰器”,您可以将其与以下答案中的技术结合起来:,即,
define
用于构建make规则的文本的部分,具体取决于输入参数。然后在
foreach
循环中调用该定义,以实际创建规则


但是,
grep
尤其是使用
-p
选项时,可能不会出现在每个系统上。此外,包含子makefile可能会产生问题。而且,大多数人遇到这种卑鄙的黑客行为时,都会想伤害你。

ooh,我真的想对你的狡猾行为表示赞赏,同时对你虐待同事的行为表示不满。如果我继承了一个包含这样一个Makefile的项目,我会。。。嗯,我会说一些坏话。我也可能知道你住在哪里。哦,还有谷歌搜索附近的斧头店。为了你的理智和心灵的平静,我的答案中添加了一条免责声明。现在,斧头店老板会失望的。我想不能让每个人都满意。