Можете ли вы сделать действительные Make-файлы без символов табуляции? - PullRequest
102 голосов
/ 25 января 2010
target: dependencies
    command1
    command2

В моей системе (Mac OS X) make, кажется, требует, чтобы файлы Makefiles имели символ табуляции, предшествующий содержанию каждой строки command, или он выдает синтаксическую ошибку.

Это раздражает, когда я создаю или редактирую Makefile, потому что мой редактор настроен так, что он все время в пространстве.

Можете ли вы создавать действительные файлы Makefile без символов табуляции?

Ответы [ 8 ]

105 голосов
/ 25 января 2010

Это синтаксис странность / требование make, он не имеет ничего общего с Mac OS X. К сожалению, вы ничего не можете с этим поделать, если собираетесь использовать make.

Редактировать : GNU Make теперь поддерживает пользовательский префикс рецепта. См. этот ответ .

Вы не первый, кто не любит этот аспект make. Цитировать Справочник Unix Haters :

Проблема с Makefile Денниса состоит в том, что когда он добавил строку комментария, он случайно вставил пробел перед символом табуляции в начале строки 2. Символ табуляции является очень важной частью синтаксиса Makefile. Все командные строки (строки, начинающиеся с cc в нашем примере) должны начинаться с табуляции. После того, как он внес изменения, в строке 2 этого не произошло, поэтому возникла ошибка.

«И что?» - спросите вы. «Что с этим не так?»

В этом нет ничего плохого. Просто когда вы рассматриваете, как работают другие инструменты программирования в Unix, использование вкладок в качестве части синтаксиса похоже на одну из ловушек для панджи в «Зеленых беретах»: бедный ребенок из Канзаса идет пешком перед Джоном Уэйном и не делает не вижу провода отключения. В конце концов, на кукурузных полях Канзаса нет проводов, за которыми стоит следить. БУМ!

51 голосов
/ 21 февраля 2014

Со времени, когда этот вопрос был задан изначально, была выпущена версия GNU Make, которая позволяет вам использовать что-то отличное от Tab в качестве префикса. Из объявления в списке рассылки :

Новая специальная переменная: .RECIPEPREFIX позволяет вам сбросить рецепт вводный символ по умолчанию (TAB) к чему-то еще. первый символ этого значения переменной - введение нового рецепта персонаж. Если для переменной задана пустая строка, TAB используется снова. Его можно установить и сбросить по желанию; рецепты будут использовать значение, активное когда они были впервые проанализированы. Чтобы обнаружить эту функцию, проверьте значение $ (. RECIPEPREFIX).

Эта функция была добавлена ​​в GNU Make 3.82, выпущенную в июле 2010 года (через шесть месяцев после первоначальной даты запроса этого вопроса). Поскольку прошло уже три года и с тех пор происходят изменения, вполне вероятно, что другие разновидности Make следовали GNU Make.

49 голосов
/ 12 декабря 2010

Существует запутанный способ иметь правильный make-файл без вкладок.

Если вы измените свой make-файл на:

target: dependencies; command1; command2

Если будет работать. Если вы хотите, чтобы это было более чем в одной строке, то вы можете сделать:

target: dependencies; \
command1; \
command2

Грязно, но работает.

30 голосов
/ 14 октября 2013

Если у вас есть vimrc в вашем профиле, вы можете добавить эту строку, чтобы предотвратить переход vim на пробелы:

autocmd FileType make setlocal noexpandtab

Я тоже боролся с этим, и это исправило это для меня. Распространите доброе слово!

16 голосов
/ 05 октября 2014

Это мне подходит, если вы хотите использовать пробелы

.RECIPEPREFIX +=

Пример

11 голосов
/ 15 августа 2013

В режиме вставки vim можно использовать Ctrl-v <TAB> для вставки буквенной вкладки, даже если вы установили клавишу табуляции для вставки пробелов. Конечно, это не отвечает на ваш вопрос, но может быть альтернативой доступным методам, чтобы избежать необходимости использовать буквенные вкладки.

5 голосов
/ 28 февраля 2017

Если вы используете EditorConfig , вы можете добавить следующие строки в файл .editorconfig, чтобы заставить IDE использовать табуляцию для отступа вместо пробелов в Makefile:

[Makefile]
indent_style = tab
0 голосов
/ 25 января 2010

Не переносимо. Некоторые ароматы делают абсолютно обязательными символы табуляции Еще одна причина предпочтения табуляции над пробелами: -)

...