target: dependencies
command1
command2
В моей системе (Mac OS X), make
похоже, требуется, чтобы в Makefiles был символ табуляции, предшествующий содержимому каждой command
строки, или это вызывает синтаксическую ошибку.
Это неприятно при создании или редактировании файлов Makefile, потому что мой редактор настроен на постоянное использование всех пространств.
Можете ли вы сделать действительные файлы Makefile без символов табуляции?
Ответы:
Это странность / требование синтаксиса
make
, оно не имеет ничего общего с Mac OS X. К сожалению, вы ничего не можете с этим поделать, если собираетесь использоватьmake
.Изменить : GNU Make теперь поддерживает настраиваемый префикс рецепта. Смотрите этот ответ .
Вы не первый, кому не нравится этот аспект
make
. Процитируем Справочник ненавистников Unix :источник
.RECIPEPREFIX
). В одном из ответов ниже также упоминается это, и его следует пометить как «правильный» вместо моего. stackoverflow.com/a/21920142За время, прошедшее после того, как этот вопрос был первоначально задан, была выпущена версия GNU Make, которая позволяет вам использовать что-то иное, кроме Tabсимвола префикса. Из объявления списка рассылки :
Эта функция была добавлена в GNU Make 3.82, выпущенном в июле 2010 года (через шесть месяцев после первоначальной даты запроса этого вопроса). Поскольку, в свою очередь, прошло три года и с тех пор произошли изменения, вполне вероятно, что другие разновидности Make последовали за GNU Make.
источник
Есть запутанный способ создать действующий make-файл без вкладок.
Если вы измените свой make-файл, чтобы он читал:
Если будет работать. Если вы хотите, чтобы это было более чем в одной строке, вы можете:
Грязно, но это работает.
источник
.RECIPEPREFIX
, вероятно, лучший подход. Однако, поскольку мне не хотелось этого делать, я решил использовать решение, основанное на этом. Строка 1:,target:\
Строка 2: [отступ из четырех пробелов], за которым следует;command
Если в вашем профиле есть vimrc, вы можете добавить эту строку, чтобы vim не заменялся пробелами:
Я тоже боролся с этим, и это исправило это для меня. Распространите доброе слово!
источник
Это подходит для меня, если вы хотите использовать пробелы
пример
источник
.RECIPEPREFIX
что «Если переменная пуста (как по умолчанию ), то этот символ является стандартным символом табуляции». Это означает, что переменная определена по умолчанию. Это подтверждается использованиемifeq ($(origin .RECIPEPREFIX), undefined)
. Поскольку+=
добавить один пробел и правую часть к левому,var +=
устанавливаетсяvar
один пробел (плюс пустая строка), еслиvar
это уже было определено. (Еслиvar
не определено,+=
то же самое, что и=
.)В режиме вставки vim можно использовать
Ctrl-v <TAB>
буквальную табуляцию, даже если вы установили клавишу табуляции для вставки пробелов. Это, конечно, не отвечает на ваш вопрос, но может быть альтернативой доступным методам, позволяющим избежать необходимости буквальных вкладок.источник
Если вы используете EditorConfig , вы можете добавить в свой
.editorconfig
файл следующие строки, чтобы заставить вашу IDE использовать табуляцию для отступа вместо пробелов вMakefile
:источник
До GNU Make 4.2
Ответ Стивена Пенни работает.
Причина, по которой это работает, описана в моем комментарии .
Начиная с GNU Make 4.3 (выпущен 19 января 2020 г.)
Поведение
+=
оператора изменено обратно несовместимым образом. Если левый операнд имеет пустое значение, пробел больше не добавляется.Вместо этого вы можете использовать
, где
<space>
- одиночный пробел. Хотя$(.RECIPEPREFIX)
оно раскрывается как пустое значение, это необходимо, чтобы GNU Make не игнорировал его<space>
. Обратите внимание, что этот код работает даже в GNU Make старше версии 4.3.источник
в ubuntu: vi Makefiles заменяют пробел табуляцией (или чем угодно еще):
Например, замените 8 пробелов табуляцией:
Обратите внимание: ^ Я вставляю с помощью клавиши табуляции, а не символов ^ и I : D
источник
Не переносимо. Некоторые разновидности make абсолютно требуют символов табуляции. Еще одна причина предпочесть табуляции пробелам :-)
источник