Я использую gnu make и в Makefile, который у меня есть, я вижу следующее правило. Я хочу добавить похожее правило с рецептом, но когда я добавляю правило и его рецепт на следующей строке, давая табуляцию или пробел для рецепта, я получаю ошибку make.
dummy :
@echo $(OBJS)
Когда я включил команду vim :set list, я увидел:
dummy :$
^I@echo $(OBJS)$
Какие именно символы находятся перед строкой рецепта (вторая строка), делая отступ от начала строки?
Как ввести их с помощью клавиатуры (без необходимости копировать и вставлять существующее правило, а затем изменять его?
Где я могу найти информацию о различных пробелах/отступах, которые можно использовать при создании Makefile с самого начала, вручную (не с помощью automake или другого инструмента, созданного makefile)?
решение1
Рецепты в makefileдолжендолжен предшествовать один стандартный tab
символ и ничего больше.
^I
представляет собой представление символа табуляции (см. таблицу в Википедии)ASCIIстраница), и поэтому это должно быть правильно.
Таким образом, вы сможете ввести его с помощью Tabили Ctrl+ I.
(при условии, что они не переназначены программным обеспечением)
Редактировать
При дальнейшем расследовании выяснилось, что выможетизменить символ, который должен предшествовать всем строкам рецепта на вкладке, установив.RECIPEPREFIX
специальная переменная.
Если это значение определено в вашем makefile, все рецептыпослев определении необходимо использовать этот символ вместо символа табуляции.
решение2
После выбора некоторых указаний из ответа, данного DMA57361 выше, и еще некоторых манипуляций, я заметил, что давным-давно в моем .vimrc у меня была эта команда set expandtab
(она заменяет табуляции пробелами), и я использую vim.
Это портило символ Tab, который я вводил в правилах Makefile. Комментирование этой строки в .vimrc помогло, и у меня это работает.
решение3
В свете принятого ответа: рецепты должны предваряться символом tab
, который автоматически заменяется, если set expandtab
включен в вашем .vimrc
. Перезапись вашего .RECIPEPREFIX
не рекомендуется, так как это нарушает make-файлы в кодовых базах, которые вы скачали. Наивный подход заключается в том, чтобы просто удалить set expandtab
из вашей конфигурации, но вы можете обойти это, добавив строку
autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
.
Это отключается expandtab
только при редактировании make-файла.