Est-ce makefile complet Turing?
-
28-09-2019 - |
Question
Ces derniers temps au travail, je l'ai fait une traduction de Makefile à un système de construction alternative. Je l'ai vu un peu de code Faire emberlificotées dans certains endroits en utilisant une carte fonctionnelle, filtrer et constructions foreach. Cela m'a surpris car je pense que les scripts de construction devraient être aussi déclarative que possible.
En tout cas, cela me fait penser: est la langue Makefile (dire la dernière GNU make pour être précis) complète Turing?
La solution
Oui, voir cette . Une fois que vous avez lambda, il est en descente à partir de là.
Voici un plagié exemple Fibonacci
Cela devrait être suffisant pour construire une base pour plus de généralité (je dois retourner au travail, ou je jouerais plus.)
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,)
Cette imprime des carrés, des numéros de fibonacci et factorielles. Il semble y avoir une limite de 16 bits sur la taille des chiffres. Bummer.
Autres conseils
Pour une réponse négative: GNU make bloque activement des mécanismes pour créer récursion:
1) récursivement les variables étendues
ne sont pas récursifs dans le sens « de fonction récursive »: ils ne peuvent pas être définis en termes d'eux-mêmes:
Actually make detects the infinite loop and reports an error.
(je ne vois pas comment leur permettant pourraient être utiles dans la pratique, par la voie.)
2) Règle Enchaînement
ne peut pas être récursive, que ce 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 pendant ce temps de débogage mes Makefile -. En plus de toutes les autres choses qui rendent makefiles difficile à maintenir)
P.S. pour un projet récent, j'ai écrit un patch pour GNU make 3.82 qui supprime cette limitation avec une nouvelle -M (voir discussion ). Cela fonctionne très bien pour moi.