Les makefiles Turing sont-ils complets?

Dernièrement au travail, j’ai fait des traductions de Makefiles vers un système de construction alternatif. J’ai vu des codes Make très poilus à certains endroits en utilisant des structures fonctionnelles map, filter et foreach. Cela m’a surpris car je pense que les scripts de construction doivent être aussi déclaratifs que possible.

En tout cas, cela m’a fait réfléchir: le langage Makefile (disons que la dernière marque GNU est spécifique) Turing est-il complet?

Oui, voir ça Une fois que vous avez lambda, tout est descendu de là.

Voici un exemple plagié de Fibonacci

Cela devrait suffire à créer une base pour plus de généralité (il faut que je retourne au travail ou que je joue davantage).

dec = $(patsubst .%,%,$1) not = $(if $1,,.) lteq = $(if $1,$(if $(findssortingng $1,$2),.,),.) gteq = $(if $2,$(if $(findssortingng $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,) 

Ceci imprime des carrés, des nombres de fibonacci et des factoriels. Il semble y avoir une limite de 16 bits sur la taille des numéros. Dommage.

Maintenant, pour une réponse négative: GNU make bloque activement certains mécanismes pour créer la récursivité:

1) Variables récursivement étendues

ne sont pas récursifs dans le sens de “fonction récursive”: ils ne peuvent pas être définis en eux-mêmes:

 Actually make detects the infinite loop and reports an error. 

(Je ne vois pas comment les autoriser pourrait être utile dans la pratique, en passant.)

2) Chaînage des règles

ne peut pas être récursif, soit:

 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. 

(J’ai perdu beaucoup de temps à ce sujet lors du débogage de mes Makefiles – en plus de toutes les autres choses qui rendent les fichiers makefiles difficiles à maintenir.)

PS pour un projet récent, j’ai écrit un patch pour GNU make 3.82 qui supprime cette limitation avec une nouvelle option -M (voir la discussion ). Ça fonctionne bien pour moi.