
Содержание статьи
Алексей Надалин

Похоже, разработчики боятся использовать make
поскольку они ассоциируют это с мучительным опытом сложения вещей с нуля — страшным ./configure && make && make install
.
Отчасти этот страх связан с описанием того, что делает make(1):
Цель утилиты make состоит в том, чтобы автоматически определить, какие части обширной программы нужно перекомпилировать, и выдать команды для их перекомпиляции.
Фонд свободного программного обеспечения Ручные страницы Linux
Не все знают, что можно легко использовать для управления задачами в ваших проектах. В этой статье я хотел бы поделиться кратким вступлением к тому, как Makefiles помогают мне автоматизировать некоторые задачи в моей повседневной деятельности. В этом кратком руководстве будет сосредоточено использование make в качестве инструмента автоматизации задач, а не инструмента для компиляции кода.
Выполнение задач
Давайте начнем с простого создания a Makefile
и определение задачи для выполнения:
task: date
Если бежать make task
вы столкнетесь с такой ошибкой:
/tmp ᐅ make taskMakefile:2: *** missing separator. Stop.
И это потому, что Makefiles используют вкладки для отступления кода. Давайте обновим наш пример, используя табуляции, а не пробелы, и… Вуаля.
/tmp ᐅ make taskdateFri Jun 15 08:34:15 +04 2018
Что это за колдовство такое? Ну, make
понял, что вы хотите запустить раздел task
вашего make-файла и запустил код (date
) в этом разделе оболочки, выводя как команду, так и ее выход. Если вы хотите пропустить вывод команды, которая выполняется, вы можете просто добавить к ней префикс @
знак:
task: @date
Снова запустить команду make:
/tmp ᐅ make taskFri Jun 15 08:34:15 +04 2018
Первая задача Makefile
есть по умолчанию один, что означает, что мы можем бежать make
без аргументов:
/tmp ᐅ make Fri Jun 15 08:37:11 +04 2018
Выполнение дополнительных задач
Вы можете добавить дополнительные задания в свой Makefile
и позвоните им make $TASK
:
task: @datesome: sleep 1 echo "Slept"thing: cal
Снова запустить команду make:
/tmp ᐅ make thingcal June 2018 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Выполнение задач в определенном порядке
Много раз вам захочется выполнить задание перед текущим. Думайте об этом как before
или after
крючки в ваших автоматизированных тестах. Это можно сделать, указав список задач сразу после названия задания:
task: thing some @date...
Снова запустить команду make:
/tmp ᐅ make taskcal June 2018 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
sleep 1echo "Slept"SleptFri Jun 15 08:40:23 +04 2018
Использование переменных с make
Определение и использование переменных достаточно просто:
VAR=123
print_var: echo ${VAR}...
Снова запустить команду make:
/tmp ᐅ make print_var echo 123123
Но будьте осторожны, поскольку ваши сменные оболочки не будут работать из коробки:
print_user: echo $USER
Снова запустить команду make:
/tmp ᐅ make print_user echo SERSER
Вам нужно будет уйти от них любым ${VAR}
или $$VAR
.
Передача флагов также несколько отличается от того, к чему вы привыкли. Они расположены как флажки, но используют тот же синтаксис, что и переменные среды:
print_foo: echo $$FOO
Снова запустить команду make:
/tmp ᐅ make print_fooecho $FOO
/tmp ᐅ make print_foo FOO=barecho $FOObar
Сделайте и оболочку
5.3.1 Choosing the Shell------------------------
The program used as the shell is taken from the variable `SHELL'. If this variable is not set in your makefile, the program `/bin/sh' is used as the shell.
Make будет использовать sh
для выполнения кода в задаче Это означает, что некоторые вещи могут не работать, поскольку вы, вероятно, используете синтаксис, характерный для bash. Чтобы переключиться, вы можете просто указать SHELL
переменный. В нашем случае мы хотели бы воспользоваться SHELL:=/bin/bash
.
Как видим ранее, иногда вам понадобится использовать причудливый пользовательский синтаксис, чтобы заставить обычную команду оболочки работать в make
. Так же, как переменные нужно экранировать с помощью a $$
или ${...}
вам нужно будет воспользоваться shell
при использовании командной замены:
subshell: echo $(shell echo ${USER})
Снова запустить команду make:
/tmp ᐅ make subshellecho alexalex
Не верите мне? Попытайтесь удалить shell
инструкция. Вот что вы получите:
/tmp ᐅ make subshellecho
Вывод
Есть еще многое make
может сделать, и многие другие удивительные вещи, которые вам может понадобиться выяснить, чтобы уменьшить WPS (WTF в секунду) во время работы с ним. ?
Это не отменяет того факта, что make
является чрезвычайно полезным инструментом, который позволяет нам с легкостью автоматизировать рабочие процессы (без необходимости настраивать очень сложные конвейеры), написав рядки, разделенные табуляторами, с кучей команд оболочки.
Первоначально опубликовано на odino.org (15 июня 2018 г.).
Вы можете следить за мной в Твиттере – разговоры приветствуются! ?