Erro: separador ausente


Respostas:


364

Conforme indicado no manual online , a causa mais comum desse erro é que as linhas são recuadas com espaços quando se makeespera caracteres de tabulação.

Corrigir

target: 
\tcmd

onde \té TAB (U + 0009)

Errado

target:
....cmd

onde cada .um representa um ESPAÇO (U + 0020).


4
Você pode usar .RECIPEPREFIX para alterar o uso de caracteres. Veja: gnu.org/software/make/manual/html_node/…
aseq

16

Apenas para sorrisos, e no caso de alguém encontrar um erro semelhante:

Eu recebi o infame erro "separador ausente" porque invoquei uma regra que define uma função como

($eval $(call function,args))

ao invés de

$(eval $(call function,args))

ou seja, em ($vez de $(.


O que? :) Eu acho que você não tinha 0x20"espaço" lá, está correto?
precisa saber é o seguinte

3
@ user35443 A colocação de$
smac89

8

Este é um erro de sintaxe no seu Makefile. É muito difícil ser mais específico do que isso, sem ver o arquivo em si ou partes relevantes.


5

Para mim, o problema era que eu tinha alguns comentários de final de linha # ...incorporados a uma define ... endefdefinição de variável de várias linhas. A remoção dos comentários fez com que o problema desaparecesse.


Obrigado. Eu não sabia que os comentários na definediretiva são tratados literalmente. Na verdade, o comportamento não é explicado na documentação . (Para fins de clareza: incorporar um sinal numérico #à diretiva não é, por si só, um erro de sintaxe. Mas não é interpretado como o início de um comentário, portanto, é provável que isso
aconteça

3

Meu erro ocorreu em uma linha de declaração variável com uma extensão de várias linhas. Eu tenho um espaço à direita após o "\", que tornou essa continuação de linha inválida.

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

1

No meu caso, erro causado a seguir. Eu tentei executar comandos globalmente, ou seja, fora de qualquer destino.

UPD. Para executar o comando globalmente, é preciso estar adequadamente formado. Por exemplo comando

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

se tornaria:

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

1

No meu caso, o mesmo erro foi causado porque dois pontos :estavam ausentes no final como em staging.deploy:. Portanto, observe que pode ser um erro de sintaxe fácil.


1

No meu caso, estava faltando uma guia no meio ifeqe o comando na próxima linha. Não havia espaços para começar.

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

Deveria ter ficado:

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

Observe que <tab>é um caractere de tabulação real


0

No meu caso, esse erro foi causado pela falta de um mero espaço. Eu tinha isso se bloco no meu makefile:

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

que deveria ter sido:

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

com um espaço depois de se.



-1

Então, aparentemente, tudo que eu precisava era do pacote "build-essential", para rodar autoconfprimeiro, o que fez o Makefile.pre.in, então o ./configureentão o makeque funciona perfeitamente ...


-2

O seguinte código Makefile funcionou:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.