From: Sergey Matveev Date: Mon, 15 Jun 2020 09:24:43 +0000 (+0300) Subject: Ну очень мне понравился redo X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=70621d6e748925421243c68ca6cb080eeb2d2fab;p=stargrave-blog.git Ну очень мне понравился redo Всего второй день вожусь с redo, но чем дальше, тем больше и больше мне он нравится! Немного его рекламы: * Может делать всё что делает make. При этом с одинаковым поведением везде, вне зависимости от десятков диалектов разносторонних Make * Без hard-coded предположений о том что вы там собираете * С гораздо меньшим количеством кода (redo можно в 100 строк POSIX shell написать) * С возможностью большого параллелизма сборки * С чётко и точно управляемыми зависимостями между целями * С отсутствием специфичного синтаксиса/нового языка: по сути -- всё есть /bin/sh, хотя без проблем можно использовать и любой другой язык * С поддержкой и рекурсии и полной информации о зависимостях одновременно (без "Recursive Make Considered Harmful" дерьма) * Создание зависимостей на основе C заголовочных файлов -- теперь абсолютно адекватно и очень просто * Используются checksum-ы, вместо timestamp-ов, гранулярность которых -- огромная проблема и они плохо работают в мире где есть NFS, mmap, VCS, FUSE, быстрые компьютеры, выполняющие много задач в пределах одной секунды, нестабильные часы. Для хранения checksum использует БД * Цели собираются атомарно -- битые/недоделанные файлы не будут считаться успешно выполненными целями, как это было бы в Make * Легко делать зависимости от параметров сборки, от конфига и предоставленных опций, что в Make проблематично * Очень удобно что явный вызов redo TGT всегда приводит к сборке этой цели, аналогично если бы она была .PHONY. В Make проблематично делать цели которые иногда хочется чтобы были PHONY, с другой, чтобы при участии в качестве зависимостей не были бы Если документация для POSIX shell это 22 экрана у меня в lynx, то в redo вообще всего несколько понятий можно назвать, полностью описывающие его возможности: redo-ifchange, redo-ifcreate, XXX.do, default.XXX.do, $1/$2/$3, .redo Это все термины которые в нём можно встретить. .redo -- state, для хранения checksum и действий (вообще в одной из реализаций которую я использовал, state хранится в куче файлов, так что это implementation specific). $1/$2/$3 -- аргументы с которыми вызываются XXX.do файлы. default.XXX.do -- цель, вызываемая в качестве fallback-а. redo-ifchange -- собирает текущую цель, если зависимости изменились. redo-ifcreate -- аналогично, но если появились (а не изменились) указанные файлы. DJB всё же гений! Мало того, что как криптограф он создал алгоритмы которые хочется везде и всюду применять: Salsa20, Poly1305, *25519, SipHash (ну не только он один его сделал), NaCl, так ещё и чисто в программерских/технических задачах он крут: maildir, Mail-Followup-To, redo, daemontools (выглядит тоже до гениальности просто и решает важнейшие задачи для демонов), DNSCurve (это то, что обязано быть вместо DNSSEC), CDB (формат БД, который Postfix например может использовать). Причём daemontools я видел и трогал только вскольз, запуская curvedns демон -- надо будет поближе присмотреться, глядишь, будет очередной killer проект от DJB. ---