ルギア君の戯言

雑多な記事。

TeX Live 20100722 + eptex 20110315 奮闘記 その 9

trunk に投入したものの

# yum update

(development 最新版) したらビルドできなくなりました。現在原因を究明中です。しばしお待ちを。


それ故 evince も BUILDDEP になってしまうのはなんか気持ち悪いが、仕方ない。


失敗した人で、OmoiKondara.log の尻尾がこうなってない人は言ってくれるとうれしいかも。

  148 for language 6
  97 for language 5
  374 for language 4
  387 for language 3
  2 for language 1
  181 for language 0
0 words of pdfTeX memory
0 indirect objects
No pages of output.
Transcript written on pdfxmltex.log.
fmtutil: /var/tmp/texlive-2010-1m.mo8-root-lugia/usr/share/texmf-var/web2c/pdftex/pdfxmltex.fmt installed.

###############################################################################
fmtutil: Error! Not all formats have been built successfully.
Visit the log files in directory
  /var/tmp/texlive-2010-1m.mo8-root-lugia/usr/share/texmf-var/web2c
for details.
###############################################################################

This is a summary of all `failed' messages:
`eptex -ini  -jobname=eplatex -progname=eplatex -etex platex.ini' failed
エラー: /var/tmp/rpm-tmp.DAyNIq の不正な終了ステータス (%install)


RPM ビルドエラー:
    /var/tmp/rpm-tmp.DAyNIq の不正な終了ステータス (%install)

--real:2571.94 utime:2173.71 stime:505.20

Failure : texlive

TeXLiveInstaller-X.Y.Z.tar.xz

このプログラムは lugia が独自に作った TeX Live のビルドサポートプログラムです。ついてくる tl-inst とはまったくもって無関係です。


設定ファイルはどれも UNIX でよくあるスペース区切りの conf ファイルになります。区切りは空白であれば、タブでも良い (はず) です。# 以下改行まではコメントになりますし、行末に \ を置けば次行もその続きとみなされます。なお、

foo bar1 \ # comment for bar1
    bar2 \ # comment for bar2

foo bar1      bar2

と同じことになります。また

foo bar1 \#bar2 \ # comment for bar1 and #bar2
    bar3          # comment for bar3

foo bar1 #bar2     bar3

