hacer quejas "separador faltante (¿quiso decir TAB?)"

10

Al intentar instalar el som_pak-3.1-NAcMoS.tar.gzarchivo, he usado los siguientes comandos:

$ 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

Pero al ejecutar el makecomando obtengo el siguiente error:

* Falta el separador (¿quiso decir TAB en lugar de 8 espacios?). Detener.

  • ¿Alguien puede decirme la razón del error?
  • ¿Hay algún paquete que deba incluir con esto?
Rincy Raphael
fuente
1
¿De dónde descargaste ese archivo?
Gilles 'SO- deja de ser malvado'

Respuestas:

15

El error que estás encontrando:

*** separador faltante (¿quiso decir TAB en lugar de 8 espacios?). Detener.

Significa que makefilecontiene espacios en lugar de Tab. La makeutilidad es notablemente exigente con el uso de en Spacelugar de Tab. Por lo tanto, es probable que makefilecontenga Spaceal principio de las estrofas de reglas dentro del archivo.

Ejemplo

Digamos que tengo los siguientes 3 .carchivos:

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

Digamos que tengo lo siguiente 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!

Ahora intentamos construir un objetivo

Cuando lo ejecuto contra el objetivo helloworld:

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

¿Parecer familiar?

Solucionando el problema

Puede solucionar esto cambiando los caracteres Spacesreales Tab. Solía vimreparar mi archivo. Simplemente ábralo:

$ vim makefile

Y luego ejecuta este comando dentro de:

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

NOTA: ^I es un personaje especial. La escritura ^seguida por Ise interpretará de manera diferente en comparación con Ctrl+ V- Ctrl+ I.

Esto sustituirá todas las líneas que comienzan con 1 o más Spacescon un real Tab.

Ahora cuando vuelvo a ejecutar mi helloworldobjetivo:

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

Referencias

slm
fuente
Obtengo el patrón de error E486 que no se encuentra cuando trato de usar ese comando vim
Daniel Jacobson
@DanielJacobson: si tiene una nueva Q, pregúntela, los comentarios no están destinados a hacer nuevas preguntas.
slm
^ Acabo de crear ^ I en el archivo en lugar de la pestaña
Dom
1

Como sugirió la otra respuesta, los Makefiles necesitan caracteres de tabulación, no espacios. Tengo mi .vimrcconjunto para reemplazar automáticamente todas las pestañas con espacios, así que tengo que configurar manualmente la configuración inversa en Makefiles individuales. El vimcomando que uso es el siguiente:

:%s/^[ ]\+/\t/g
Emily Herbert
fuente
Uso esta línea de modo (primera línea en Makefile)# vim: set noet:
Michael D.
0

Nota: Las formas correctas de lidiar con este problema en particular es corregir el Makefile para que cada línea de acción de cada receta se sangra con un solo carácter de tabulación, y luego enviar un parche para los desarrolladores originales.

Este es un truco feo, que funciona con versiones recientes de GNU make(si el problema es que el Makefile usa espacios en lugar de pestañas, de manera consistente):

make '.RECIPEPREFIX+='

Esto establecerá la makevariable especial GNU .RECIPEPREFIXen un solo espacio. Esta variable, desde GNU make3.82 más o menos (2007), controla el carácter utilizado para prefijar las líneas de acción de las recetas. Si la variable está vacía (como lo está por defecto), se usan pestañas.

Ejemplo,

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

Ejemplo, mostrando su uso con >(configurando la variable dentro del Makefile en este caso):

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

Ver también:

Kusalananda
fuente