Buat kesalahan: pemisah hilang

234

Saya menjalankan kesalahan berikut make:

Makefile:168: *** missing separator.  Stop.

Apa yang menyebabkan ini?

Renjith G
sumber
Apakah ini menjawab pertanyaan Anda? makefile: 4: *** pemisah yang hilang. Stop
SS Anne

Jawaban:

364

Seperti ditunjukkan dalam manual online , penyebab paling umum untuk kesalahan itu adalah bahwa garis diindentasi dengan spasi saat makemengharapkan karakter tab.

Benar

target: 
\tcmd

dimana \tTAB (U + 0009)

Salah

target:
....cmd

di mana masing-masing .mewakili SPACE (U + 0020).

dfa
sumber
4
Anda dapat menggunakan .RECIPEPREFIX untuk mengubah karakter yang digunakan. Lihat: gnu.org/software/make/manual/html_node/…
aseq
16

Hanya untuk menyeringai, dan kalau-kalau ada orang lain mengalami kesalahan yang sama:

Saya mendapat kesalahan "pemisah yang hilang" yang terkenal karena saya telah menjalankan aturan yang mendefinisikan fungsi sebagai

($eval $(call function,args))

daripada

$(eval $(call function,args))

yaitu ($bukan $(.

Krazy Glew
sumber
Apa? :) Saya kira Anda tidak memiliki 0x20"ruang" di sana, apakah itu benar?
user35443
3
@ user35443 Penempatan$
smac89
8

Ini adalah kesalahan sintaksis di Makefile Anda. Cukup sulit untuk lebih spesifik dari itu, tanpa melihat file itu sendiri, atau bagian yang relevan.

beristirahat
sumber
5

Bagi saya, masalahnya adalah bahwa saya memiliki beberapa # ...komentar end-of-line yang tertanam dalam define ... endefdefinisi variabel multi-line. Menghapus komentar membuat masalah hilang.

Peluk
sumber
Terima kasih. Saya tidak tahu komentar dalam definearahan diperlakukan secara harfiah. Sebenarnya perilaku itu tidak dijelaskan dalam dokumentasi . (Untuk kejelasan: Menyematkan tanda angka #di dalam direktif itu sendiri bukan kesalahan sintaks. Tapi itu tidak diartikan sebagai awal dari sebuah komentar, jadi melakukan hal itu memang cenderung rawan kesalahan.)
ynn
3

Kesalahan saya ada pada baris deklarasi variabel dengan ekstensi multi-baris. Saya memiliki spasi tambahan setelah "\" yang menjadikannya kelanjutan garis yang tidak valid.

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

Dalam kasus saya kesalahan yang disebabkan selanjutnya. Saya sudah mencoba menjalankan perintah secara global yaitu di luar target apa pun.

UPD. Untuk menjalankan perintah secara global, seseorang harus dibentuk dengan benar. Misalnya perintah

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

akan menjadi:

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

Dalam kasus saya, kesalahan yang sama disebabkan karena titik dua :hilang pada akhirnya seperti pada staging.deploy:. Jadi catat bahwa itu bisa menjadi kesalahan sintaksis yang mudah.

Pratik
sumber
1

Dalam kasus saya, saya benar-benar kehilangan tab di antara ifeqdan perintah di baris berikutnya. Tidak ada ruang untuk memulai.

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

Seharusnya:

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

Perhatikan bahwa <tab>ini adalah karakter tab yang sebenarnya

Nena
sumber
0

Dalam kasus saya, kesalahan ini disebabkan oleh kurangnya ruang belaka. Saya punya ini jika memblokir di makefile saya:

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

yang seharusnya:

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

dengan spasi setelah jika.

Hashimoto
sumber
-1

Begitu rupanya, semua saya butuhkan adalah "build-essential" paket, maka untuk menjalankan autoconfpertama, yang membuat Makefile.pre.in, maka ./configuremaka makeyang bekerja sempurna ...

Kl3m Michard
sumber
-2

Kode Makefile berikut berfungsi:

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
sumber