Makefile рекурсивная установка? - PullRequest
0 голосов
/ 06 июня 2018

Предположим, у меня есть следующее: Цепочка зависимостей, каждая из которых может присутствовать или не присутствовать, и каждая из которых устанавливается точно так же (за исключением того, что это строковое имя зависимости).Чтобы избавиться от повторяющегося кода makefile, я создаю прототип следующей функции:

define install_utility = 
$(1):
# recursion
$(foreach bar, $(1)_dependencies,$(eval $(call install_utility,$(bar)))
ifeq(`which $(1)`,)        # check for existence of dependency
    echo will install $(1) # show me make is executing expected commands
endif
endef

foo_dependencies=A B
foo=foo
eval $(call install_utility,$(foo))


# Expected results: 
will install A
will install B
will install foo

# Actual result: no error message, just: 
... (infinite loop that prints nothing)

И когда я запускаюсь, я получаю следующую ошибку: бесконечный цикл.

Это похоже на действительно простую функциональность.Тем не менее, я испытываю затруднения, заставляя его работать в make.Есть ли способ, которым я "должен" сделать это в make?


Немного повозился ... и получаю различные ошибки в зависимости от того, выложил ли я рекурсию:

$(1):
    $(foreach bar, ...

ifeq(`which $(1)`,)
    ...

# error messages:
make: *** no rule to make target '$(foo_dependencies)
ifeq(`which', needed by 'foo'. Stop.

1 Ответ

0 голосов
/ 06 июня 2018

Я не совсем понимаю, что вы пытаетесь сделать ... это выглядит для меня крайне непривлекательно.

Но это точно не сработает:

ifeq(`which $(1)`,)

Если вы хотите, чтобы это было частью рецепта, вы должны сделать отступ с помощью символа TAB и написать его в синтаксисе оболочки, а не создавать синтаксис.

Если вы хотите, чтобы это было частью make-файла(не рецепт) вам нужно написать его в правильном синтаксисе make: сначала вы должны включить пробел между ifeq и (.Во-вторых, make не поддерживает обратные кавычки.Если вы хотите запустить команду оболочки, вы должны использовать функцию $(shell ...).

...