TeX Live の ISOイメージを、丸々 RPM にしてみる（platex を組み込む）RHEL8/CentOS8 対応

## それって要るの？

RHEL や CentOS の OS標準RPMには、昔ながらの platex が入っていなかったりするのですよね。
TeX Live には 組み込まれているのだから、何故 標準提供しないのか、意味がわからない！
という人は、一部には居ますよね。笑

私も その一人です！

ただ、TeX Live の公式提供する ISO からそのままインストールでは、**RPMインストールでないと システムポリシー的にダメ**というケースも多々あろうかと思います。

そこで、**ISOイメージを 丸々RPM化するSPEC** を作ってみました。
サイズは、かなりデカイです。バイナリRPM で **４G近く**になります。

ただ、この SPEC の利点は、**いつでも最新の 公式ISOイメージ を RPM化出来る！**ということです。

以下、SPEC を上げます。

```shell:texlive.spec
# This spec file is made for generic purpose, so it has no dependency.
%global debug_package %{nil}

Summary: TeX distribution TeX Live
Name: texlive
Version: 2021
Release: 20210325
Epoch: 99
Source0: %{name}%{version}-%{release}-00
Source1: %{name}%{version}-%{release}-01
Source2: %{name}%{version}-%{release}-02
URL: http://www.tug.org/texlive/
License: distributable
Buildroot: %{_tmppath}/%{name}-%{version}-root
BuildRequires: python2 python3
Group: Applications/Publishing
Provides: ptetex3
Provides: ptex-ttf-font
Packager: Kurioka Shinya

%define for_install_root %{_builddir}/%{name}-%{version}/for_install_root
%define for_install_tmp %{_builddir}/%{name}-%{version}/for_install_tmp
%define manifest %{_builddir}/%{name}-%{version}/%{name}-%{version}-%{release}.manifest

%description
TeX distribution TeX Live
This is an alternative package to "ptetex3 + ptex-ttf-font".

Source ISO split commad:
  ex. # split -b 2G -d texlive2021-20210325.iso texlive2021-20210325-

%prep
if [ "`mount | grep ' %{for_install_root}/usr/local/texlive '`"_ != "_" ]; then
    while(! umount %{for_install_root}/usr/local/texlive) do sleep 5; done
fi
if [ "`mount | grep ' %{for_install_root}/etc '`"_ != "_" ]; then
    while(! umount %{for_install_root}/etc) do sleep 5; done
fi
if [ "`mount | grep ' %{for_install_root}/usr '`"_ != "_" ]; then
    while(! umount %{for_install_root}/usr) do sleep 5; done
fi
if [ "`mount | grep ' %{for_install_root}/mnt '`"_ != "_" ]; then
    while(! umount %{for_install_root}/mnt) do sleep 5; done
fi
if [ "`mount | grep ' %{for_install_root}/tmp '`"_ != "_" ]; then
    while(! umount %{for_install_root}/tmp) do sleep 5; done
fi
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf $RPM_BUILD_ROOT

cat %{_sourcedir}/%{name}%{version}-%{release}-?? > %{_sourcedir}/%{name}%{version}-%{release}.iso

%setup -c -T
mkdir -p %{for_install_root}
mkdir -p /usr/local/texlive

mkdir -p %{for_install_root}/etc
mount --read-only --bind /etc %{for_install_root}/etc

mkdir -p %{for_install_root}/usr
mount --read-only --bind /usr %{for_install_root}/usr

mkdir -p %{for_install_root}/mnt
mount -o loop %{_sourcedir}/%{name}%{version}-%{release}.iso %{for_install_root}/mnt

mkdir -p %{for_install_root}/tmp
rm -rf %{for_install_tmp}
mkdir -p %{for_install_tmp}
chmod 777 %{for_install_tmp}
mount --bind %{for_install_tmp} %{for_install_root}/tmp

cp -Rdp /dev %{for_install_root}/

(cd %{for_install_root} && ln -sf ./usr/bin bin)
(cd %{for_install_root} && ln -sf ./usr/lib lib)
(cd %{for_install_root} && ln -sf ./usr/lib64 lib64) || echo -n
(cd %{for_install_root} && ln -sf ./usr/sbin sbin)

%build

%install
if [ "`mount | grep ' %{for_install_root}/usr/local/texlive '`"_ != "_" ]; then
    while(! umount %{for_install_root}/usr/local/texlive) do sleep 5; done
fi
mkdir -p $RPM_BUILD_ROOT/usr/local/texlive
mount --bind $RPM_BUILD_ROOT/usr/local/texlive %{for_install_root}/usr/local/texlive

echo "---------------------------------------------------------------------------------------------------------"
echo ' Please press "I" key for install and rpm packaging after this !!!'
echo ' Please press "I" key for install and rpm packaging after this !!!'
echo ' Please press "I" key for install and rpm packaging after this !!!'
echo ' この後、RPMパッケージ作成の為、"I"キーを押してください！'
echo ' この後、RPMパッケージ作成の為、"I"キーを押してください！'
echo ' この後、RPMパッケージ作成の為、"I"キーを押してください！'
echo "---------------------------------------------------------------------------------------------------------"
echo " [Please press enter-key!]"
perl -e '$a=<>;'
chroot %{for_install_root} /mnt/install-tl -no-gui

while(! umount %{for_install_root}/usr/local/texlive) do sleep 5; done
while(! umount %{for_install_root}/etc) do sleep 5; done
while(! umount %{for_install_root}/usr) do sleep 5; done
while(! umount %{for_install_root}/mnt) do sleep 5; done
while(! umount %{for_install_root}/tmp) do sleep 5; done
rm -f %{_sourcedir}/%{name}%{version}-%{release}.iso
rm -rf %{for_install_tmp}

export QA_SKIP_BUILD_ROOT=1
%define _python_bytecompile_errors_terminate_build 0

find $RPM_BUILD_ROOT/usr/local/texlive/2021/texmf-dist/ -type f | grep -v .org | xargs egrep '^#!/usr/bin/env python$|^#! /usr/bin/env python$|^#!/usr/bin/python$|^#!/usr/bin/python ' | sed -e 's/:.*$//' | xargs sed -i.org 's/^#!\/usr\/bin\/env python$/#!\/usr\/bin\/python2/; s/^#! \/usr\/bin\/env python$/#!\/usr\/bin\/python2/; s/^#!\/usr\/bin\/python$/#!\/usr\/bin\/python2/; s/^#!\/usr\/bin\/python /#!\/usr\/bin\/python2 /;' 2>/dev/null
find $RPM_BUILD_ROOT/usr/local/texlive/2021/texmf-dist/ -name *.org -print | xargs rm -f

%files
%defattr(-,root,root)
/usr/local/texlive

%clean
rm -rf $RPM_BUILD_DIR/%{name}-%{version}
[ -n "$RPM_BUILD_ROOT" -a "$RPM_BUILD_ROOT" != / ] && rm -rf $RPM_BUILD_ROOT

%preun

%post
MLOCATE_PATH=`ls /etc/cron.daily/mlocate* 2>/dev/null`
if [ "$MLOCATE_PATH"_ = "_" ]; then
    MLOCATE_PATH=/usr/bin/updatedb
fi
$MLOCATE_PATH

%postun
MLOCATE_PATH=`ls /etc/cron.daily/mlocate* 2>/dev/null`
if [ "$MLOCATE_PATH"_ = "_" ]; then
    MLOCATE_PATH=/usr/bin/updatedb
fi
$MLOCATE_PATH

%changelog
* Sun Jan 23 2022 Kurioka Shinya
- python shebang change.
- BuildRequires add.
* Wed May 19 2021 Kurioka Shinya
- Epoch Provides add.
* Tue May 11 2021 Kurioka Shinya
- 1st release.
```
# SPEC の解説
ソースに指定できるファイルは、cpio の制限でサイズに限界があるようです。
そこで、Description にあるように分割することで、制限回避しています。
分割サイズは 適当です。w

```
# split -b 2G -d texlive2021-20210325.iso texlive2021-20210325-
```

また、yum update した場合に、OS標準の TeX Live に置き換えられないように Epoch を指定しています。

RPM は、ISO を chroot した状態でインストールしたイメージを丸々固めているので、/usr/bin などにはインストールされません。

ビルド時には /usr/local/texlive にマウントしますので、**既に TeX Live がインストールされているシステムでビルドするときには動かなくなる可能性に注意してください。**
/usr を --bind でマウントしているのでしようがないですね。

また、RPM生成時に python の文法エラー等が出ますが、RPM が作られているのであれば、特に問題ありません。
＃ python も、2 と 3 で互換性がいろいろありますね。w
RPMインストール時、perl の いろいろな依存チェックが掛かるかと思いますが、これも無視して強制インストールしてください。笑
RPMインストール後、/usr/local/texlive 配下のバイナリに PATH を張ってください。
または、/usr/bin/platex, /usr/bin/uplatex, /usr/bin/dvipdfmx などと シンボリックリンクを張ってもよいですね。

あとは普通に、今まで通りの platex や dvipdfmx が使えます！
Enjoy, pTeX Life!