TeXLivePackaging: различия между версиями
Bga (обсуждение | вклад) (Связка абзацев) |
Sb (обсуждение | вклад) м (источник неправильного написания названия дистрибутива (в том числе и в википедии)) |
||
(не показаны 23 промежуточные версии 5 участников) | |||
Строка 3: | Строка 3: | ||
{{Stub}} | {{Stub}} | ||
На этой странице описана организация дистрибутива TeXLive | На этой странице описана организация дистрибутива TeXLive и его упаковка в ALT Linux | ||
== TeXLive package manager == | |||
== Tex Live == | |||
=== Введение в 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 package manager === | |||
Официальный дистрибутив распространяется вместе с собственной оболочкой для установки: {{prg|tlmgr}}. | Официальный дистрибутив распространяется вместе с собственной оболочкой для установки: {{prg|tlmgr}}. | ||
Логически связанные файлы сгруппированы в пакеты, их описание формирует базу данных: {{path|texlive.tlpdb}}. | Логически связанные файлы сгруппированы в пакеты, их описание формирует базу данных: {{path|texlive.tlpdb}}. | ||
=== Пакеты TeXLive === | ==== Пакеты TeXLive ==== | ||
Описание пакета состоит из | Описание пакета состоит из | ||
* названия ({{term|name}}) | * названия ({{term|name}}) | ||
Строка 16: | Строка 44: | ||
** схема ({{term|Scheme}}) | ** схема ({{term|Scheme}}) | ||
** документация ({{term|Documentation}}) | ** документация ({{term|Documentation}}) | ||
** ConTeXt ({{term|ConTeXt}}) | |||
* краткого описания ({{term|shortdesc}}) | * краткого описания ({{term|shortdesc}}) | ||
* подробного описания ({{term|longdesc}}) | * подробного описания ({{term|longdesc}}) | ||
Строка 61: | Строка 90: | ||
</pre> | </pre> | ||
=== Пакетные зависимости TeXLive === | ==== Пакетные зависимости TeXLive ==== | ||
[[Изображение:Tlpdb-graph.svg|right|thumb|240px|Граф зависимостей]] | [[Изображение:Tlpdb-graph.svg|right|thumb|240px|Граф зависимостей]] | ||
Зависимости a la RPM {{term|Requires}} в TeXLive описываются одной или несколькими директивами {{term|depend}}. Пакеты зависят от других пакетов, коллекции - от пакетов, схемы - от коллекций и пакетов (коллекции и схемы не содержат файлов). Специального вида зависимость {{term|depend bin-package.ARCH}} подразумевает выбор конкретного пакета для используемой архитектуры, например, {{pkg|bin-package.i386-linux}}. Циклических зависимостей (pkg1{{==)}}pkg2{{==)}}pkg1) пока не обнаружено. Пакеты, коллекции, схемы и зависимости между ними можно наглядно изобразить в виде графа (cм. рис.) | Зависимости a la RPM {{term|Requires}} в TeXLive описываются одной или несколькими директивами {{term|depend}}. Пакеты зависят от других пакетов, коллекции - от пакетов, схемы - от коллекций и пакетов (коллекции и схемы не содержат файлов). Специального вида зависимость {{term|depend bin-package.ARCH}} подразумевает выбор конкретного пакета для используемой архитектуры, например, {{pkg|bin-package.i386-linux}}. Циклических зависимостей (pkg1{{==)}}pkg2{{==)}}pkg1) пока не обнаружено. Пакеты, коллекции, схемы и зависимости между ними можно наглядно изобразить в виде графа (cм. рис.) | ||
<br clear="all" /> | <br clear="all" /> | ||
== Особенности сборки в Debian и ALT Linux == | == Сборка TexLive 2017 == | ||
запасной вариант. Импорт из mageia. | |||
Ранее к выкладыванию в Сизиф готовилась сборка TeXLive 2016 (мелкая нарезка). | |||
Описание сборки находится на странице | |||
[[TeXLivePackaging#.D0.A1.D0.B1.D0.BE.D1.80.D0.BA.D0.B0_TexLive_2016| TeXLive 2016]]. | |||
Ее наработки в основном перенесены в TexLive 2017. | |||
К сожалению, сборчница не потянула TeXLive 2016 (мелкая нарезка), см. | |||
[https://lists.altlinux.org/pipermail/sisyphus/2018-March/366548.html письмо в @devel] | |||
== Сборка TexLive 2016 == | |||
Замечу, что сборку texlive-2008.0 в ALT Linux | |||
называть 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 для сборки в Сизиф. | |||
=== Особенности импортированной сборки и ее отличия от ALT Linux TexLive 2008.0 === | |||
==== переезд в другой каталог в /usr/share/. ==== | |||
Вместо /usr/share/texmf-texlive сейчас /usr/share/texlive/texmf-dist. | |||
Это можно поменять на что-либо другое, только не на /usr/share/texmf, | |||
которое по нашему полиси зарезервировано для дистрибутивно-нейтральных | |||
сборок расширений TeX. | |||
Я не хочу оставлять как есть -- в alt texlive-2008 использовались | |||
свои несовместимые пакеты, и пришлось бы почти в каждый пакет | |||
нового texlive добавлять Conflicts:. С переездом в другой каталог | |||
достаточно около 30 Conflicts:, без него надо было бы более 5000 --- | |||
не стоит лишний раз раздувать rpm db. | |||
==== /var/cache/texmf -> /var/lib/texmf ==== | |||
Посмотрел по другим дистрибутивам и решил оставить {{path|/var/lib/texmf}}, | |||
не откатывать до {{path|/var/cache/texmf}}, как было ранее. | |||
Добавил %trigger для очистки мусора в {{path|/var/cache/texmf}}, | |||
кроме {{path|/var/cache/texmf/fonts}}, который в SuSE зарезервирован | |||
как опциональная настройка для общего кеша шрифтов. | |||
# TEXMFSYSVAR moved from /var/cache/texmf to /var/lib/texmf | |||
%triggerun base -- texlive-base < 2009 | |||
rm -rf /var/cache/texmf/web2c /var/cache/texmf/ls-R | |||
==== переезд в ~/.cache/texlive ==== | |||
бывшие в 2008 | |||
TEXMFVAR = ~/.texmf-var | |||
TEXMFCONFIG = ~/.texmf-config | |||
переехали в {{path|~/.cache/texlive}}. | |||
==== пакеты. ==== | |||
Заметим, что в сборку texlive в Федоре включены почти все пакеты | |||
texlive, не все пакеты. Например, biber и latexmk собираются отдельно. | |||
Подробнее см. tl2rpm.c . | |||
biber я в Сизиф собрал, для замыкания зависимостей, | |||
а latexmk и другие буду разбирать уже со свежим texlive в Сизифе. | |||
==== 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. | |||
==== автоматические Provides в Fedora/SuSE ==== | |||
Автоматические Provides в Fedora/SuSE вида | |||
tex(siunitx.sty), tex(si-units.cfg) перешли к нам по наследству. | |||
Они сгенерирированы статически прямо при конверсии спеков texlive в | |||
src.rpm, для ускорения скорости пересборки. | |||
Я их собираюсь оставить для совместимости. | |||
==== автоматические Provides в нашем alt texlive-2008 ==== | |||
Для нашего alt texlive-2008 в rpm-build-texmf был реализован | |||
поиск автоматических Provides/Requires вида texmf(...). | |||
rpm-build-texmf можно привлечь и к свежей сборке texlive, | |||
Однако, | |||
а) дополнительно надо будет потратить время на проблемные автозависимости | |||
как отметил Кирилл Маслинский: | |||
"не уверен, что стоит использовать rpm-build-texmf в текущем виде: | |||
проблема в том, что он генерит не только Provides, но и Requires вида | |||
texmf(...). При этом там реализован очень грубый приблизительный поиск | |||
зависимостей средствами sed, его проблема в том, что он не учитывает | |||
контекст условных проверок (и кое-какие еще особые случаи), поэтому | |||
загребает все. С его помощью мы нашли массу ошибок и недочетов в | |||
зависимостях в tlpdb (которые на тот момент писались вручную), и создали | |||
себе геморрой по заполнению всяких анметов или удалению забытого всеми | |||
архаичного кода. Так что за это дело надо браться с осторожностью, не | |||
думаю, что за прошедшие 10 лет ошибок в tlpdb стало меньше." | |||
б) find-requires/find-provides texmf сейчас сильно замедляют сборку пакета. | |||
Я не включал поиск texmf, так как без них сборка с текущими | |||
оптимизациями завершается за час, а с ними - существенно больше. | |||
в) texmf provides вида texmf(latex/siunitx) дублируют | |||
provides вида tex(siunitx.sty) которые уже есть в сборке, | |||
при чем последние еще и совместимы с SuSE и Fedora. | |||
Поэтому я решил не плодить сущности и отказаться от | |||
texmf provides в пользу provides вида tex(siunitx.sty). | |||
texmf provides можно генерировать статически, и они кое-где | |||
используются в Сизифе, поэтому я добавил на переходный период | |||
texmf provides, но только те, на которых были (Build)?Req | |||
в Сизифе (начиная с релиза 0.21). | |||
Возможно, стоит переписать rpm-build-texmf, чтобы он выдавал | |||
зависимости в формате вида tex(siunitx.sty). | |||
==== Версионирование подпакетов. ==== | |||
В tlpobj спеках texlive есть свои аналоги version и release --- | |||
это svn revision и catalogue-version (release собственно tlpobj). | |||
В Fedora и SuSE из них делают версии для подпакетов. | |||
В Fedora это svn<svn revision>[.catalogue-version] . | |||
В SuSE это <version of TeXLive:=2017>.<svn revision>[.catalogue-version] . | |||
В своей сборке я сборосил все версии подпакетов, | |||
в них сейчас просто 2016 . | |||
В texlive-package-builder, для сборки одиночных пакетов, | |||
я настроил схему SuSE --- | |||
<version of TexLive>.<svn revision>[.catalogue-version] | |||
==== Удаление пакетов из Сизифа ==== | |||
1) tetex и компаньоны | |||
tetex-bibtex8 | |||
tetex-latex-cmap | |||
tetex-latex-feynmf | |||
tetex-latex-hiptex | |||
tetex-latex-rcs | |||
tetex-latex-tabulary | |||
tetex-latex-unicode | |||
tetex-latex-xymtex | |||
2) вошли в сборку texlive, | |||
конфликтуют и прообсолечены. | |||
bibexport | |||
chktex | |||
ctanify | |||
dvipng | |||
jadetex | |||
latexdiff | |||
lcdf-typetools | |||
musixflx | |||
musixtex | |||
pdfjam | |||
ps2eps | |||
tex4ht | |||
xmltex | |||
texlive-common | |||
3) texmf-* | |||
из них | |||
texmf-bibtex8-gost | |||
texmf-latex-obsolete | |||
останутся, а текущие версии | |||
texmf-latex-babelbib | |||
texmf-latex-beamer | |||
texmf-latex-biblatex | |||
texmf-latex-biblatex-gost | |||
texmf-latex-csquotes | |||
texmf-latex-currfile | |||
texmf-latex-etoolbox | |||
texmf-latex-filehook | |||
texmf-latex-fixme | |||
texmf-latex-koma-script | |||
texmf-latex-linegoal | |||
texmf-latex-logreq | |||
texmf-latex-ltxnew | |||
texmf-latex-passivetex | |||
texmf-latex-pdfcomment | |||
texmf-latex-tabu | |||
texmf-latex-tipa | |||
texmf-latex-xcolor | |||
texmf-pgf | |||
прообсолечены и будут удалены, | |||
так как в сборку texlive вошли более свежие версии этих пакетов. | |||
==== Поддержка /usr/share/texmf ==== | |||
texlive-texmf.cnf-alt.patch | |||
=== TODO === | |||
* updmap-sys filetrigger: use xargs ? | |||
* emacs-mode-auctex && texmf-latex-preview | |||
=== Тестирование === | |||
Ошибки и прочие соображения заносите на страницу [[TeXLiveTesting#.D0.A2.D0.B5.D1.81.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_TeXLive2016|Тестирование TeXLive#2016 ]] | |||
== Особенности сборки в Debian и ALT Linux TexLive 2008.0 (Устарело) == | |||
Идея разделить дистрибутив на 5 исходных пакетов родилась в Debian и позднее была позаимствована командой ALT Linux. Поэтому описание сборки в существенной мере будет повторять [http://people.debian.org/~preining/TeX/TeX-on-Debian/ руководство Debian] и [http://people.debian.org/~preining/TeX/Debian-TeX-Policy/ Debian TeX sub-policy]. | Идея разделить дистрибутив на 5 исходных пакетов родилась в Debian и позднее была позаимствована командой ALT Linux. Поэтому описание сборки в существенной мере будет повторять [http://people.debian.org/~preining/TeX/TeX-on-Debian/ руководство Debian] и [http://people.debian.org/~preining/TeX/Debian-TeX-Policy/ Debian TeX sub-policy]. | ||
Строка 131: | Строка 475: | ||
Описанные действия выполняются скриптом {{prg|tlptool.pl}}, который создаёт список исходных файлов из дистрибутива TeXLive и списки файлов для включения в пакеты RPM (в секции {{term|%files}}) по одному на каждый. Список исходных файлов используется скриптом {{prg|git-filter-tree}} для создания коммита-потомка полного дистрибутива, таким образом дистрибутив разбивается на 5 независимых бранчей в git. | Описанные действия выполняются скриптом {{prg|tlptool.pl}}, который создаёт список исходных файлов из дистрибутива TeXLive и списки файлов для включения в пакеты RPM (в секции {{term|%files}}) по одному на каждый. Список исходных файлов используется скриптом {{prg|git-filter-tree}} для создания коммита-потомка полного дистрибутива, таким образом дистрибутив разбивается на 5 независимых бранчей в git. | ||
==== Скрипт {{path|tpltool.pl}} ==== | ==== Скрипт {{path|tpltool.pl}} ==== | ||
Строка 145: | Строка 487: | ||
#*печатается шаблон spec-файла с описанием пакета и секциями {{term|%install}} и {{term|%files}} | #*печатается шаблон spec-файла с описанием пакета и секциями {{term|%install}} и {{term|%files}} | ||
#*печатается список файлов для включения в архив с исходниками | #*печатается список файлов для включения в архив с исходниками | ||
==== Структура репозитария git ==== | |||
Репозитарий состоит из следующих бранчей: | |||
;helper:скрипт {{prg|git-filter-tree}} для создания коммитов-потомков оригинального дерева исходников (для разбивания на части) | |||
;perl-texlive:модули Perl для обработки базы {{path|texlive.tlpdb}} | |||
;tlpdb:база {{path|texlive.tlpdb}} | |||
;tpm2deb:конфиг {{path|tpm2deb.cfg}}, импортирован из [http://svn.debian.org/wsvn/debian-tex/texlive2008/trunk/all/debian/tpm2deb.cfg Debian SVN] | |||
;master:скрипт {{prg|tlptool.pl}} и прочие, потомок всех предыдущих | |||
;texlive-source.orig:оригинальное дерево исходников [ftp://tug.org/texlive/historic/2008/texlive-20080816-source.tar.lzma source] | |||
;texlive-source:исправления в компилируемых исходниках | |||
;texlive-texmf.orig:оригинальное дерево [ftp://tug.org/texlive/historic/2008/texlive-20080822-texmf.tar.lzma texmf] | |||
;texlive-base.orig:подмножество дерева texmf с базовыми стилями и форматами | |||
;texlive-bin.orig:подмножество дерева texmf с бинарными утилитами | |||
;texlive-doc.orig:подмножество дерева texmf с документацией | |||
;texlive-extra.orig:подмножество дерева texmf со вспомогательными программами | |||
;texlive-lang.orig:подмножество дерева texmf с поддержкой национальных языков | |||
;texlive-base:пакет {{pkg|texlive-base-2008.0-*.src.rpm}}, потомок {{term|texlive-base.orig}} и {{term|master}} | |||
;texlive-bin:пакет {{pkg|texlive-bin-2008.0-*.src.rpm}}, потомок {{term|texlive-bin.orig}}, {{term|texlive-source}} и {{term|master}} | |||
;texlive-doc:пакет {{pkg|texlive-doc-2008.0-*.src.rpm}}, потомок {{term|texlive-doc.orig}} и {{term|master}} | |||
;texlive-extra:пакет {{pkg|texlive-lang-2008.0-*.src.rpm}}, потомок {{term|texlive-extra.orig}} и {{term|master}} | |||
;texlive-lang:пакет {{pkg|texlive-extra-2008.0-*.src.rpm}}, потомок {{term|texlive-lang.orig}} и {{term|master}} | |||
На основании конфига {{path|tpm2deb.cfg}} скриптом {{pkg|tlptool.pl}} в бранче {{term|master}} генерируются (обновляются) шаблоны spec-файлов и список исходников для включения в бранч {{term|*.orig}}. Скриптом {{prg|git-filter-tree}} создаётся коммит в этом бранче, затем он и шаблоны из {{term|master}} мержатся в бранч с пакетом. | |||
На итоговые бранчи расставляются теги, позволяющие собирать пакеты на [[git.alt]]: | |||
;@name@-@version@-@release@.orig:На бранчи {{term|*.orig}}. Из соответствующего коммита формируется архив с исходниками. | |||
;@name@-@version@-@release@.patch:Вычисляется разница ({{term|diff}}) с предыдущим тегом и оформляется в виде патча. (Сейчас в бранче {{term|texlive-source}}.) | |||
;@name@-@version@-@release@:Пометка для [[git.alt]], указывающая на интересующий релиз пакета. | |||
Поскольку пакеты {{pkg|texlive-base}}, {{pkg|texlive-bin}} и т.д. собираются из разных бранчей, их версии не обязаны совпадать. Однако, рекомендуется придерживаться сквозной нумерации: при необходимости увеличить версию одного из пакетов следует выбрать максимальную среди всех остальных и добавить 1. | |||
=== Настройки === | === Настройки === | ||
Строка 161: | Строка 539: | ||
==== Конфигурационные файлы ==== | ==== Конфигурационные файлы ==== | ||
* {{path|texmf.cnf}} | * {{path|texmf.cnf}} — базовые настройки и пути используемых программ | ||
* {{path|fmtutil.cnf}} | * {{path|fmtutil.cnf}} — доступные форматы TeX | ||
* {{path|updmap.cfg}} | * {{path|updmap.cfg}} — конфигурация шрифтов | ||
* {{path|language.dat}} | * {{path|language.dat}}, {{path|language.def}} — шаблоны переносов для разных языков | ||
: '''Внимание!''' В отличие от Debian в ALT Linux пока что | : '''Внимание!''' В отличие от Debian в ALT Linux пока что редактируется непосредственно {{path|/etc/texmf/web2c/texmf.cnf}}, а не шаблоны для него. | ||
Менеджер {{ | Менеджер {{prg|tlmgr}} предполагает автоматическое создание и обновление конфигурационных файлов. В ALT Linux реализовано небольшое подмножество команд {{prg|tlmgr}}, а именно | ||
* {{cmd|generate language.dat}} — обновить {{path|language.dat}} | |||
* {{cmd|generate language.def}} — обновить {{path|language.def}} | |||
* {{cmd|generate language}} — обновить {{path|language.dat}} и {{path|language.def}} | |||
* {{cmd|generate fmtutil}} — обновить {{path|fmtutil.cnf}} | |||
* {{cmd|generate updmap}} — обновить {{path|updmap.cfg}} | |||
Итоговые файлы получаются слиянием заготовок | |||
;{{path|/var/cache/texmf/tex/generic/config/language.dat}} | |||
: {{path|/etc/texmf/language.d/00-language.dat}} | |||
: прочие {{path|/etc/texmf/language.d/*.dat}} | |||
;{{path|/var/cache/texmf/tex/generic/config/language.def}} | |||
: {{path|/etc/texmf/language.d/00-language.def}} | |||
: прочие {{path|/etc/texmf/language.d/*.def}} | |||
: {{path|/etc/texmf/language.d/99-language.def}} со строкой {{cmd|\uselanguage {USenglish} %%% This MUST be the last line of the file}} | |||
;{{path|/var/cache/texmf/web2c/fmtutil.cnf}} | |||
: {{path|/etc/texmf/fmt.d/00-fmtutil.cnf}} | |||
: прочие {{path|/etc/texmf/fmt.d/*.cnf}} | |||
;{{path|/var/cache/texmf/web2c/updmap.cfg}} | |||
: {{path|/etc/texmf/updmap.d/00-updmap.cfg}} | |||
: прочие {{path|/etc/texmf/updmap.d/*.cfg}} | |||
Заготовки создаются во время сборки пакетов и иногда представляют собой символические ссылки на файлы из других директорий. Чтобы добавить свои собственные настройки, достаточно положить соответствующий конфиг в одну из директорий {{path|/etc/texmf/*.d/}}. | |||
* | |||
=== Кеширование шрифтов === | === Кеширование шрифтов === | ||
TeX компилирует шрифты (пиксели, метрики и пр.) на лету. Эта информация может быть закеширована и использована позднее. На многопользовательских системах желательно указать переменной {{term|VARTEXFONTS}} на какой-нибудь каталог, например, {{path|/var/cache/fonts}}, и заменить переменную {{term|MT_FEATURES}} с {{term|texmfvar}} на {{term|varfonts}} в файле {{path|/etc/texmf/web2c/mktex.cnf}} | TeX компилирует шрифты (пиксели, метрики и пр.) на лету. Эта информация может быть закеширована и использована позднее. На многопользовательских системах желательно указать переменной {{term|VARTEXFONTS}} на какой-нибудь каталог, например, {{path|/var/cache/fonts}}, и заменить переменную {{term|MT_FEATURES}} с {{term|texmfvar}} на {{term|varfonts}} в файле {{path|/etc/texmf/web2c/mktex.cnf}} | ||
== Тестирование == | === Тестирование === | ||
Ошибки и прочие соображения заносите на страницу [[TeXLiveTesting|Тестирование | Ошибки и прочие соображения заносите на страницу [[TeXLiveTesting#.D0.A2.D0.B5.D1.81.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D0.B5_TeXLive2008.0|Тестирование TeXLive#2008.0 ]] | ||
{{Category navigation|title=TeX|category=TeX}} | {{Category navigation|title=TeX|category=TeX}} | ||
[[Категория:Packaging]] | |||
{{Category navigation|title=Системному администратору|category=Admin|sortkey={{SUBPAGENAME}}}} |
Текущая версия от 10:33, 31 мая 2019
На этой странице описана организация дистрибутива TeXLive и его упаковка в ALT Linux
Tex Live
Введение в 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 package manager
Официальный дистрибутив распространяется вместе с собственной оболочкой для установки: tlmgr. Логически связанные файлы сгруппированы в пакеты, их описание формирует базу данных: texlive.tlpdb.
Пакеты TeXLive
Описание пакета состоит из
- названия (name)
- категории (category)
- базовая часть (TLCore)
- пакет (Package)
- коллекция (Collection)
- схема (Scheme)
- документация (Documentation)
- ConTeXt (ConTeXt)
- краткого описания (shortdesc)
- подробного описания (longdesc)
- списка файлов
- исполняемых (binfiles)
- используемых (runfiles)
- документации (docfiles)
- исходников (scrfiles)
- зависимостей (depend)
- исполняемых команд (execute)
- execute AddHyphen name=TEXLANG file=FILE [прочее] - подключить шаблоны переносов для языка TEXLANG из файла FILE; прочие параметры:
- lefthyphenmin - минимально допустимое количество букв до переноса
- righthyphenmin - минимально допустимое количество букв после переноса
- synonyms - список синонимов
- execute addMap font.map - подключить шрифт font.map в конфиге updmap.cfg
- execute addMixedMap font.map - подключить шрифт font.map в конфиге updmap.cfg в смешанном ("mixed") режиме
- execute BuildFormat FMTCFG - подключить в конфиге fmtutil.cnf все форматы из файла texmf/fmtutil/format.FMTCFG.cnf
- execute AddHyphen name=TEXLANG file=FILE [прочее] - подключить шаблоны переносов для языка TEXLANG из файла FILE; прочие параметры:
- прочего (revision, catalogue-*)
Пример описания пакета 12many:
name 12many category Package revision 7340 shortdesc 12many, generalizing mathematical index sets longdesc In the discrete branches of mathematics and the computer longdesc sciences, it will only take some seconds until you're faced longdesc with a set like {1,...,m}. Only some people write longdesc $1\ldotp\ldotp m$, or $\{j:1\leq j\leq m\}$, and that journal longdesc you're submitting to might want something else entirely. \otm{} longdesc provides an interface that makes changing from one to another a longdesc one-line change. docfiles size=98 texmf-dist/doc/latex/12many/12many.pdf texmf-dist/doc/latex/12many/README srcfiles size=6 texmf-dist/source/latex/12many/12many.dtx texmf-dist/source/latex/12many/12many.ins runfiles size=1 texmf-dist/tex/latex/12many/12many.sty catalogue-ctan /macros/latex/contrib/12many catalogue-date 2007-05-25 16:15:27 +0200 catalogue-license lppl catalogue-version 0.3
Пакетные зависимости TeXLive
Зависимости a la RPM Requires в TeXLive описываются одной или несколькими директивами depend. Пакеты зависят от других пакетов, коллекции - от пакетов, схемы - от коллекций и пакетов (коллекции и схемы не содержат файлов). Специального вида зависимость depend bin-package.ARCH подразумевает выбор конкретного пакета для используемой архитектуры, например, bin-package.i386-linux. Циклических зависимостей (pkg1 ⇒ pkg2 ⇒ pkg1) пока не обнаружено. Пакеты, коллекции, схемы и зависимости между ними можно наглядно изобразить в виде графа (cм. рис.)
Сборка TexLive 2017
запасной вариант. Импорт из mageia.
Ранее к выкладыванию в Сизиф готовилась сборка TeXLive 2016 (мелкая нарезка).
Описание сборки находится на странице TeXLive 2016. Ее наработки в основном перенесены в TexLive 2017.
К сожалению, сборчница не потянула TeXLive 2016 (мелкая нарезка), см. письмо в @devel
Сборка TexLive 2016
Замечу, что сборку texlive-2008.0 в ALT Linux называть 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 для сборки в Сизиф.
Особенности импортированной сборки и ее отличия от ALT Linux TexLive 2008.0
Вместо /usr/share/texmf-texlive сейчас /usr/share/texlive/texmf-dist. Это можно поменять на что-либо другое, только не на /usr/share/texmf, которое по нашему полиси зарезервировано для дистрибутивно-нейтральных сборок расширений TeX.
Я не хочу оставлять как есть -- в alt texlive-2008 использовались свои несовместимые пакеты, и пришлось бы почти в каждый пакет нового texlive добавлять Conflicts:. С переездом в другой каталог достаточно около 30 Conflicts:, без него надо было бы более 5000 --- не стоит лишний раз раздувать rpm db.
/var/cache/texmf -> /var/lib/texmf
Посмотрел по другим дистрибутивам и решил оставить /var/lib/texmf, не откатывать до /var/cache/texmf, как было ранее. Добавил %trigger для очистки мусора в /var/cache/texmf, кроме /var/cache/texmf/fonts, который в SuSE зарезервирован как опциональная настройка для общего кеша шрифтов.
# TEXMFSYSVAR moved from /var/cache/texmf to /var/lib/texmf %triggerun base -- texlive-base < 2009 rm -rf /var/cache/texmf/web2c /var/cache/texmf/ls-R
переезд в ~/.cache/texlive
бывшие в 2008
TEXMFVAR = ~/.texmf-var TEXMFCONFIG = ~/.texmf-config
переехали в ~/.cache/texlive.
пакеты.
Заметим, что в сборку texlive в Федоре включены почти все пакеты texlive, не все пакеты. Например, biber и latexmk собираются отдельно. Подробнее см. tl2rpm.c .
biber я в Сизиф собрал, для замыкания зависимостей, а latexmk и другие буду разбирать уже со свежим texlive в Сизифе.
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.
автоматические Provides в Fedora/SuSE
Автоматические Provides в Fedora/SuSE вида tex(siunitx.sty), tex(si-units.cfg) перешли к нам по наследству. Они сгенерирированы статически прямо при конверсии спеков texlive в src.rpm, для ускорения скорости пересборки.
Я их собираюсь оставить для совместимости.
автоматические Provides в нашем alt texlive-2008
Для нашего alt texlive-2008 в rpm-build-texmf был реализован поиск автоматических Provides/Requires вида texmf(...).
rpm-build-texmf можно привлечь и к свежей сборке texlive,
Однако, а) дополнительно надо будет потратить время на проблемные автозависимости как отметил Кирилл Маслинский: "не уверен, что стоит использовать rpm-build-texmf в текущем виде: проблема в том, что он генерит не только Provides, но и Requires вида texmf(...). При этом там реализован очень грубый приблизительный поиск зависимостей средствами sed, его проблема в том, что он не учитывает контекст условных проверок (и кое-какие еще особые случаи), поэтому загребает все. С его помощью мы нашли массу ошибок и недочетов в зависимостях в tlpdb (которые на тот момент писались вручную), и создали себе геморрой по заполнению всяких анметов или удалению забытого всеми архаичного кода. Так что за это дело надо браться с осторожностью, не думаю, что за прошедшие 10 лет ошибок в tlpdb стало меньше."
б) find-requires/find-provides texmf сейчас сильно замедляют сборку пакета. Я не включал поиск texmf, так как без них сборка с текущими оптимизациями завершается за час, а с ними - существенно больше.
в) texmf provides вида texmf(latex/siunitx) дублируют provides вида tex(siunitx.sty) которые уже есть в сборке, при чем последние еще и совместимы с SuSE и Fedora.
Поэтому я решил не плодить сущности и отказаться от texmf provides в пользу provides вида tex(siunitx.sty).
texmf provides можно генерировать статически, и они кое-где используются в Сизифе, поэтому я добавил на переходный период texmf provides, но только те, на которых были (Build)?Req в Сизифе (начиная с релиза 0.21).
Возможно, стоит переписать rpm-build-texmf, чтобы он выдавал зависимости в формате вида tex(siunitx.sty).
Версионирование подпакетов.
В tlpobj спеках texlive есть свои аналоги version и release --- это svn revision и catalogue-version (release собственно tlpobj). В Fedora и SuSE из них делают версии для подпакетов. В Fedora это svn<svn revision>[.catalogue-version] . В SuSE это <version of TeXLive:=2017>.<svn revision>[.catalogue-version] .
В своей сборке я сборосил все версии подпакетов, в них сейчас просто 2016 .
В texlive-package-builder, для сборки одиночных пакетов, я настроил схему SuSE --- <version of TexLive>.<svn revision>[.catalogue-version]
Удаление пакетов из Сизифа
1) tetex и компаньоны
tetex-bibtex8 tetex-latex-cmap tetex-latex-feynmf tetex-latex-hiptex tetex-latex-rcs tetex-latex-tabulary tetex-latex-unicode tetex-latex-xymtex
2) вошли в сборку texlive, конфликтуют и прообсолечены.
bibexport chktex ctanify dvipng jadetex latexdiff lcdf-typetools musixflx musixtex pdfjam ps2eps tex4ht xmltex texlive-common
3) texmf-* из них
texmf-bibtex8-gost texmf-latex-obsolete
останутся, а текущие версии
texmf-latex-babelbib texmf-latex-beamer texmf-latex-biblatex texmf-latex-biblatex-gost texmf-latex-csquotes texmf-latex-currfile texmf-latex-etoolbox texmf-latex-filehook texmf-latex-fixme texmf-latex-koma-script texmf-latex-linegoal texmf-latex-logreq texmf-latex-ltxnew texmf-latex-passivetex texmf-latex-pdfcomment texmf-latex-tabu texmf-latex-tipa texmf-latex-xcolor texmf-pgf
прообсолечены и будут удалены, так как в сборку texlive вошли более свежие версии этих пакетов.
texlive-texmf.cnf-alt.patch
TODO
- updmap-sys filetrigger: use xargs ?
- emacs-mode-auctex && texmf-latex-preview
Тестирование
Ошибки и прочие соображения заносите на страницу Тестирование TeXLive#2016
Особенности сборки в Debian и ALT Linux TexLive 2008.0 (Устарело)
Идея разделить дистрибутив на 5 исходных пакетов родилась в Debian и позднее была позаимствована командой ALT Linux. Поэтому описание сборки в существенной мере будет повторять руководство Debian и Debian TeX sub-policy.
Исходные пакеты
В основанных на RPM дистрибутивах бинарные пакеты получаются пересборкой исходных (src.rpm). Дерево TeXLive поделено на 5 относительно независимых частей:
- texlive-base
- основной набор файлов
- texlive-bin
- исходники компилируемых архитектуро-зависимых программ
- texlive-lang
- поддержка национальных языков
- texlive-doc
- документация
- texlive-extra
- дополнительные файлы
Бинарные пакеты
Строго говоря, большинство файлов TeXLive является текстовыми, за исключением некоторых утилит из texlive-base-bin. Из исходных пакетов собираются следующие бинарные:
- texlive-base:
- texlive-latex-base
- основные файлы LaTeX, достаточные для простых документов
- texlive-latex-recommended
- рекомендуемый набор файлов LaTeX, достаточный в большинстве других случаев
- texlive-fonts-recommended
- рекомендуемый и обычно достаточный набор шрифтов
- texlive-bin:
- texlive-base-bin
- основной набор исполняемых и конфигурационных файлов
- texlive-doc:
- texlive-doc-*
- пакеты texlive-doc-en, texlive-doc-de и т.п., содержащие документацию на соответствующих языках
- texlive-lang:
- texlive-lang-*
- пакеты texlive-lang-dutch, texlive-lang-spanish и т.п. с поддержкой национальных особенностей, например, переносов
- texlive
- виртуальный пакет, зависящий от разумного набора реальных
- texlive-full
- виртуальный пакет, зависящий от всех пакетов TeXLive
Есть и другие пакеты с дополнительными возможностями и шрифтами. Смотрите их описание.
Манипуляции с исходным дистрибутивом
Дополнительно к базе texlive.tlpdb введён конфигурационный файл tpm2deb.cfg (в TeXLive версии 2007 формат пакетов был другой - tpm). Какой бинарный пакет собирается из какого исходного, определяется директивой name:
name;collection-basicbin;texlive-base-bin;texlive-bin
Здесь коллекция collection-basicbin соответствует бинарному пакету texlive-base-bin и собирается из исходного пакета texlive-bin.
Состав коллекции определяется директивами depend в описании пакетов: по ним производится рекурсивный обход, выявляющий полное подмножество пакетов. Если пакет оказывается нужен нескольким коллекциям, он попадает в «ближайшую»: до которой наименьшее число промежуточных узлов на графе (см. выше), а остальным в зависимости прописывается эта коллекция.
Иногда такой алгоритм себя не оправдывает. Требуется вручную переместить пакет в другую коллекцию, для чего используется директива move в файле tpm2deb.cfg:
move;bin-latex;collection-basicbin
Чтобы исключить из рассмотрения некоторые пакеты, например, уже имеющиеся в системе, или отдельные файлы, используется директива blacklist:
blacklist;tpm;bin-bzip2;* blacklist;tpm;iwona;texlive-lang-polish blacklist;file;texmf-dist/doc/latex/splitindex/splitindex-OpenBSD-i386 blacklist;file;bin/[^/]*/tlmgr
Пакет можно исключить изо всех коллекций (*) или из конкретной. Файлы можно задать регулярным выражением.
Отсутствующие символические ссылки создаются директивой mapping link:
mapping;%_bindir/vpe;link;texmf-dist/scripts/vpe/vpe.pl mapping;%_bindir/xmltools;link;texmf-dist/scripts/context/stubs/unix/xmltools
В ALT Linux необходимые ссылки вычисляются по списку LINKED_SCRIPTS из файла source/texk/texlive/Makefile.in:
sed -e 's/\\$//;/^#/d;/./{H;$!d}' \ -e 'x;/LINKED_SCRIPTS =/!d;' \ -e "s/.*LINKED_SCRIPTS = \\n//" \ source/texk/texlive/Makefile.in | \ while read file; do \ link=`basename "$file" | sed 's,\.[^/]*$,,' | tr '[A-Z]' '[a-z]'`; \ echo "mapping;/usr/bin/$link;link;$file"; \ done
Описанные действия выполняются скриптом tlptool.pl, который создаёт список исходных файлов из дистрибутива TeXLive и списки файлов для включения в пакеты RPM (в секции %files) по одному на каждый. Список исходных файлов используется скриптом git-filter-tree для создания коммита-потомка полного дистрибутива, таким образом дистрибутив разбивается на 5 независимых бранчей в git.
Скрипт tpltool.pl
Поскольку поддержка Perl разработчиками базы TeXLive наиболее полна, для манипуляций с пакетами выбран этот язык программирования. Его алгоритм упрощённо можно описать так:
- Загрузка конфига
- Загрузка пакетной базы
- Рекурсивный поиск зависимостей для каждой коллекции
- Удаление пакетов из чёрного списка
- Перемещение пакетов из одной коллекции в другую и проставление зависимостей между коллекциями
- Далее для каждой коллекции
- печатается список файлов для включения в RPM
- печатается шаблон spec-файла с описанием пакета и секциями %install и %files
- печатается список файлов для включения в архив с исходниками
Структура репозитария git
Репозитарий состоит из следующих бранчей:
- helper
- скрипт git-filter-tree для создания коммитов-потомков оригинального дерева исходников (для разбивания на части)
- perl-texlive
- модули Perl для обработки базы texlive.tlpdb
- tlpdb
- база texlive.tlpdb
- tpm2deb
- конфиг tpm2deb.cfg, импортирован из Debian SVN
- master
- скрипт tlptool.pl и прочие, потомок всех предыдущих
- texlive-source.orig
- оригинальное дерево исходников source
- texlive-source
- исправления в компилируемых исходниках
- texlive-texmf.orig
- оригинальное дерево texmf
- texlive-base.orig
- подмножество дерева texmf с базовыми стилями и форматами
- texlive-bin.orig
- подмножество дерева texmf с бинарными утилитами
- texlive-doc.orig
- подмножество дерева texmf с документацией
- texlive-extra.orig
- подмножество дерева texmf со вспомогательными программами
- texlive-lang.orig
- подмножество дерева texmf с поддержкой национальных языков
- texlive-base
- пакет texlive-base-2008.0-*.src.rpm, потомок texlive-base.orig и master
- texlive-bin
- пакет texlive-bin-2008.0-*.src.rpm, потомок texlive-bin.orig, texlive-source и master
- texlive-doc
- пакет texlive-doc-2008.0-*.src.rpm, потомок texlive-doc.orig и master
- texlive-extra
- пакет texlive-lang-2008.0-*.src.rpm, потомок texlive-extra.orig и master
- texlive-lang
- пакет texlive-extra-2008.0-*.src.rpm, потомок texlive-lang.orig и master
На основании конфига tpm2deb.cfg скриптом tlptool.pl в бранче master генерируются (обновляются) шаблоны spec-файлов и список исходников для включения в бранч *.orig. Скриптом git-filter-tree создаётся коммит в этом бранче, затем он и шаблоны из master мержатся в бранч с пакетом.
На итоговые бранчи расставляются теги, позволяющие собирать пакеты на git.alt:
- @name@-@version@-@release@.orig
- На бранчи *.orig. Из соответствующего коммита формируется архив с исходниками.
- @name@-@version@-@release@.patch
- Вычисляется разница (diff) с предыдущим тегом и оформляется в виде патча. (Сейчас в бранче texlive-source.)
- @name@-@version@-@release@
- Пометка для git.alt, указывающая на интересующий релиз пакета.
Поскольку пакеты texlive-base, texlive-bin и т.д. собираются из разных бранчей, их версии не обязаны совпадать. Однако, рекомендуется придерживаться сквозной нумерации: при необходимости увеличить версию одного из пакетов следует выбрать максимальную среди всех остальных и добавить 1.
Настройки
Системные и пользовательские настройки осуществляются перечисленными ниже переменными из файла /etc/tex-common/web2c/texmf.cnf, первые имеют больший приоритет.
- TEXMFCONFIG
- Пользовательские настройки. По умолчанию: $HOME/.texmf-config/
- TEXMFVAR
- Сгенерированные пользователем файлы. По умолчанию: $HOME/.texmf-var/
- TEXMFHOME
- Пользовательские неменяемые файлы, например, дополнительные пакеты LaTeX. По умолчанию: $HOME/texmf/
- TEXMFSYSCONFIG
- Общесистемные настройки. По умолчанию: /etc/texmf
- TEXMFSYSVAR
- Сгенерированные общесистемные файлы. По умолчанию: /var/lib/texmf/
- TEXMFLOCAL
- Общесистемные файлы. По умолчанию: /usr/local/share/texmf/
- TEXMFDIST
- Общесистемные файлы, установленные из основных пакетов RPM. По умолчанию: /usr/share/texmf-texlive
- TEXMFMAIN
- Общесистемные файлы, установленные из дополнительных пакетов RPM. По умолчанию: /usr/share/texmf/
Новые файлы обычно кладутся администратором в TEXMFLOCAL, а пользователями - в TEXMFHOME. При необходимости можно добавить новый путь к переменной TEXMF в файле /etc/texmf/web2c/texmf.cnf (первые записи имеют больший приоритет). TEXMFCONFIG и TEXMFVAR используются при запуске команд texconfig, updmap и fmtutil пользователем. Имейте в виду, что texconfig при первом запуске копирует файлы настроек из TEXMFMAIN или TEXMFSYSCONFIG и не отслеживает последующие системные изменения.
Конфигурационные файлы
- texmf.cnf — базовые настройки и пути используемых программ
- fmtutil.cnf — доступные форматы TeX
- updmap.cfg — конфигурация шрифтов
- language.dat, language.def — шаблоны переносов для разных языков
- Внимание! В отличие от Debian в ALT Linux пока что редактируется непосредственно /etc/texmf/web2c/texmf.cnf, а не шаблоны для него.
Менеджер tlmgr предполагает автоматическое создание и обновление конфигурационных файлов. В ALT Linux реализовано небольшое подмножество команд tlmgr, а именно
- generate language.dat — обновить language.dat
- generate language.def — обновить language.def
- generate language — обновить language.dat и language.def
- generate fmtutil — обновить fmtutil.cnf
- generate updmap — обновить updmap.cfg
Итоговые файлы получаются слиянием заготовок
- /var/cache/texmf/tex/generic/config/language.dat
- /etc/texmf/language.d/00-language.dat
- прочие /etc/texmf/language.d/*.dat
- /var/cache/texmf/tex/generic/config/language.def
- /etc/texmf/language.d/00-language.def
- прочие /etc/texmf/language.d/*.def
- /etc/texmf/language.d/99-language.def со строкой \uselanguage {USenglish} %%% This MUST be the last line of the file
- /var/cache/texmf/web2c/fmtutil.cnf
- /etc/texmf/fmt.d/00-fmtutil.cnf
- прочие /etc/texmf/fmt.d/*.cnf
- /var/cache/texmf/web2c/updmap.cfg
- /etc/texmf/updmap.d/00-updmap.cfg
- прочие /etc/texmf/updmap.d/*.cfg
Заготовки создаются во время сборки пакетов и иногда представляют собой символические ссылки на файлы из других директорий. Чтобы добавить свои собственные настройки, достаточно положить соответствующий конфиг в одну из директорий /etc/texmf/*.d/.
Кеширование шрифтов
TeX компилирует шрифты (пиксели, метрики и пр.) на лету. Эта информация может быть закеширована и использована позднее. На многопользовательских системах желательно указать переменной VARTEXFONTS на какой-нибудь каталог, например, /var/cache/fonts, и заменить переменную MT_FEATURES с texmfvar на varfonts в файле /etc/texmf/web2c/mktex.cnf
Тестирование
Ошибки и прочие соображения заносите на страницу Тестирование TeXLive#2008.0