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).


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 $(.


¿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.


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.


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

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))

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.


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


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.



-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 ...


-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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.