Надо помнить, что Makefile — это не совсем bash. Он изначально не предназначен для скриптов. Его можно использовать для упрощения ввода команд, хотя основное назначение Makefile — для сборки программ из исходников. Но в иностранных видеокурсах Makefile используют разработчики для удобства: вот некоторые примеры https://chriswiegman.com/tag/make/ Что ещё не докрутила: хитрости, чтобы make воспринимал команду как make target аргумент аргумент. Вообще make не работает как стандартные скрипты, и по умолчанию всё что вводится после make считается target-ом. А аргумент можно ввести например перед командой типа ПЕРЕМЕННАЯ=значение make ... Однако я хочу докрутить Makefile для удобного использования команд Ansible. Пока что я упростила добавление сотрудников через ansible использую функцию bash. Но для меня коллег желательно бы создать Makefile. Есть некоторые примеры для Ansible на Github, я их тоже учту.
Несколько нюансов:
- файлах Makefile ввод отступа через Tab должен быть именно Tab-ом. Если у вас Tab заменяется на двойной пробел, как например в файлах .yaml для Ansible или Kubernetes, будет ошибка. Как это сделать например в редакторе vim? Надо в
.vimrcдобавить настройки:
" Сокращения: sw - shiftwidth, sts - softtabstop, ts - tabstop,
" et - expandtab, noet - noexpandtab, setl - setlocal, au - autocmd
" По умолчанию Tab делаем отступ 2 пробела
set ts=2 sts=2 sw=2 ai et
" в Makefile (makefile, and *.mk) нужен именно Tab, а не пробелы
au FileType make setl noetПо умолчанию при нажатии Tab у меня вставляется 2 пробела. А когда я создаю Makefile вставляется именно символ табуляции. Это важно, т.к. если не отобразить специально в vim невидимые символы, визуально вы никак не отличите пробелы от Tab.
-
Изначально Makefile предназначен для компиляции кода, например сборки проектов на C, C++ и т.д. Т.е. подразумевается, что в результате выполнения target-а будет создан каталог или файл с именем target-а. Из моего примера. У меня в каталоге есть подкаталог logs. Поэтому если просто так создать таргет logs и выполнить в Linux команду make logs, ничего не произойдет, и будет сообщение, что каталог уже есть. Для таких случаев есть директива
.PHONY, где мы перечисляем то, что не должно быть файлами. -
Знак
$является спецсимволом в Makefile, поэтому если задача получить переменную, выполнив команду оболочки Linux, или использовать$как спецсимвол в bash, обозначающий конец слова, надо добавить дополнительный знак доллара. Это будет видно в примере. Т.е. например мы хотим найти словоphp, т.е. только три этих буквы. В bash мы пишем^php$, а вот в Makefile надо писать^php$$. -
Для удобства добавим дополнительный target с именем help, чтобы по команде make help выводились подсказки по всем target-ам. Как мы получаем подскахки? С помощью команды awk разбираем строку так, что подсказкой является текст после двух решеток. Также результат сортируется по алфавиту (по именам target-ов).
-
По умолчанию, если просто ввести
make, будет выполнен первый target из файла. Но я использую директиву.DEFAULT_GOAL := help, чтобы по умолчанию при выполнении командыmakeбез аргументов выполняласьmake help(отображение подсказок). -
Если надо добавить пустые строки, используем
echo -e "\nтекст \n" -
Спецсимвол
@перед строкой позволяет не выводить саму команду, которая указана в строке, а выводить сразу её результат. Например, я отображаю все команды, чтобы видеть, что именно выполняется, но саму команду@echoя не отображаю, т.к. хочу, чтобы появится только итоговый текст. -
Команды внутри target -а выполняются в разных оболочках, поэтому если надо их выполнить в одной или объединить, используем обратный слеш
\.