Эта конкретная ошибка возникает из-за того, что ваша строка $(eval ...)
имеет отступ с помощью табуляции (то, что скрывается этим ужасно испорченным веб-интерфейсом).
Пример:
$ make -f <(printf '\t$(eval foo:;echo yup)')
/dev/fd/63:1: *** recipe commences before first target. Stop.
# now with spaces instead of TAB
$ make -f <(printf ' $(eval foo:;echo yup)')
echo yup
yup
Ошибказадокументировано в make
руководстве :
recipe commences before first target. Stop.
Это означает, что первое, что в make-файле кажется частью рецепта:начинается с префикса рецепта и не является допустимой директивой make
(например, присваивание переменной). Рецепты всегда должны быть связаны с целью.
"Символом префикса рецепта" по умолчанию является TAB.
$ make -f <(printf '\tfoo')
/dev/fd/63:1: *** recipe commences before first target. Stop.
Это не обязательно должно быть "первым делом вmakefile ", хотя: та же ошибка будет срабатывать после ряда правил, если ей предшествует директива, такая как макроопределение или такая:
$ make -f <(printf 'all:;\nkey=val\n\tfoo')
/dev/fd/63:3: *** recipe commences before first target. Stop.
И даже если макрос раскрывается в пустую строку, GNUmake не будет считать пустой строку, содержащую только макросы, расширяющиеся до пустых строк:
$ make -f <(printf '\t\nfoo:;@:')
$ make -f <(printf '\t$(info foo)\nfoo:;@:')
/dev/fd/63:1: *** recipe commences before first target. Stop.
$ make -f <(printf ' $(info foo)\nfoo:;@:')
foo