[devel] I: what's new in texlive.

Igor Vlasenko vlasenko на imath.kiev.ua
Пт Янв 19 21:14:26 MSK 2018


Уважаемые господа,

Хочу немного рассказать о новой сборке texlive.

Буду писать частями в рассылку, а итоговый
документ хочу оставить на wiki.

=== Введение в TeX Live ===

Напомню сначала, что такое TeX Live.
TeX Live -- это дистрибутив TeX.
Если заглянуть внутрь texlive iso,
то мы увидим установщик / пакетный менеджер
и собственно репозиторий пакетов texlive
в папке archive. Пакеты имеют вид tar.xz
архивов, в них, кроме файлов, есть спек,
в котором есть аналоги summary, description,
license, url, post/postun scripts и т.д.

Из пакетов устанавливаются бинарники на основе ядра web2c
и расширения со CTAN.

Специфика TeX Live --- множество мелких пакетов ---
более 2000 (с учетом -doc и -source -- более 5000),
чтобы каждый проект на CTAN был в отдельном пакете.
Этим он отличается от таких дистрибутив TeX, как TeTeX (Устарел),
где в небольшое количество пакетов были собраны целые коллекции
разных проектов.

Замечу, что сборку texlive-2008.0 в ALTLinux
называть texlive не совсем корректно.
Это порожденный продукт, улучшенный дистрибутив,
основанный на файловой, но не пакетной базе TeX Live,
с другой идеологией (малого числа больших пакетов, как у TeTeX),
с рядом оригинальных решений ---
фактически, отдельный уникальный дистрибутив TeX.

Сложность поддержки такого продукта на порядок выше,
этим и объясняется, что он в итоге так и не обновился после выпуска.

Я же упрощаю себе задачу тем, что собираю почти чистый TeX Live.
При таком подходе собрать TeX Live -- это сконвертировать
уже готовые пакеты TeX Live в пакеты rpm.

Опакетить чистый TeX Live --- не просто, но у меня есть
наработки. texlive-package-builder (в git, в процессе разработки)
С его помощью можно будет генерировать src.rpm из последних
версий пакетов texlive.

Но миграцию по частям провести нормально не получится, а отправлять
5000+ пакетов в incoming --- это DDoS'ить его.
Да и собираться такая транзакция будет неделями,
а если не с первой попытки --- месяцами.

В общем, чтобы получить что-то готовое и рабочее поскорее,
а не тянуть до весны (лета?) я пошел по другому проторенному пути --
импорта пакетов.

В SuSE TeX Live 2017, но собирается из 29 пакетов,
в Федоре TeX Live 2016, но собирается из 1 пакета.
Кроме того, 3 года назад у меня уже получилось импортировать
тогдашний TeX Live 2014 из Федоры, так что остались наработки.

Поэтому я решил импортировать из Федоры TeX Live 2016,
чтобы в кратчайшие сроки получить готовое обновление.
Затем, пока оно будет тестироваться, переносить заготовки по
импорту на SuSE TeX Live 2017.
Таким образом, иметь возможность обновиться до TeX Live 2017
не будучи скован сроками.

=== Как работает импорт и как пользоваться. ===

Начну с Федоры. Чтобы понять их сборку, нужно посмотреть в
git://pkgs.fedoraproject.org/texlive.git
там находится их конвертер спеков texlive в спек/спеки rpm
(в зависимости от режима: один монолитный srpm или множество отдельных
srpm). Конвертер написан на C, его основной исходник --- tl2rpm.c .
Об особенностях сборки texlive в Федоре в той степени,
в которой они попадут в Сизиф, я напишу далее.

Чтобы получить из нее сборку texlive для ALT, можно было бы
править в их git шаблоны и код конвертера. Такой подход возможен, 
и у меня остались с прошлой попытки некоторые наработки.
Однако так я сильно бы привязался к сборке Федоры,
чего не хотелось бы.

Более универсальное решение --- воспользоваться импортом.
Запуск импортера выглядит так:
 fcmass --changelog '- test build 01' texlive

После вызова, в папке OUT будет результат импорта.
К сожалению, после импортера пакет еще нужно дошлифовывать.
Хорошо, однако, что дошлифовывание тоже можно оформить как
скрипт и далее дошлифовывать сам скрипт дошлифовывания :).
Этот скрипт сейчас находится в

http://git.altlinux.org/people/viy/packages/fcimport.git

именно, это fcimport.git/hooks/texlive.pl .
Чтобы им воспользоваться, достаточно склонировать fcimport.git
и вызвать fcmass внутри fcimport.git. hooks/texlive.pl
будет подгружен автоматически.

Чтобы перейти на импорт из SuSE, нужно адаптировать к нему код
из fcimport.git/hooks/texlive.pl. Затем достаточно будет склонировать

http://git.altlinux.org/people/viy/packages/suseimport.git

и выполнить там
 susemass --changelog '- texlive 2017 from SuSE' texlive

