続・玩式草子 ―戯れせんとや生まれけん―

第3回Plamoメンテナのすゝめ(上)

昨今は少子高齢化に伴なう労働力不足がかまびすしく論じられ、定年の延長や外国人労働者、AIやロボット、ドローンの活用等、さまざまな方策が検討されています。

規模こそ異なりますが、Plamo Linuxでもパッケージを作成するメンテナの不足、高齢化は深刻な問題になっています。

そこで、Plamo Linux 7.0(Plamo-7.0)が出た機会に合わせ、一人でも多くの人にパッケージ作りに関心を持ってもらうため、何回かに渡ってPlamo Linuxのパッケージ作成方法を紹介していこうと思います。

「自動化」が人手不足の対策になるように、Plamo Linuxではmake_PlamoBuild.pyというビルドスクリプト作成ツールがメンテナ不足の対策になっているので、まずはこのツールの紹介から始めましょう。

make_PlamoBuild.pyの基本的な使い方

Plamo Linux用のパッケージをビルドするためのスクリプトとそれを作るツールについては、過去に何度かとりあげたことがあります。しかしながら、最後に取りあげた回から早2年、その間にPlamo-7.0をリリースするなど状況もずいぶん変化しているので、過去の記事と重複する部分もあるものの、改めて最初から解説することにします。

ソースコードからパッケージを作成するにはさまざまな作業が必要で、ビルドスクリプトをゼロから書くのはかなり面倒です。一方、必要な作業はたいていのパッケージに共通で、定型化することも可能です。そこでPlamo Linuxでは、メンテナの手間を省くために、ビルドスクリプトを作成するツールを用意しました。

このツールはPlamo Linuxのバージョンアップと共に進化していて、最近使っているmake_PlamoBuild.pyでは、作成したビルドスクリプトそのままで、たいていのソフトウェアをパッケージ化できるようになりました。

make_PlamoBuild.pyは、ソースコードを展開したディレクトリを調べてそのソフトウェアのビルド方法を推測し、それに応じたビルドスクリプトを作成します。このツールは"-h"を引数にして起動すると、簡単な使い方を示します。

$ make_PlamoBuild.py -h
usage: make_PlamoBuild.py [-h] [-p PREFIX] [-u URL] [-m METHOD] [-s] srcdir
 
PlamoBuild script maker
 
positional arguments:
  srcdir                source code directory
  
optional arguments:
  -h, --help            show this help message and exit
  -p PREFIX, --prefix PREFIX
                        install directory prefix(default=/usr)
  -u URL, --url URL     source code download url
  -m METHOD, --method METHOD
                        force config method(config, cmake, perl, python)
  -s, --source          copy source codes into build directory(use with configure)

ビルドしたいソースコードを展開したディレクトリsrcdirが必須の引数です。よく使うオプションはソースコードのURLを指定する"-u"で、ここで指定したURLは作成したビルドスクリプトのヘッダ部分に設定されます。その他のオプションについては後述します。

make_PlamoBuild.pyの実行例として、Plamo-7.0には含まれていない、fluxboxウィンドウマネージャーをパッケージ化してみましょう。

ソースコードのダウンロードと展開

まず、作業用のディレクトリを作ります。筆者は、ファイルとディレクトリを一目で区別できるように、ディレクトリ名は大文字で始めるのが好みです。

$ mkdir Fluxbox ; cd Fluxbox

パッケージ化したいソフトウェアのソースコードURLをホームページ等で調べ、必要なファイルをダウンロード、展開します。fluxboxの場合、sourceforge.netが入手先でした。

