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

target: dependencies
    command1
    command2

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

Это раздражение при создании или редактировании Makefiles, потому что у меня есть мой редактор, настроенный на все пробелы - все время.

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

Ответ 1

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

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

Вы не первый, кто не любит этот аспект make. Чтобы процитировать Руководство Unix Haters:

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

"И что?" вы спрашиваете: "Что не так с этим?"

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

Ответ 2

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

Если вы изменили свой make файл, прочитайте:

target: dependencies; command1; command2

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

target: dependencies; \
command1; \
command2

Беспокойно, но он работает.

Ответ 3

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

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

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

Ответ 4

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

autocmd FileType make setlocal noexpandtab

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

Ответ 5

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

Ответ 6

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

.RECIPEPREFIX +=

Пример

Ответ 7

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

[Makefile]
indent_style = tab

Ответ 8

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