Beschwerden machen "fehlendes Trennzeichen (meinten Sie TAB?)"

10

Beim Versuch, die som_pak-3.1-NAcMoS.tar.gzDatei zu installieren , habe ich die folgenden Befehle verwendet:

$ 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

Beim Ausführen des makeBefehls wird jedoch der folgende Fehler angezeigt:

* fehlendes Trennzeichen (meinten Sie TAB anstelle von 8 Leerzeichen?). Halt.

  • Kann mir jemand den Grund für den Fehler nennen?
  • Gibt es Pakete, die dazu gehören müssen?
Rincy Raphael
quelle
1
Woher haben Sie diese Datei heruntergeladen?
Gilles 'SO - hör auf böse zu sein'

Antworten:

15

Der Fehler, auf den Sie stoßen:

*** fehlendes Trennzeichen (meinten Sie TAB anstelle von 8 Leerzeichen?). Halt.

Bedeutet, dass das makefileLeerzeichen anstelle von Tabulatoren enthält. Das makeDienstprogramm ist notorisch wählerisch in Bezug auf die Verwendung von Spacestatt Tab. Es ist also wahrscheinlich, dass die makefileZeilengruppen Spaceam Anfang von Regeln enthalten sind.

Beispiel

Angenommen, ich habe die folgenden 3 .cDateien:

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

Angenommen, ich habe Folgendes 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!

Jetzt versuchen wir ein Ziel zu erstellen

Wenn ich es gegen das Ziel laufen lasse helloworld:

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

Ähnlich aussehend?

Behebung des Problems

Sie können dies beheben, indem Sie die Zeichen Spacesin tatsächliche ändern Tab. Ich habe vimmeine Datei repariert. Einfach öffnen:

$ vim makefile

Führen Sie diesen Befehl dann aus in:

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

HINWEIS: ^I ist ein Sonderzeichen. Die Eingabe ^gefolgt von Iwird anders interpretiert als Ctrl+ V- Ctrl+ I.

Dadurch werden alle Zeilen, die mit 1 oder mehr beginnen, Spacesdurch eine tatsächliche ersetzt Tab.

Wenn ich jetzt mein helloworldZiel erneut ausführe :

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

Verweise

slm
quelle
Ich erhalte das E486-Fehlermuster nicht gefunden, wenn ich versuche, diesen vim-Befehl zu verwenden
Daniel Jacobson
@ DanielJacobson - Wenn Sie ein neues Q haben, fragen Sie es bitte. Kommentare sind nicht dazu gedacht, neue Fragen zu stellen.
slm
^ Ich habe gerade erstellt ^ I in der Datei selbst anstelle von tab
So
1

Wie in der anderen Antwort vorgeschlagen, benötigen Makefiles Tabulatorzeichen und keine Leerzeichen. Ich habe meine .vimrcEinstellung, alle Registerkarten automatisch durch Leerzeichen zu ersetzen, daher muss ich die umgekehrte Einstellung in einzelnen Makefiles manuell festlegen. Der vimBefehl, den ich benutze, lautet wie folgt:

:%s/^[ ]\+/\t/g
Emily Herbert
quelle
Ich benutze diese Modeline (erste Zeile in Makefile)# vim: set noet:
Michael D.
0

Hinweis: Die richtige Möglichkeit, mit diesem speziellen Problem umzugehen, besteht darin, das Makefile so zu korrigieren, dass jede Aktionszeile jedes Rezepts mit einem einzelnen Tabulatorzeichen eingerückt wird, und dann einen Patch dafür an die ursprünglichen Entwickler zu senden.

Dies ist ein hässlicher Hack, der mit neueren Versionen von GNU funktioniert make(wenn das Problem darin besteht, dass das Makefile konsistent Leerzeichen anstelle von Tabulatoren verwendet):

make '.RECIPEPREFIX+='

Dadurch wird die spezielle GNU- makeVariable .RECIPEPREFIXauf ein einzelnes Leerzeichen gesetzt. Diese Variable makesteuert seit GNU 3.82 oder so (2007) das Zeichen, das zum Präfixieren der Aktionszeilen der Rezepte verwendet wird. Wenn die Variable leer ist (wie standardmäßig), werden Registerkarten verwendet.

Beispiel,

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

Beispiel für die Verwendung mit >(Festlegen der Variablen im Makefile in diesem Fall):

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

Siehe auch:

Kusalananda
quelle