При этом, под конкретную импортированную версию и сборку texlive
можно указывать и дополнительные оптимизации. Например, при импорте
из Федоры я добавляю опцию 
 --sourcedep-sourcenum-allow-mask=0,1335,1382,6128
В srpm из Федоры содержится более 7000 тегов Source:,
для каждого из которых выполняется анализ исходников для
генерации BuildRequires:. Для более 7000 исходников это занимает
более 10 минут. Указав только существенные номера исходников,
можно резко сократить время анализа.
Также в hooks/texlive.pl есть опция $draft_mode=1,
ее надо сбросить в 0 для сборки в Сизиф.

=== Особенности импортированной сборки и ее отличия от ALTLinux TexLive 2008.0 ===

==== 1) переезд в другой каталог. ====

Вместо /usr/share/texmf-texlive сейчас /usr/share/texlive/texmf-dist.
Это можно поменять на что-либо другое, только не на /usr/share/texmf,
которое по нашему полиси зарезервировано для дистрибутивно-нейтральных
сборок расширений TeX.

Я не хочу оставлять как есть -- в alt texlive-2008 использовались
свои несовместимые пакеты, и пришлось бы почти в каждый пакет
нового texlive добавлять Conflicts:. С переездом в другой каталог
достаточно около 30 Conflicts:, без него надо было бы более 5000 ---
не стоит лишний раз раздувать rpm db.

==== 2) пакеты. ====
Заметим, что в сборку texlive в Федоре включены почти все пакеты
texlive, не все пакеты. Например, biber и latexmk собираются отдельно.
Подробнее см. tl2rpm.c .

biber я в Сизиф собрал, для замыкания зависимостей,
а latexmk и другие буду разбирать уже со свежим texlive в Сизифе.

==== 3) filetriggers. ====

В нашем alt texlive-2008 была реализована схема с filetriggers
по файлам в /etc/texmf/.

В Федоре также используются filetriggers,
но редактирование language.dat/language.def/fmtutil.cnf
производится %post/un скриптами, которые сгенерированы из
соответствующих секций пакетов texlive.

мне кажется, что наша схема с fmt.d/ updmap.d/ более надежная.
Но, c ней есть ряд вопросов.

Во-первых, утеряны доп. опции, которые есть в некоторых пакетах texlive.
Во-вторых, /etc полиси говорит, что в /etc не место автогенерированным
файлам, не предназначенным для редактирования.
В третьих, если даже генерировать заново fmt.d/, то если в /etc,
опять придется раздуть число тегов Conflicts:

есть мысль, что в будущем, возможно, стоит вернуться к подобной схеме,
но 1) добавить поддержку опций, указанных в пакетах texlive,
2) чтобы уменьшить число конфликтов при обновлении, 
и руководствуясь /etc полиси, что в /etc не место автогенерированным
файлам, не предназначенным для редактирования, и
пользуясь возможностью начать новые полиси с чистого листа.
можно вынести fmt.d/ (updmap.d/)? language.d/ 
в подкаталог в /usr/share/<texlive-related>

Пока же я переписал их filetriggers под наш rpm.

==== 4) автоматические Provides в Fedora/SuSE ====

Автоматические Provides в Fedora/SuSE вида
tex(siunitx.sty), tex(si-units.cfg) перешли к нам по наследству.
Они сгенерирированы статически прямо при конверсии спеков texlive в
src.rpm, для ускорения скорости пересборки.

Я их собираюсь оставить для совместимости.

==== 5) автоматические Provides в нашем alt texlive-2008 ====

Для нашего alt texlive-2008 в rpm-build-texmf был реализован
поиск автоматических Provides/Requires вида texmf(...).

Я пока отключил их поиск, так как без них сборка с текущими
оптимизациями завершается за час, а с ними - существенно больше.
Я собираюсь собрать-таки раз texlive с rpm-build-texmf,
закешировать полученные результаты и потом вставить их
в спек напрямую, для быстродействия.

Планирую это к релизу 0.21.

Этим релизом я хочу зафиксировать некий промежуточный результат,
а именно, что удалось, надеюсь, собрать 
рабочий устанавливающийся texlive-2016.

=== Далее ====

Следующий этап --- выложить texlive-2016 в Сизиф,
адаптировать к нему наше TeX полиси.

Эта задача облегчается тем, что texlive-2016 --
полная и одновременно свежая сборка, что позволяет
заменить ей все остальные пакеты texlive-*, tetex-*,
и texmf-* в Сизифе и начать новое полиси с чистого листа.

Затем обновить texlive до 2017 из SuSE.

Затем дожать собственный конвертер-генератор
tlpobj в srpm. Недостаток такого подхода в том, что в сизиф
добавится > 5000 новых srpm, а достоинство в том, что 
он позволяет continuous integration, т.е. texlive в Сизифе всегда
будет самый свежий и нужда в пересекающихся с texlive 
texmf-* пакетах просто отпадет.

-- 

I V


Подробная информация о списке рассылки Devel