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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top