fazer reclamações "faltando separador (você quis dizer TAB?)"

10

Ao tentar instalar o som_pak-3.1-NAcMoS.tar.gzarquivo, 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, ao executar o makecomando, estou recebendo o seguinte erro:

* separador ausente (você quis dizer TAB em vez de 8 espaços?). Pare.

  • Alguém pode me dizer o motivo do erro?
  • Existe algum pacote necessário para incluir isso?
Rincy Raphael
fonte
1
De onde você baixou esse arquivo?
Gilles 'SO- stop be evil'

Respostas:

15

O erro que você está encontrando:

*** separador ausente (você quis dizer TAB em vez de 8 espaços?). Pare.

Significa que o makefilecontém espaços em vez de tabulações. O makeutilitário é notoriamente exigente quanto ao uso de, em Spacevez de Tab. Portanto, é provável que makefilecontenha Spaceno início das sub-rotinas da regra no arquivo.

Exemplo

Digamos que tenho os seguintes 3 .carquivos:

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 tenho 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 construir um alvo

Quando eu corro contra 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 corrigir isso alterando os caracteres Spacespara reais Tab. Eu costumava vimreparar meu arquivo. Basta abri-lo:

$ vim makefile

E, em seguida, execute este comando dentro de:

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

NOTA: ^I é um caractere especial. A digitação ^seguida por Iserá interpretada de forma diferente em comparação com Ctrl+ V- Ctrl+ I.

Isso substituirá todas as linhas que começam com 1 ou mais Spacespor uma real Tab.

Agora, quando reexecuto meu helloworldalvo:

$ 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

slm
fonte
Recebo E486 padrão de erro não encontrado ao tentar usar esse comando vim
Daniel Jacobson
@ DanielJacobson - se você tem um novo Q, pergunte, os comentários não são para fazer novas perguntas.
slm
^ I acabou de criar ^ I no próprio em vez de guia do arquivo
Sun
1

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

:%s/^[ ]\+/\t/g
Emily Herbert
fonte
I usar este modeline (primeira linha no Makefile)# vim: set noet:
Michael D.
0

Nota: As maneiras corretas de lidar com esse problema específico são corrigir o Makefile para que cada linha de ação de cada receita seja recuada usando um único caractere de tabulação e, em seguida, envie um patch para os desenvolvedores originais.

Este é um truque feio, que funciona com versões recentes do GNU make(se o problema for que o Makefile usa espaços em vez de guias, de forma consistente):

make '.RECIPEPREFIX+='

Isso definirá a makevariável GNU especial .RECIPEPREFIXpara um único espaço. Essa variável, desde o GNU make3.82 ou mais (2007), controla o caractere usado para prefixar as linhas de ação das receitas. Se a variável estiver vazia (como por padrão), serão usadas guias.

Exemplo,

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

Exemplo, mostrando seu uso com >(configurando a variável dentro do Makefile neste caso):

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

Veja também:

Kusalananda
fonte