mengeluh "pemisah yang hilang (maksud Anda TAB?)"

10

Saat mencoba menginstal som_pak-3.1-NAcMoS.tar.gzfile, saya telah menggunakan perintah di bawah ini:

$ tar xvf som_pak-3.1-NAcMoS.tar.gz
$ cd som_pak-3.1
$ cp makefile.unix makefile
$ make
$ cd ..
$ ln -s som_pak-3.1 $NACMOS_HOME/som_pak

Tetapi ketika menjalankan makeperintah saya mendapatkan kesalahan berikut:

* pemisah yang hilang (maksud Anda TAB bukannya 8 spasi?). Berhenti.

  • Adakah yang bisa memberi tahu saya alasan kesalahan ini?
  • Apakah ada paket yang perlu disertakan dengan ini?
Raphael Rincy
sumber
1
Dari mana Anda mengunduh file itu?
Gilles 'SO- stop being evil'

Jawaban:

15

Kesalahan yang Anda temui:

*** pemisah yang hilang (maksud Anda TAB bukannya 8 spasi?). Berhenti.

Berarti makefilemengandung spasi bukan Tab. The makeutilitas ini sangat pilih-pilih tentang penggunaan Spacebukan Tab. Jadi ada kemungkinan bahwa makefilestanzas berisi Spacedi awal aturan dalam file.

Contoh

Katakanlah saya memiliki 3 .cfile berikut :

hello.c
char *
hello() 
{
  return "Hello";
}
world.c
char *
world() 
{
  return "world";
}
main.c :
#include <stdio.h>

/* Prototypes. */
char *hello();
char *world();

int
main(int argc, char *argv[]) 
{
    printf("%s, %s!\n", hello(), world());
    return 0;
}    

Katakanlah saya memiliki yang berikut ini Makefile:

# The executable 'helloworld' depends on all 3 object files
helloworld: main.o hello.o world.o
        cc -o helloworld main.o hello.o world.o # Line starts with TAB!

# Build main.o (only requires main.c to exist)
main.o: main.c
        cc -c main.c # Line starts with TAB!

# Build hello.o (only requires hello.c to exist)
hello.o: hello.c
        cc -c hello.c # Line starts with TAB!

# Build world.o (only requires world.c to exist)
world.o: world.c
        cc -c world.c # Line starts with TAB!

#  Remove object files, executables (UNIX/Windows), Emacs backup files, 
#+ and core files
clean:
        rm -rf  *.o helloworld *~ *.core core # Line starts with TAB!

Sekarang kami mencoba membangun target

Ketika saya menjalankannya terhadap target helloworld:

$ make helloworld
makefile:3: *** missing separator (did you mean TAB instead of 8 spaces?).  Stop.

Terlihat familier?

Memperbaiki masalah

Anda dapat memperbaikinya dengan mengubah karakter yang Spacessebenarnya Tab. Saya biasa vimmemperbaiki file saya. Cukup buka saja:

$ vim makefile

Dan kemudian jalankan perintah ini di dalam:

:%s/^[ ]\+/^I/

CATATAN: ^I adalah karakter khusus. Mengetik ^diikuti oleh Iakan ditafsirkan berbeda dibandingkan Ctrl+ V- Ctrl+ I.

Ini akan menggantikan semua baris yang dimulai dengan 1 atau lebih Spacesdengan aktual Tab.

Sekarang ketika saya menjalankan kembali helloworldtarget saya :

$ make helloworld
cc -c main.c # Line starts with TAB!
cc -c hello.c # Line starts with TAB!
cc -c world.c # Line starts with TAB!
cc -o helloworld main.o hello.o world.o # Line starts with TAB!

Referensi

slm
sumber
Saya mendapatkan pola kesalahan E486 tidak ditemukan ketika saya mencoba menggunakan perintah vim
Daniel Jacobson
@DanielJacobson - jika Anda memiliki Q baru, silakan tanyakan, komentar tidak dimaksudkan untuk mengajukan pertanyaan baru.
slm
^ Saya baru saja membuat ^ I dalam file itu sendiri dan bukan tab
Sun
1

Seperti jawaban lain yang disarankan, Makefiles membutuhkan karakter tab, bukan karakter spasi. Saya memiliki .vimrcset saya untuk secara otomatis mengganti semua tab dengan spasi, jadi saya harus secara manual mengatur pengaturan terbalik di Makefiles individu. The vimperintah yang saya gunakan adalah sebagai berikut:

:%s/^[ ]\+/\t/g
Emily Herbert
sumber
Saya menggunakan modeline ini (baris pertama di Makefile)# vim: set noet:
Michael D.
0

Catatan: Cara yang benar untuk menangani masalah khusus ini adalah mengoreksi Makefile sehingga setiap baris tindakan dari setiap resep diindentasikan menggunakan karakter tab tunggal, dan kemudian mengirimkan tambalan untuk itu ke pengembang asli.

Ini adalah hack jelek, yang bekerja dengan versi GNU terbaru make(jika masalahnya adalah Makefile menggunakan spasi alih-alih tab, secara konsisten):

make '.RECIPEPREFIX+='

Ini akan mengatur makevariabel GNU khusus .RECIPEPREFIXke satu ruang. Variabel ini, sejak GNU make3.82 atau lebih (2007), mengontrol karakter yang digunakan untuk mengawali garis tindakan resep. Jika variabelnya kosong (seperti standarnya), tab digunakan.

Contoh,

$ cat Makefile
all:
  echo hello
$ make '.RECIPEPREFIX+='
echo hello
hello

Contoh, menunjukkan penggunaannya dengan >(mengatur variabel di dalam Makefile dalam kasus ini):

$ cat Makefile
.RECIPEPREFIX = >
all:
> echo hello
$ make
echo hello
hello

Lihat juga:

Kusalananda
sumber