Popełnij błąd: brak separatora

Odpowiedzi:

364

Jak wskazano w podręczniku online , najczęstszą przyczyną tego błędu jest wcięcie wierszy spacjami, gdy makeoczekiwane są znaki tabulacji.

Poprawny

target: 
\tcmd

gdzie \tjest TAB (U + 0009)

Źle

target:
....cmd

gdzie każdy .reprezentuje SPACJĘ (U + 0020).

dfa
źródło
4
Możesz użyć .RECIPEPREFIX, aby zmienić sposób użycia postaci. Zobacz: gnu.org/software/make/manual/html_node/…
aseq
16

Tylko dla uśmiechu i na wypadek, gdyby ktoś popełnił podobny błąd:

Dostałem niesławny błąd „brakującego separatora”, ponieważ wywołałem regułę definiującą funkcję jako

($eval $(call function,args))

zamiast

$(eval $(call function,args))

tzn. ($raczej niż $(.

Krazy Glew
źródło
Co? :) Chyba nie było tam 0x20„spacji”, prawda?
user35443
3
@ user35443 Umieszczenie$
smac89
8

To jest błąd składniowy w twoim Makefile. Trudno jest być bardziej szczegółowym, nie widząc samego pliku ani jego odpowiedniej części.

rozwijać
źródło
5

Dla mnie problem polegał na tym, że miałem # ...komentarze na końcu wiersza osadzone w define ... endefdefinicji zmiennej wieloliniowej. Usunięcie komentarzy sprawiło, że problem zniknął.

Hugues
źródło
Dziękuję Ci. Nie wiedziałem, że komentarze w definedyrektywie są traktowane dosłownie. W rzeczywistości zachowanie nie zostało wyjaśnione w dokumentacji . (Dla jasności: Osadzanie znak numeru #. W ramach dyrektywy sama nie jest błąd składni Ale to nie jest po prostu interpretować jako początek komentarza, więc robi to wprawdzie podatne na błędy.)
ynn
3

Mój błąd dotyczył zmiennej linii deklaracji z rozszerzeniem wieloliniowym. Mam spację po znaku „\”, co spowodowało, że niepoprawna kontynuacja linii.

MY_VAR = \
   val1 \ <-- 0x20 there caused the error.
   val2
JHarveyJr
źródło
1

W moim przypadku błąd spowodował następny. Próbowałem wykonywać polecenia globalnie, tzn. Poza jakimkolwiek celem.

UPD. Aby uruchomić komendę globalnie, trzeba być odpowiednio uformowanym. Na przykład polecenie

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

stanie się:

$(shell ln -sf ../../user/curl/$(SRC_NAME) ./$(SRC_NAME))
Yuliskov
źródło
1

W moim przypadku ten sam błąd został spowodowany, ponieważ :na końcu brakowało okrężnicy jak w staging.deploy:. Pamiętaj, że może to być łatwy błąd w składni.

Pratik
źródło
1

W moim przypadku faktycznie brakowało mi tabulatora pomiędzy ifeqi polecenia w następnym wierszu. Na początku nie było spacji.

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

Powinien był być:

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

Uwaga: <tab>to rzeczywisty znak tabulacji

Nena
źródło
0

W moim przypadku ten błąd był spowodowany brakiem jedynie spacji. Miałem to, jeśli blok w moim makefile:

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

który powinien być:

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

ze spacją po if.

Hashimoto
źródło
-1

Najwyraźniej wszystko, czego potrzebowałem, to pakiet „niezbędny do kompilacji”, a następnie autoconfnajpierw uruchomić , który stworzył Makefile.pre.in, a ./configurepotem ten, makektóry działa idealnie ...

Kl3m Michard
źródło
-2

Działa następujący kod 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
Jaishree Alavandar
źródło