Можете ли вы сделать допустимые 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
Не переносимо. Определенные вкусы абсолютно необходимы для символов табуляции. Еще одна причина для предпочтения вкладок над пробелами: -)