fare lamentele "separatore mancante (intendevi TAB?)"


10

Durante il tentativo di installare il som_pak-3.1-NAcMoS.tar.gzfile, ho usato i comandi seguenti:

$ 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

Ma durante l'esecuzione del makecomando viene visualizzato il seguente errore:

* separatore mancante (intendevi TAB invece di 8 spazi?). Fermare.

  • Qualcuno può dirmi il motivo dell'errore?
  • C'è qualche pacchetto da includere in questo?

1
Da dove hai scaricato quel file?
Gilles 'SO- smetti di essere malvagio' il

Risposte:


15

L'errore che stai riscontrando:

*** separatore mancante (intendevi TAB invece di 8 spazi?). Fermare.

Significa che makefilecontiene spazi anziché Tab. L' makeutilità è notoriamente esigente riguardo all'uso di Spaceinvece di Tab. Quindi è probabile che makefilecontenga Spaceall'inizio delle stanze delle regole all'interno del file.

Esempio

Diciamo che ho i seguenti 3 .cfile:

Ciao 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;
}    

Di 'che ho il seguente 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!

Ora proviamo a costruire un obiettivo

Quando lo eseguo contro l'obiettivo helloworld:

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

Ti sembra familiare?

Risolvere il problema

È possibile risolvere questo problema cambiando Spacesin Tabcaratteri effettivi . Ero solito vimriparare il mio file. Basta aprirlo:

$ vim makefile

E quindi eseguire questo comando all'interno di:

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

NOTA: ^I è un carattere speciale. La digitazione ^seguita da Iverrà interpretata diversamente rispetto a Ctrl+ V- Ctrl+ I.

Questo sostituirà tutte le righe che iniziano con 1 o più Spacescon un effettivo Tab.

Ora, quando riesco a helloworldraggiungere il mio obiettivo:

$ 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!

Riferimenti


Ottengo il pattern di errore E486 non trovato quando provo ad usare quel comando vim
Daniel Jacobson

@DanielJacobson - se hai una nuova Q per favore, chiedila, i commenti non sono fatti per porre nuove domande.
slm

^ Ho appena creato ^ I nel file stesso anziché in tab
Dom

1

Come suggerito dall'altra risposta, i Makefile necessitano di caratteri tab, non di spazi. Ho il mio .vimrcset per sostituire automaticamente tutte le schede con spazi, quindi devo impostare manualmente l'impostazione inversa nei singoli Makefile. Il vimcomando che uso è il seguente:

:%s/^[ ]\+/\t/g

Uso questa modeline (prima riga in Makefile)# vim: set noet:
Michael D.

0

Nota: il modo corretto di affrontare questo particolare problema è correggere il Makefile in modo che ogni riga di azione di ogni ricetta sia rientrata usando un singolo carattere di tabulazione e quindi inviare una patch per esso agli sviluppatori originali.

Questo è un brutto hack, che funziona con le versioni recenti di GNU make(se il problema è che il Makefile usa costantemente spazi anziché tab):

make '.RECIPEPREFIX+='

Questo imposterà la speciale makevariabile GNU .RECIPEPREFIXsu un singolo spazio. Questa variabile, a partire da GNU make3.82 o giù di lì (2007), controlla il carattere utilizzato per il prefisso delle linee d'azione delle ricette. Se la variabile è vuota (per impostazione predefinita), vengono utilizzate le schede.

Esempio,

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

Esempio, mostrando il suo uso con >(impostando la variabile all'interno del Makefile in questo caso):

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

Guarda anche:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.