$ wget http://sourceforge.net/projects/fluxbox/files/fluxbox/1.3.7/fluxbox-1.3.7.tar.xz
  --2018-10-25 12:31:50--  http://sourceforge.net/projects/fluxbox/files/fluxbox/1.3.7/fluxbox-1.3.7.tar.xz
  sourceforge.net をDNSに問いあわせています... 216.105.38.13
  sourceforge.net|216.105.38.13|:80 に接続しています... 接続しました。
  ...
  2018-10-25 12:38:59 (2.70 MB/s) - `fluxbox-1.3.7.tar.xz' へ保存完了 [786492/786492]
$ tar xvf fluxbox-1.3.7.tar.gz
  fluxbox-1.3.7/
  fluxbox-1.3.7/TODO
  ...
  fluxbox-1.3.7/3rd/vim/vim/compile_vba.sh
  fluxbox-1.3.7/3rd/vim/vim/Makefile

make_PlamoBuild.pyの実行

展開したソースコードディレクトリ(fluxbox-1.3.7)を指定してmake_PlamoBuild.pyを実行します。その際、"-u"オプションでソースコードのURLを指定すれば、作成するPlamoBuildスクリプトに自動的に組み込まれます。また、スクリプト名やパッケージ名、バージョンなども、ソースコードディレクトリの名前を元に生成します。

$ make_PlamoBuild.py -u http://sourceforge.net/projects/fluxbox/files/fluxbox/1.3.7/fluxbox-1.3.7.tar.xz fluxbox-1.3.7
$ ls -l
合計 802,816
-rwxr-xr-x  1 kojima users   2,854 10月 25日  19:44 PlamoBuild.fluxbox-1.3.7*
drwxr-xr-x 10 kojima users   4,096  2月  8日 2015年 fluxbox-1.3.7/
-rw-r--r--  1 kojima users 786,492  2月  8日 2015年 fluxbox-1.3.7.tar.xz

これで、fluxbox-1.3.7のビルドスクリプトPlamoBuild.fluxbox-1.3.7が作成できました。

こうして作成したPlamoBuild.fluxbox-1.3.7を実行すると、configure、make、make installを順に実行して、最終的にfluxbox-1.3.7-x86_64-B1.txzというパッケージを作成します。

$ ./PlamoBuild.fluxbox-1.3.7
configure: WARNING: unrecognized options: --disable-static, --enable-shared
checking for gcc... gcc
checking whether the C compiler works... yes
...
g++  -g -O2   -Wl,--as-needed -o fluxbox-update_configs src/fluxbox_update_configs-defaults.o
    src/fluxbox_update_configs-Resources.o util/fluxbox_update_configs-fluxbox-update_configs.o
    libFbTk.a -lfribidi -lX11  -lrt  -lm
make[2]: ディレクトリ '/tmp/build' から出ます
make[1]: ディレクトリ '/tmp/build' から出ます
Do you want to package as root? [y/N] N
...
pruning symlink in /home/kojima/Srcs/Fluxbox/work/usr/share/man/mann
basename:fluxbox
version:1.3.7
arch:x86_64
build:B1
ext:txz
$ ls -l
-rwxr-xr-x  1 kojima users   2,854 10月 25日  19:44 PlamoBuild.fluxbox-1.3.7*
drwxr-xr-x 10 kojima users   4,096  2月  8日 2015年 fluxbox-1.3.7/
-rw-r--r--  1 kojima users 798,240 10月 25日  20:00 fluxbox-1.3.7-x86_64-B1.txz
-rw-r--r--  1 kojima users 786,492  2月  8日 2015年 fluxbox-1.3.7.tar.xz
drwxr-xr-x  3 kojima users   4,096 10月 25日  20:00 work/

この例では、⁠--disable-static, --enable-shared というオプションは無いよ」という警告がでているものの、fluxboxのビルドには支障なく、make_PlamoBuild.pyで作成したビルドスクリプトそのままでパッケージが作成できました。最近の標準的なビルド手法を採用しているソフトウェアでは、この例のように、ソースコードやビルドスクリプトを見ることなくパッケージを作ることが可能です。

なお、上記の手順では一般ユーザのままパッケージを作成しているため、パッケージ内のファイルのオーナーやパーミッション等が正しく設定されず、このままでは使用できません。PlamoBuildスクリプトの使い方や修正方法の詳細は改めて紹介する予定なものの、それが待てない方は "Do you want to package as root?"の質問に"y"と答え、root権限でパッケージを作成するようにしてください。

もう少し詳しい使い方

make_PlamoBuild.pyは、前節のようにソースコードディレクトリの指定だけでビルドスクリプトを作成できるものの、オプション指定で動作を調整することもできます。以下に指定可能なオプションを紹介します。

インストール先の変更-pオプション)

make_PlamoBuild.pyで作成したPlamoBuildスクリプトは、デフォルトでは"/usr"以下にファイルをインストールします。このインストール先を変更したい場合、"-p"オプションを指定します。

たとえば、fluxbox-1.3.7を"/usr/local/"以下にインストールしたい場合、以下のようにmake_PlamoBuild.pyを実行します。

$ make_PlamoBuild.py -p /usr/local fluxbox-1.3.7

"-p"オプションは、configureを使う場合は"--prefix"、cmakeを使う場合は"CMAKE_INSTALL_PREFIX"に反映されます。

ビルド方法の手動指定-mオプション)

前節で紹介したように、make_PlamoBuild.pyは、ソースコードを調べて、そこにあるファイルからビルド方法を自動判断してPlamoBuildスクリプトを作成します。対応しているビルド方法は、GNU Autotools("configure"⁠⁠、cmake("CMakeLists.txt"⁠⁠、Python("setup.py"⁠⁠、Perl("Makefile.PL")の4種で、それぞれ()内に示したファイルがソースコードに含まれていた場合に選択されます。

ソースコード中にこれらのファイルが見つからなかった場合は、⁠適切なビルド方法が見つからなかった」旨のメッセージを出し、GNU Autotools用、すなわちconfigureを使う設定でPlamoBuildスクリプトを作ります。この場合、そのままでは動かないので、ビルドスクリプトを手動で調整する必要があります。

一方、最近では、複数のビルド方法を用意したソフトウェアもあります。たとえば、あるソフトウェアはconfigureとCMakeLists.txtの双方を用意しており、GNU Autotoolsでもcmakeでもビルドできるようでした。どちらでもいいのか、と思ってcmake方式でビルドしてみたら、前のバージョンと違って共有ライブラリが作成されません。あれれ、と思って調べてみると、Autotoolsからcmakeへの移行中のようで、CMakeLists.txtはまだ不完全な状態でした。

このような問題を回避するため、ビルド方法を指定する"-m"オプションを用意しました。"-m"オプションに指定可能なキーワードは"config"、"cmake"、"perl"、"python"で、このオプションを指定するとソースコード中のファイルの有無をチェックせず、それぞれのビルド方法に応じたPlamoBuildスクリプトを作成します。

ソースコードのコピー-sオプション)

最近のビルドシステムでは、ソースコードの汚染を避けるため、ビルド用ディレクトリとソースコードディレクトリを分離することが推奨され、PlamoBuildスクリプトでも両者は独立したディレクトリにしています。

しかしながら、古めのソフトウェアの中にはソースコードのあるディレクトリでビルドすることを前提にした作りになっているものもあり、両者を別にすると「必要なファイルが見つからない」旨のエラーになることがあります。

そのようなソフトウェア用に用意したのがソースコードのコピーを意味する"-s"オプションで、このオプションを指定して作ったビルドスクリプトは、ソースコードをビルド用ディレクトリにコピーしてから作業を開始します。

以上、make_PlamoBuild.pyのオプション機能を紹介しました。

その他、使う際の注意点をもう2つほどあげておきます。

パッケージの名前解決

make_PlamoBuild.pyは、ソースコードを収めたディレクトリ名が"-"になっていることを前提に、ビルドスクリプトや作成するパッケージの名前、バージョン番号を設定します。

今回取りあげた"fluxbox-1.3.7"のように、最近ではたいていのソフトウェアがこの命名ルールに従っているものの、ソースコードを"LVM2.2.02.99"ディレクトリに展開するLVM2(Logical Volume Manager)や"tcl8.6.8"に展開するスクリプト言語Tclなど、このルールに従っていないソフトウェアも散在します。そのようなソフトウェアは、ソフトウェア名やバージョンが正しく設定できないので、手動で修正する必要があります。

パッチファイルの扱い

make_PlamoBuild.pyには、作業用ディレクトリに置かれた".patch"や".diff"という拡張子を持ったファイルをソースコードに対するパッチファイルと認識し、ビルドスクリプトに取り込む機能があります。取り込んだパッチファイルは、ビルド作業の前に"patch -p1

パッチファイルは複数用意することも可能なものの、ワイルドカードで認識された順に適用されるので、適用順を管理するには、ファイル名を調整するか、patchfiles行を編集する必要があります。


今回は、話の都合上、make_PlamoBuild.pyに焦点を絞ったため、PlamoBuildスクリプトや作成されるパッケージとの関係がわかりづらかったかも知れません。そのあたりの詳細は、次回以降のPlamoBuildスクリプトの解説の中で、改めて触れる予定ですのでご期待ください。

従来、PlamoBuildスクリプトをどう書くかは、パッケージを作るメンテナの裁量に任せていたため、ずいぶん凝った作りのコードもありました。しかしながら、あまり凝ったコードは初心者にわかりにくいし、パッケージのメンテナが変わった際にも不便なので、Plamo-7.0では全てのパッケージをmake_PlamoBuild.pyで作成した、100行程度のシンプルなスタイルに統一しています。これらビルドスクリプトは各パッケージの一部として/usr/share/doc/以下にインストールされていますのでぜひチェックしてみてください。

おすすめ記事

記事・ニュース一覧