Действительно ли make-файлы полны по Тьюрингу?

В последнее время на работе, я делал некоторый перевод от Make-файлов до альтернативной системы сборки. Я видел, что некоторые довольно волосатые Делают код в некоторых местах с помощью функциональной карты, фильтра и конструкций foreach. Это удивило меня, так как я думаю, что сценарии сборки должны быть максимально декларативными.

Так или иначе это получило меня взгляды: язык Make-файла (скажите, что последний GNU делает, чтобы быть конкретным), полный по Тьюрингу?

46
задан Jay Conrod 13 August 2010 в 21:58
поделиться

2 ответа

Да, см. это . Когда у вас есть лямбда, все идет под откос.

Вот пример плагиата Фибоначчи

. Этого должно быть достаточно, чтобы заложить основу для большей универсальности (мне нужно вернуться к работе, или я буду играть больше)

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 бит. Облом.

43
ответ дан 26 November 2019 в 20:39
поделиться

Теперь отрицательный ответ: GNU make активно блокирует некоторые механизмы для создания рекурсии:

1) Рекурсивно расширяемые переменные

не рекурсивны в смысле «рекурсивной функции»: они не могут быть определены в терминах самих себя:

Actually make detects the infinite loop and reports an error.

(Кстати, я не понимаю, как их разрешение может быть полезно на практике.)

2) Цепочка правил

также не может быть рекурсивной:

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.

(Я потерял довольно много времени на это при отладке моих файлов Makefile - в дополнение ко всем остальным вещам, которые затрудняют поддержку make-файлов.)

PS для недавнего проекта я написал патч для GNU make 3.82 , который снимает это ограничение с помощью новой опции -M (см. обсуждение ). Он отлично работает для меня.

9
ответ дан 26 November 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: