make reclama “falta de separador (você quis dizer TAB?)”

7

Ao tentar instalar o arquivo som_pak-3.1-NAcMoS.tar.gz , usei os comandos abaixo:

$ 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

Mas durante a execução do comando make , recebo o seguinte erro:

* missing separator (did you mean TAB instead of 8 spaces?). Stop.

  • Alguém pode me dizer o motivo do erro?
  • Há algum pacote necessário para incluir com isso?
por Rincy Raphael 21.04.2014 / 07:53

2 respostas

10

O erro que você está encontrando:

* missing separator (did you mean TAB instead of 8 spaces?). Stop.

Significa que makefile contém espaços em vez de Tab's. O utilitário make é notoriamente exigente quanto ao uso de Espaço ao invés de Tab . Portanto, é provável que o makefile contenha Espaço no início das sub-rotinas de regras no arquivo.

Exemplo

Digamos que eu tenha os seguintes 3% de arquivos.c:

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

Digamos que eu tenha o seguinte 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!

Agora tentamos criar um alvo

Quando eu executo o alvo helloworld :

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

Parece familiar?

Corrigindo o problema

Você pode consertar isso alterando os Espaços para os caracteres reais do Tab . Eu usei vim para reparar meu arquivo. Basta abri-lo:

$ vim makefile

E, em seguida, execute este comando dentro de:

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

Isto irá substituir todas as linhas que começam com 1 ou mais Espaços com uma Aba real .

Agora, quando eu executar novamente meu helloworld target:

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

Referências

por 21.04.2014 / 08:13
0

Como a outra resposta sugeriu, os Makefiles precisam de caracteres de tabulação, não de caracteres de espaço. Eu tenho o meu .vimrc definido para substituir automaticamente todas as guias com espaços, então eu tenho que definir manualmente a configuração inversa em Makefiles individuais. O comando vim que eu uso é o seguinte:

:%s/^[ ]\+/\t/g
    
por 24.09.2018 / 17:49