подавать жалобы «отсутствует разделитель (вы имели в виду TAB?)»

10

При попытке установить som_pak-3.1-NAcMoS.tar.gzфайл я использовал следующие команды:

$ 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

Но при выполнении makeкоманды я получаю следующую ошибку:

* отсутствует разделитель (вы имели в виду TAB вместо 8 пробелов?). Стоп.

  • Кто-нибудь может сказать мне причину ошибки?
  • Есть ли какие-либо пакеты должны быть включены с этим?
Ринси Рафаэль
источник
1
Откуда вы скачали этот файл?
Жиль "ТАК - перестань быть злым"

Ответы:

15

Ошибка, с которой вы столкнулись:

*** отсутствует разделитель (вы имели в виду TAB вместо 8 пробелов?). Стоп.

Означает, что makefileсодержит пробелы вместо табуляции. makeУтилита , как известно , разборчивы об использовании Spaceвместо Tab. Таким образом, вполне вероятно, что в начале файла makefileсодержится Spaceраздел правил в файле.

пример

Допустим, у меня есть следующие 3 .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;
}    

Скажем, у меня есть следующее 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!

Теперь мы пытаемся построить цель

Когда я запускаю его против цели helloworld:

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

Выглядит знакомо?

Исправление проблемы

Вы можете исправить это, изменив Spacesдействительные Tabсимволы. Я использовал, vimчтобы восстановить мой файл. Просто откройте его:

$ vim makefile

И затем выполните эту команду в:

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

ПРИМЕЧАНИЕ: ^I это специальный символ. Ввод с ^последующим Iбудет интерпретироваться по-разному по сравнению с Ctrl+ V- Ctrl+ I.

Это заменит все строки, начинающиеся с 1 или более, Spacesфактическими Tab.

Теперь, когда я перезапущу свою helloworldцель:

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

Ссылки

SLM
источник
Я получаю шаблон ошибки E486, не найденный при попытке использовать эту команду vim
Даниэль Джейкобсон,
@DanielJacobson - если у вас есть новый вопрос, пожалуйста, спросите его, комментарии не предназначены для того, чтобы задавать новые вопросы.
SLM
^ Я только что создал ^ I в самом файле вместо вкладки
Sun
1

Как и предполагал другой ответ, Makefiles нужны символы табуляции, а не пробелы. У меня есть свой .vimrcнабор для автоматической замены всех вкладок пробелами, поэтому я должен вручную установить обратную настройку в отдельных файлах Makefile. Команда, vimкоторую я использую, выглядит следующим образом:

:%s/^[ ]\+/\t/g
Эмили Герберт
источник
Я использую эту моделину (первая строка в Makefile)# vim: set noet:
Майкл Д.
0

Примечание. Правильный способ решения этой конкретной проблемы - исправить файл Makefile таким образом, чтобы каждая строка действия каждого рецепта имела отступ с использованием одного символа табуляции, а затем отправить исправление для него исходным разработчикам.

Это уродливый хак, который работает с последними версиями GNU make(если проблема в том, что Makefile последовательно использует пробелы вместо вкладок):

make '.RECIPEPREFIX+='

Это установит специальную makeпеременную GNU .RECIPEPREFIXв один пробел. Эта переменная, начиная с GNU make3.82 или около того (2007), управляет символом, используемым для префикса строк действия рецептов. Если переменная пуста (как по умолчанию), используются вкладки.

Пример,

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

Пример, показывающий его использование с >(установка переменной внутри Makefile в этом случае):

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

Смотрите также:

Кусалананда
источник