From 70621d6e748925421243c68ca6cb080eeb2d2fab Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Mon, 15 Jun 2020 12:24:43 +0300 Subject: [PATCH] =?utf8?q?=D0=9D=D1=83=20=D0=BE=D1=87=D0=B5=D0=BD=D1=8C=20?= =?utf8?q?=D0=BC=D0=BD=D0=B5=20=D0=BF=D0=BE=D0=BD=D1=80=D0=B0=D0=B2=D0=B8?= =?utf8?q?=D0=BB=D1=81=D1=8F=20redo?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Всего второй день вожусь с 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. -- 2.48.1