と認識されます。(\# でコメントの無効化)
# 以外の文字はすべてエスケープが不要です。なお、スペースをエスケープすることはいまのところできません(texlive-make-file-list に限って。texlive-installer の場合はエスケープ不要。)

このプログラムで使える正規表現

boost のを使用しています。boost のバージョンにもよるかと思いますが、Perl レベルの互換性があるのではないかと思っています。+ や {} なども無条件で使える*1…はずです。

texlive-installer

ただただ、コピーするだけのプログラムです。ただし、texlive-installer.conf に記載されたルールにしたがって通常のファイルと man ファイル、info ファイルを仕分ける機能や、正規表現に一致するファイル群をコピーしない機能を持ちます。


TeX Live 2010 の時点では texmf{,-dist} 以下にシンボリックリンクを含んでいないため(おそらく方針として Windows 環境などで使用されることも考えて含めないとも考えられるが)、シンボリックリンクなど通常ファイル以外のファイルの扱いは実装されていません(コピーせず放置されます)。


コピーするディレクトリは texmf と texmf-dist に限られています (カレントディレクトリにこれらのディレクトリが存在している必要があります)。したがってプログラムを改造しないかぎり他のことには使えません。

texlive-installer.conf の書き方

ufiles_rule [正規表現]
# 正規表現に一致するファイルをコピーしません。
# 正規表現は (texmf{-,dist} を含めた) フルパス全文にマッチするものとなります。

udirs_rule [正規表現]
# 正規表現に一致するディレクトリとそれ以下のファイル群をコピーしません。
# 正規表現はディレクトリの名前に一致します。が、仕様上、途中に "/" を含んでも害はありません。
# 例えば、 a/b を指定した場合、× /aa/b ○ /a/b × /c/b となります。
# .* などを使った場合 "/" に一致する可能性があります。

man_rule [正規表現]
# この正規表現に一致するファイルは man ファイルとみなされ、%{_mandir} へインストールされます。
# 書き方は ufiles_rule と同じです。

info_rule [正規表現]
# man_rule の info ファイル用です。%{_infodir} へインストールされます。
texlive-make-file-list

TEXMF のディレクトリを走査してそのパッケージに含まれるファイルを選別するプログラムです。こちらのプログラムは texmf、texmf-dist、texmf-var、texmf-config すべて走査の対象となります。ダブったり Conflict したりするのも簡易的ではありますが、検出することができます。


Shell スクリプトで書いていた時代の仕様を半分踏襲しているため、プログラムとしてはかなり不便なものとなっています。Shell スクリプトで書いていた時代の仕様が完全にそのまま再現されたわけでもないというかなり中途半端な事態になってしまいましたがお許しください。
Shell スクリプト時代は直接引数としてスクリプトに渡していましたが、今回は texmf-make-file-list.conf から読み取る仕様に変わりました。それ故呼びだしは1回で済み、走査しながらどのパッケージに含めるか決めるというやりかたになっています。その結果全体として 9〜10 倍高速化 (Intel Core 2 Duo 1.6 GHz, -j3) を達成しました。


新しい機能としては、空マッチの報告、以前のバージョンとの差分 (このプログラムで吐き出された log ファイルを食わせることで対応します) などを表示することができます。また、プロセス分割により並列で処理を行うことができるようになりましたが、ディレクトリとファイルでプロセスをわけてしまっているため、それぞれのプロセスに対する配分は不均一になっています。均一にするにはおよそ -j10 程度を指定する必要があるとおもわれます。通常はお持ちの CPU のコア数 +1 を指定すると最も高速に処理できます。

texmf-make-file-list.conf の書き方

[パッケージ名] [梱包ルール]
# パッケージ名はパッケージ名を指定します。一部を除き、最終的に texlive-texmf-[パッケージ名] のファイルリストになります。

## 梱包ルール
# ファイルやディレクトリはいずれも正規表現です。
#   [ファイル] の場合は installer の ufiles_rule と同じルールです。
#   [ディレクトリ] の場合は installer の udirs_rule と同じルールです。

d [ディレクトリ]
# このディレクトリを握ります。

f [ファイル]
# このファイルを握ります。

p [ディレクトリ]
# このディレクトリを %dir を付けて握ります。

pf [ファイル]
# このファイル…というか実際にはディレクトリになるんだろうが…を %dir を付けて握ります。

dd [ディレクトリ]
# このディレクトリを %docdir を付けて握ります。
# なお、これによって例えば /usr/share/texmf-dist/doc/aaa を見付けた場合、リストは
#   %docdir /usr/share/texmf-dist/doc/aaa
#   /usr/share/texmf-dist/doc/aaa
# となります。

dp [ディレクトリ]
# このディレクトリを %docdir と %dir を付けて握ります。
# なお、これによって例えば /usr/share/texmf-dist/doc/aaa を見付けた場合、リストは
#   %docdir /usr/share/texmf-dist/doc/aaa
#   %dir /usr/share/texmf-dist/doc/aaa
# となります。

ddf [ファイル]
# このファイル…というか実際にはディレクトリになるんだろうが…を %docdir を付けて握ります。
# dd のファイル版

ddpf [ファイル]
# このファイル…というか実際にはディレクトリになるんだろうが…を %docdir と %dir を付けて握ります。
# dp のファイル版

dff [ファイル]
# このファイルを %doc を付けて握ります。

cmf [ファイル]
# このファイルを %config(missingok) を付けて握ります。

cnf [ファイル]
# このファイルを %config(noreplace) を付けて握ります。

ed [ディレクトリ]
# 招集したリストの中に、この [ディレクトリ] 以下のディレクトリがある場合、それを削除します。
# 例えば、d bbb により
#   /usr/share/texmf/aaa/bbb   (*)
#   /usr/share/texmf/bbb
# を得ている場合、ed aaa とすることで (*) を一覧から消すことができます。

ef [ファイル]
# 招集したリストの中に、この [ファイル] 以下のディレクトリがある場合、それを削除します。
# 例えば、d bbb により 
#   /usr/share/texmf/aaa/bbb 
#   /usr/share/texmf/bbb       (*)
# を得ている場合、ef texmf/bbb とすることで (*) を一覧から消すことができます。
# (参考: Shell Script Spec: リストから [ファイル] に一致するディレクトリやファイルを削除します)

## 例
kpathsea \
          d web2c ef texmf/doc/web2c \
          f texmf/README \
          f texmf-dist/fonts/[^/]*/system \
          pf texmf-var/web2c \
          ddpf texmf-dist/doc \
          pf texmf-dist/doc/fonts \
          pf texmf-dist/doc/fonts/enc \
          pf texmf-dist/doc/generic \
          pf texmf-dist/doc/otherformats

といったような感じです。わからないことがあれば聞いてください。

このプログラムのソースが

欲しいって?! 最新版であれば、ここ から DL してとしか言いようがないんだ。

古いバージョン? 古いバージョンも自分では取ってない (そのうえ、Git や SVN によって管理されているわけでもない) から Momonga LinuxSVN の古いリビジョンにあるもの以外はないよ。

*1:逆にそれ自身に一致させたければエスケープしなければならないということでもある。この時のエスケープはもちろん \ 1つで大丈夫です。