Ответы:
Как указано в интерактивном руководстве , наиболее распространенной причиной этой ошибки является то, что строки имеют отступы, когда make
ожидаются символы табуляции.
target:
\tcmd
где \t
ТАБ (U + 0009)
target:
....cmd
где каждый .
представляет пробел (U + 0020).
Просто ради ухмылки, и в случае, если кто-то еще столкнется с подобной ошибкой:
Я получил печально известную ошибку «отсутствует разделитель», потому что я вызвал правило, определяющее функцию как
($eval $(call function,args))
скорее, чем
$(eval $(call function,args))
то есть, ($
а не $(
.
0x20
"места" там, это правильно?
$
Для меня проблема заключалась в том, что у меня были некоторые # ...
комментарии в конце строки, встроенные в определение define ... endef
многострочной переменной. Удаление комментариев заставило проблему уйти.
define
директиве трактуются буквально. На самом деле поведение не объясняется в документации . (Для ясности: Встраивание номер знака #
. В директиве не сама ошибка синтаксиса Но это просто не интерпретируется как начало комментария, таким образом , что, по общему признанию ошибок.)
В моем случае ошибка вызвала следующее. Я пытался выполнять команды глобально, т.е. вне какой-либо цели.
UPD. Чтобы выполнить команду глобально, нужно правильно сформировать. Например, команда
ln -sf ../../user/curl/$SRC_NAME ./$SRC_NAME
станет:
$(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))
В моем случае я фактически пропустил вкладку между ними ifeq
и команду на следующей строке. Там не было пробелов с самого начала.
ifeq ($(wildcard $DIR_FILE), )
cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif
Должно было:
ifeq ($(wildcard $DIR_FILE), )
<tab>cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif
Обратите внимание, что <tab>
это фактический символ табуляции
У меня был пропущенный файл-разделитель в файлах Makefile, сгенерированных qmake. Я портировал код Qt на другую платформу. У меня не было ни QMAKESPEC, ни MAKE. Вот ссылка, на которую я нашел ответ:
https://forum.qt.io/topic/3783/missing-separator-error-in-makefile/5
Так что, очевидно, все, что мне было нужно - это пакет build-essential, затем autoconf
сначала запустить , что сделало Makefile.pre.in
, потом ./configure
то, make
что работает отлично ...
Следующий код Makefile работал:
obj-m = hello.o
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean