Я пытаюсь создать Makefile, который использует рецепт, созданный с использованием синтаксиса определения. Однако я столкнулся с проблемой, когда Make считает, что к последнему предварительному условию добавлена новая строка, что приводит к ошибке «Правило не найдено». Ниже приведен минимальный рабочий пример, проблема вызвана попыткой сделать цель foo / bar.
foo:
mkdir foo
define FIZZ
foo/bar: foo
touch foo/bar
endef
$(call FIZZ)
Точное сообщение об ошибке
make: *** No rule to make target 'foo
', needed by 'foo/bar'. Stop.
Я пробовал GNU Make версии 4.1 и 4.2.1. Может ли кто-нибудь сказать мне, что я делаю не так (или это ошибка)?
Здесь вы пытаетесь расширить переменную FIZZ
, чтобы ввести
определение целевого foo/bar
(его предпосылки и рецепт) в
расширенный make-файл. $(call FIZZ)
не подходит для этого:
$(call variable,param,param,...)
может вести себя неожиданно, если аргументы содержат внедренные пробелы. Ты хочешь 8.9 Функция eval, как в:
Makefile
foo:
mkdir foo
define FIZZ
foo/bar: foo
touch foo/bar
endef
$(eval $(FIZZ))
Тогда вы получите:
$ make foo/bar
mkdir foo
touch foo/bar