Использование утилиты redo со скриптами на D

Мы уже рассказывали про простую утилиту для сборки ваших проектов под названием redo. Также мы делали несколько версий данной утилиты — однаиз которых написана на чистом D, а вторая — на BetterC. В этой статье покажем, как можно применять утилиту redo и писать для нее скрипты на D.

Данная статья предназначена для пользователей Linux, работа в Windows и WSL не гарантируется!

В данной статье мы рассматриваем только версию на BetterC, которую можно скачать напрямую из реестра пакетов dub, а исходный код с последними правками можно посмотреть здесь. Напоминаем, версия с BetterC работает на нескольких архитектурах (Aarch64, x86), имеет небольшой размер (около 45 Кбайт) и умеет делать параллельную сборку.

Мы будем собирать саму redo из исходного кода, но можно воспользоваться версией из реестра dub (все шаги рассмотренные далее будут такими же за исключением сборки redo).

Клонируем репозиторий с SourceHat:

git clone https://git.sr.ht/\~aquaratixc/redo-bc

Переходим в папку redo и собираем ее с помощью ldc (для dmd то же самое, за исключением опции -Oz, которая замещается на просто -O):

cd redo-bc
ldc2 -betterC -Oz -release archbc.d sha256bc.d redobc.d -of redo
strip -s redo

Проверяем что собралось:

ls -lha

Копируем в /usr/bin и создаем символические ссылки, для того, чтобы использовать команды redo-ifchange, redo-ifcreate и redo-hash:

sudo cp redo /usr/bin
sudo ln -s /usr/bin/redo /usr/bin/redo-ifchange
sudo ln -s /usr/bin/redo /usr/bin/redo-ifcreate
sudo ln -s /usr/bin/redo /usr/bin/redo-hash

Убедится в том, что все прошло успешно можно с помощью команды, которая выводит список файлов redo и символических ссылок на нее:

ls /usr/bin | grep redo

Первоначальная подготовка системы сборки закончена. Однако, для работы redo со скриптами на D, да и просто для работы скриптов нам необходимо сделать еще один шаг — скачать, скомпилировать и установить rdmd.

Скачиваем rdmd:

wget -c wget -c https://raw.github.com/dlang/tools/master/rdmd.d

Собираем:

ldc2 -Oz -release rdmd.d
strip -s rdmd

Устанавливаем:

sudo cp rdmd /usr/bin

Для своей работы redo использует сборочные скрипты, которые помещаются в файлы с расширением *.do. Напоминаем, что они могут быть на любом языке программирования и не зависят от самой redo. Эта утилита занимается только отслеживанием актуальности сборки и запуском команд, необходимых для формирования цели.

Для того, чтобы создать скрипт на D, требуется просто в файл с расширением *.d, в котором есть процедура main(), первой строкой вставить следующее:

#!/usr/bin/env rdmd

И сделать файл исполняемым с помощью команды:

chmod +x <файл скрипта на D>

Но, для использования с redo, нужны будут скрипты-помощники, поскольку redo понимает скрипт в котором первой строкой прописана ссылка на sh.

Для обхода этого ограничения нам нужно создать файл *.do, который содержит следующие строки:

#!/bin/sh
./<скрипт на D>

И сделать его исполняемым:

chmod <*.do файл>

Теперь, после этого вы можете задействовать скрипт в сборочном процессе с использованием redo следующим образом:

redo <имя do-файла без расширения *.do>

Примечание автора статьи.

Можно сказать, а зачем оно все надо? Да, у нас есть dub. Но в нем есть ряд вещей, которые нас не устраивают. Первая — заточенность под репозитории на GitHub/GitLab, а остальные площадки (кстати, open-source) Codeberg, SourceHut, Notabug и т.д. авторы dub добавить не хотят несмотря на пожелания в баг-трекере. Вторая вещь — нельзя использовать D для управления процессом сборки на D, т.е. нельзя задействовать скрипты на D для каких-либо вещей и сборочный рецепт на D тоже не напишешь. Третье, что очень печалит, для dub нет такого изящного механизма добавления плагинов, как в том же cargo из Rust: в Rust очень остроумно придумали, любая программа на Rust с именем в виде cargo-<чего_нибудь> может быть перехвачена cargo и вызвана в виде cargo <чего_нибудь>, как если бы это была встроенная команда. Нам в D о таком функционале можно только мечтать…

Также стоит отметить, что redo очень маленькая программа и даже если ее нет, то можно весь ее базовый функционал за полчаса реализовать самостоятельно или даже сделать bootstrap на shell, чтобы redo смогла собрать саму себя!

И это не все, redo обладает очень большим функционалом для своего размера, и ее возможности достаточно велики и при этом не требуют особого освоения.

Данную статью, мы оставляем как рецепт, поскольку она нацелена на практическую часть и служит пошаговым руководством для создания ваших скриптов. Ниже предлагаем ряд ссылок для ознакомления.

Ссылки

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