как использовать make как инструмент автоматизации задач

1656592568 kak ispolzovat make kak instrument avtomatizaczii zadach

Алексей Надалин

TcD0rnzbcNYghR240XeuA429p4gdt93FhJ1o
Фото Агто Нугрохо на Unsplash

Похоже, разработчики боятся использовать 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 г.).
Вы можете следить за мной в Твиттере – разговоры приветствуются! ?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *