Makefile文件是否完整?
最近在工作中,我一直在做Makefiles的一些翻译到一个替代的构build系统。 我已经看到一些漂亮的毛发在一些地方使用function图,filter,和foreach结构的代码。 这让我感到惊讶,因为我认为构build脚本应该尽可能地声明。
无论如何,这让我想到:是Makefile语言(比如最新的GNU make是特定的)图灵完成?
是的,看到这个 。 一旦你有lambda,从那里一切都是下坡。
这是一个剽窃的斐波纳契的例子
这应该足以构build更普遍的基础(我必须重新工作,否则我会打更多)。
dec = $(patsubst .%,%,$1) not = $(if $1,,.) lteq = $(if $1,$(if $(findstring $1,$2),.,),.) gteq = $(if $2,$(if $(findstring $2,$1),.,),.) eq = $(and $(call lteq,$1,$2),$(call gteq,$1,$2)) lt = $(and $(call lteq,$1,$2),$(call not,$(call gteq,$1,$2))) add = $1$2 sub = $(if $(call not,$2),$1,$(call sub,$(call dec,$1),$(call dec,$2))) mul = $(if $(call not,$2),$2,$(call add,$1,$(call mul,$1,$(call dec,$2)))) fibo = $(if $(call lt,$1,..),$1,$(call add,$(call fibo,$(call dec,$1)),$(call fibo,$(call sub,$1,..)))) fact = $(if $(call lt,$1,..),.,$(call mul,$1,$(call fact,$(call dec,$1)))) numeral = $(words $(subst .,. ,$1)) go = $(or $(info $(call numeral,$(call mul,$1,$1)) $(call numeral,$(call fibo,$1)) $(call numeral,$(call fact,$1)) ),$(call go,.$1)) _ := $(call go,)
这打印出正方形,斐波那契数字和阶乘。 数字大小似乎有16位的限制。 游民。
现在对于一个否定的答案:GNU积极阻止一些机制来创buildrecursion:
1) recursion的扩展variables
在“recursion函数”意义上不是recursion的:它们不能用自己的方式来定义:
Actually make detects the infinite loop and reports an error.
(顺便说一句,我不明白如何让他们在实践中有用。)
2) 规则链
不能recursion:
No single implicit rule can appear more than once in a chain. (...) This constraint has the added benefit of preventing any infinite loop in the search for an implicit rule chain.
(在debugging我的Makefiles时,我花了很多时间,除了所有使makefile难以维护的事情之外。
PS为一个最近的项目,我写了一个GNU make 3.82的补丁,通过一个新的-M选项去除这个限制(参见讨论 )。 这对我来说可以。