Hacer error: falta separador

Respuestas:

364

Como se indica en el manual en línea , la causa más común de ese error es que las líneas están sangradas con espacios cuando se makeesperan caracteres de tabulación.

Correcto

target: 
\tcmd

donde \testá TAB (U + 0009)

Incorrecto

target:
....cmd

donde cada uno .representa un ESPACIO (U + 0020).

dfa
fuente
44
Puedes usar .RECIPEPREFIX para cambiar los usos del personaje. Ver: gnu.org/software/make/manual/html_node/…
aseq
16

Solo por sonrisas, y en caso de que alguien más se encuentre con un error similar:

Obtuve el infame error "separador faltante" porque invoqué una regla que define una función como

($eval $(call function,args))

más bien que

$(eval $(call function,args))

es decir, en ($lugar de $(.

Krazy Glew
fuente
¿Qué? :) Supongo que no tenías 0x20"espacio" allí, ¿es correcto?
user35443
3
@ user35443 La ubicación de$
smac89
8

Este es un error de sintaxis en su Makefile. Es bastante difícil ser más específico que eso, sin ver el archivo en sí, o partes relevantes del mismo.

relajarse
fuente
5

Para mí, el problema era que tenía algunos # ...comentarios de fin de línea integrados en una define ... endefdefinición de variable de varias líneas. Eliminar los comentarios hizo que el problema desapareciera.

Hugues
fuente
Gracias. No sabía que los comentarios en la definedirectiva son tratados literalmente. En realidad, el comportamiento no se explica en la documentación . (Para mayor claridad: Incorporación de un signo de número #. Dentro de la Directiva no es en sí un error de sintaxis Pero simplemente no se interpreta como un inicio de un comentario, para hacer eso es ciertamente propenso a errores.)
ynn
3

Mi error fue en una línea de declaración variable con una extensión de varias líneas. Tengo un espacio final después de "\" que hizo que la continuación de una línea no válida.

MY_VAR = \
   val1 \ <-- 0x20 there caused the error.
   val2
JHarveyJr
fuente
1

En mi caso, el error causado a continuación. Intenté ejecutar comandos globalmente, es decir, fuera de cualquier objetivo.

UPD Para ejecutar el comando globalmente, uno debe estar formado correctamente. Por ejemplo comando

ln -sf ../../user/curl/$SRC_NAME ./$SRC_NAME

se convertiría:

$(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))
yuliskov
fuente
1

En mi caso, se produjo el mismo error porque :faltaban dos puntos al final como en staging.deploy:. Tenga en cuenta que puede ser un error de sintaxis fácil.

Pratik
fuente
1

En mi caso, en realidad me faltaba una pestaña en el medio ifeqy el comando en la siguiente línea. No había espacios para empezar.

ifeq ($(wildcard $DIR_FILE), )
cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

Debería haber sido:

ifeq ($(wildcard $DIR_FILE), )
<tab>cd $FOLDER; cp -f $DIR_FILE.tpl $DIR_FILE.xs;
endif

Tenga en cuenta que <tab>es un carácter de tabulación real

Nena
fuente
0

En mi caso, este error fue causado por la falta de un mero espacio. Tuve esto si bloque en mi archivo MAKE:

if($(METHOD),opt)
CFLAGS=
endif

que debería haber sido:

if ($(METHOD),opt)
CFLAGS=
endif

con un espacio después de si.

Hashimoto
fuente
-1

Aparentemente, todo lo que necesitaba era el paquete "build-essential", luego ejecutar autoconfprimero, lo que hizo que Makefile.pre.in, ./configureluego el makeque funciona perfectamente ...

Kl3m Michard
fuente
-2

El siguiente código Makefile funcionó:

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
Jaishree Alavandar
fuente