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

第5回Plamoメンテナのすゝめ(下)

前回までにPlamoBuildスクリプトの基本的な使い方を紹介しました。今回は、もう少し踏み込んだ使い方を紹介します。

設定オプションの指定

ソースコードに必要な設定を施すconfigureスクリプトは、オプション引数で動作を調整することができます。前回取りあげた--disable-static --enable-sharedなどが代表的なオプション引数です。

オプション引数には、インストール先を指定する--prefix=..や設定ファイルの置き場所を指定する--sysconfdir=..など、configureを採用しているほとんどのソフトウェアで使用可能なものと、それぞれのソフトウェアごとに用意されたものがあります。

どのようなオプション引数が使用可能かはconfigure --helpで確認できます。前回までに紹介してきたfluxboxの場合、以下のようなオプションが用意されています。

$ ./configure --help | cat -n
  ....
  76      --enable-regexp         regular expression support (default=yes)
  77      --enable-slit           include code for the Slit (default=yes)
  78      --enable-systray        include SystemTray (default=yes)
  79      --enable-toolbar        include Toolbar (default=yes)
  80      --enable-ewmh           enable support for Extended Window Manager Hints
  81                              (default=yes)
  82      --enable-debug          include verbose debugging code (default=no)
  83      --enable-test           build programs used in testing fluxbox (default=no)
  84      --enable-nls            include native language support (default=yes)
  85      --enable-timedcache     use new timed pixmap cache (default=yes)
  86      --enable-xmb            XMB (multibyte font, utf-8) support (default=yes)
  87      --disable-imlib2        disable imlib2 support
  88      --disable-xft           disable xft support
  89      --disable-freetype2     disable freetype2 support
  90      --disable-xrender       disable xrender support
  91      --disable-xpm           disable xpm support
  92      --disable-xinerama      disable xinerama support
  93      --disable-xext          disable Misc X Extension Library support
  94      --disable-xrandr        disable xrandr support
  95      --disable-fribidi       disable fribidi support
  ...

各引数はそれぞれどのような機能を追加、あるいは削除するかを指定し、引数を指定しなかった場合のデフォルト値が括弧内に記載されています。このリストを見ると、82行目の"--enable-debug"と83行めの"--enable-test"というデバッグ以外の機能は(default=yes)となっており、敢えて指定する必要はなさそうです。

一方、ライブラリ等が不足していて特定の機能を無効にしたい場合は、"--enable-xmb=no --disable-fribidi"のように指定することになります。

PlamoBuildスクリプトではconfigureに渡す引数はヘッダ部のOPT_CONFIGで設定します。上記設定の場合、前回紹介したPlamoBuild.fluxbox-1.3.7の9行目に追加することになります。

9  OPT_CONFIG="--enable-xmb=no --disable-fribidi"

この設定は、configureを起動している59行目に直接追加してもいいものの、⁠configureオプションをどう設定したか」はパッケージにとって重要な意味を持つので、PlamoBuildスクリプトを開けばすぐ目に入る、ヘッダ部分に設定するようにしています。

設定オプションの虎の巻

紹介してきたfluxbox-1.3.7のように、最近では多くのソフトウェアがあらかじめ用意されたデフォルト値で最適な設定になるよう調整されています。しかしながら、設定オプションでの機能調整が必須なソフトウェアもよくあり、どのような設定オプションを指定するかはパッケージ作成時の悩みの種です。

設定オプションに悩んだ時は、他のディストリビューションを参考にするのが便利です。手元では、主にLFS/BLFSArch Linuxのビルドスクリプトを見ています。

LFS(Linux From Scratch)/BLFS(Beyond Linux From Scratch)は本連載でも何度か紹介したことがあるように、必要最小限の機能を目指した設計になっており、彼らが選択している設定オプションはどのLinux環境でも必要になります。

一方、Arch Linuxは、シンプルながら先進的で高機能な環境を目指していて、新しく追加された機能なども積極的に採用しています。そのため両者を見比べれば、可能な設定範囲はほぼカバーでき、その中からPlamo Linuxに必要な機能を考えることができます。

取りあげてきたfluxboxの場合、BLFSでは"./configure --prefix=/usr"となっているのに対し、Arch Linuxでは"./configure --prefix=/usr --enable-imlib2 --enable-nls --enable-xft --enable-xinerama"となっていました。

Arch Linuxで指定している各オプションの意味は何だろう、とヘルプメッセージを調べたところ、先に紹介したように、それら機能はデフォルトで"yes"になっていたため、OPT_CONFIGには何も指定する必要はないだろう、と判断した次第です。

主要ディストリビューションであるRedHat/Fedora系やDebian系も重要なものの、SRPMや.deb.tar.xzといった独自のビルドシステムを構築しているこれら系統よりも、コマンドラインやシェルスクリプトをそのまま流用できるLFS/BLFSやArch Linuxの方が、Plamo Linuxからは利用しやすいです。

なお、LFS/BLFSでは、ソースコードを修正する際、パッチファイルではなくsed等のコマンドを多用しています。そのような修正をPlamoBuildスクリプトに取り込む場合、設定処理部のconfigureスクリプトを起動する前、前回紹介したPlamoBuild.fluxbox-1.3.7を例にすれば、47行目から56行目の間あたりに追加する必要があります。

configure以外への対応

make_PlamoBuild.pyはconfigure以外にもCMakePythonのsetup.pyPerlのMakefile.PLに対応しており、それぞれに応じたPlamoBuildスクリプトを作ります。といっても、違いはconfigureの代わりにcmakeやsetup.pyを実行する程度です。

たとえば、Qtを用いたターミナルソフトqterminal-0.8.0はビルドシステムにCMakeを使っており、設定にcmakeコマンドを使います。

 54      cd $B
 55      export PKG_CONFIG_PATH=/usr/${libdir}/pkgconfig:/usr/share/pkgconfig:/opt/lxqt/${libdir}/pkgconfig
 56      export LDFLAGS='-Wl,--as-needed' 
 57      cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ${OPT_CONFIG[$i]} $S
 58 

cmakeコマンドはconfigureと同じように、システムにインストールされているライブラリ等を調べてその環境に適したMakefileを作るので、以後の処理はconfigure同様、makeコマンドが担います。

Perl用のソフトウェアが採用しているMakefile.PLも、環境に応じたMakefileを作るように設計されており、ビルドやパッケージ化にはmakeコマンドを用います。

一方、Python用のソフトウェアはsetup.pyというPythonスクリプトで設定からビルド、インストールまで対応しています。以下に示すのはPythonで書かれたカードゲームPySolFC-2.2.0用のビルドスクリプトの設定からインストールするまでの処理で、52行目の設定、62行目のビルド、73行目のインストールそれぞれが"setup.py"によって実行されています。

 47      cd $B
 48      for patch in $patchfiles ; do
 49         patch -p1  50      done
 51  
 52      python setup.py config
 53      
 ...
 58  fi
 59      
 60  if [ $opt_build -eq 1 ] ; then
 61      cd $B
 62      python setup.py build
 ...
 67  fi
 68  
 69  if [ $opt_package -eq 1 ] ; then
 70    check_root
 71    if [ -d $P ] ; then rm -rf $P ; fi ; mkdir -p $P
 72    cd $B
 73    python setup.py install --root $P
 74 

これら4種のビルドシステムはmake_PlamoBuild.pyが見分けられるので、設定オプションの調整程度の作業でパッケージ作成が可能です。また、最新版のmake_PlamoBuild.pyでは、新しくmeson/ninjaビルドシステムにも対応しました。

適切な設定方法が見つからない場合

make_PlamoBuild.pyは、ソースコード中にconfigureCMakeList.txtMakefile.PLsetup.pyのいずれかのファイルを見つけた場合、それぞれに応じたPlamoBuildスクリプトを作ります。一方、ソースコード中にこれらのファイルが無かった場合は、⁠⁠適切な設定方法がわからない」旨のメッセージを出して、configure用のビルドスクリプトを作ります。

この場合、ビルドスクリプトを手動で調整する必要があります。どのように調整するかはソフトウェアにより異なるため、詳細についてはソースコードに付属のドキュメント類を調べることになるものの、大きく分けると「SConsやWAFなど未対応のビルドシステムを利用している」場合、⁠あらかじめMakefileが用意されている」場合、⁠autogen.shを実行してconfigureスクリプトを生成する」場合などがあります。

これらのうち「あらかじめMakefileが用意されている」場合の例として、FDcloneと呼ばれるテキストベースのファイルマネージャをビルドしてみましょう。FDcloneは、元々MS-DOS用に開発された"FD"というファイルマネージャを参考に、UNIX系OS用に開発されたファイルマネージャで、コンソール環境でも一覧画面からファイルを操作できる便利なツールです。

図1 コンソールで起動したFDclone
図1 fluxboxウィンドウマネージャの設定画面

FDcloneの最新版はftp.unixusers.netで公開されているので、まずこのソースコードを入手し、手もとの作業用ディレクトリに展開しておきます。

$ wget ftp://ftp.unixusers.net/src/fdclone/FD-3.01h.tar.gz
$ tar xvf FD-3.01h.tar.gz
$ ls
  FD-3.01h/  FD-3.01h.tar.gz

次に、展開したソースコードディレクトリに対してmake_PlamoBuild.pyを実行します。FDcloneにはconfigure等のファイルが無いため、⁠適切な設定方法がわからない」旨のメッセージが表示されました。

$ make_PlamoBuild.py -u ftp://ftp.unixusers.net/src/fdclone/FD-3.01h.tar.gz FD-3.01h
cannot find proper configure methods.
PlamoBuild script is setup for configure, but you should adjust build script manually

このままでは、configureスクリプトが無いため、エラーになってビルドスクリプトを実行できません。

$ ./PlamoBuild.FD-3.01h 
./PlamoBuild.FD-3.01h: 行 59: /home/kojima/Srcs/FD-3.01h/configure: そのようなファイルやディレクトリはありません
configure error. ./PlamoBuild.FD-3.01h script stop

一方、FD-3.01hのソースコードを調べると、READMEやInstallといったドキュメントと共にMakefileも用意されており、ソースコードディレクトリでmakeを実行すると、問題なくビルド作業が始まります。

$ ls FD-3.01h
...
Makefile      command.c   fd_e.cat    kanjicnv.c  malloc.c      pathname.c    string.h   url.c
Makefile.in   config.hin  fd_e.man    kconv.c     malloc.h      pathname.h    sysemu.c   url.h
README        custom.c    file.c      kconv.h     mkcat.c       posixsh.c     sysemu.h   urldisk.c
...
$ cd FD-3.01h
$ make
echo '1,/^$/d' > hmachine.sed
sed -n -e 's:machine.h:hmachine.h:g' -e '1,/^$/p' machine.h > hmachine.h
sed -f hmachine.sed machine.h >> hmachine.h
cp config.hin config.h
cc   -DPREFIX='"'/usr/local'"' -DCONFDIR='"'/etc'"' -DDICTSRC='"''''"' -DFD=3 -DCCCOMMAND='"'cc'"' -DHOSTCCCOMMAND='"'cc'"' -DCFLAGS='"''''"' -DHOSTCFLAGS='"''''"' -DCPPFLAGS='"''''"' -DHOSTCPPFLAGS='"''''"' -DLDFLAGS='"''''"' -DHOSTLDFLAGS='"''''"' -o mkmfsed mkmfsed.c
  ...

Makefileが用意されているなら直接ビルドできるのかな、と考えて、PlamoBuildスクリプトを"build"オプションで起動してもエラーになります。

$ ./PlamoBuild.FD-3.01h build
make: *** ターゲットが指定されておらず, makefile も見つかりません.  中止.
build error. ./PlamoBuild.FD-3.01h script stop

このトラブルは、PlamoBuildスクリプトでは、ソースコードディレクトリとビルド作業用ディレクトリを分けていることが原因で、FDcloneのようにソースコードディレクトリ内でしかビルドできないソフトウェアでは、まずソースコードをビルド作業用ディレクトリにコピーしてやる必要があります。

元のビルドスクリプトの設定部分はこうなっていました。

 41  if [ $opt_config -eq 1 ] ; then
 42  ######################################################################
 43  #  out of tree build. patch apply in src dir
 44  ######################################################################
 45      if [ -d $B ] ; then rm -rf $B ; fi ; mkdir -p $B 
 46      cd $S
 47      for patch in $patchfiles ; do
 48          if [ ! -f .${patch} ]; then
 49              patch -p1  50              touch .${patch}
 51          fi
 52      done
 53      # if [ -f autogen.sh ] ; then
 54      #   sh ./autogen.sh
 55      # fi
 56      cd $B
 57      export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/share/pkgconfig
 58      export LDFLAGS='-Wl,--as-needed' 
 59      $S/configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --mandir='${prefix}'/share/man ${OPT_CONFIG}
 60      if [ $? != 0 ]; then
 61          echo "configure error. $0 script stop"
 62          exit 255
 63      fi
 64  fi

このコードの$Bがビルド作業用ディレクトリ(/tmp/build)で、45行目に見るように、設定処理を行なう毎にこのディレクトリは作り直されます。そこで、この部分を次のように直しました。

 41  if [ $opt_config -eq 1 ] ; then
 42  ######################################################################
 43  #  in source tree build. patch apply in build dir
 44  ######################################################################
 45      if [ -d $B ] ; then rm -rf $B ; fi ; cp -a $S $B 
 46      cd $B
 47      for patch in $patchfiles ; do
 48          if [ ! -f .${patch} ]; then
 49              patch -p1  50              touch .${patch}
 51          fi
 52      done
 53      opt_build=1
 54      echo "no need to config, proceed to build"
 55  fi

少し43行目のコメントも直していますが、重要なのは45行目で、空のディレクトリを作る代わりにソースコードディレクトリを全てコピーしています。

configureは不要なので削除し、53行目でopt_buildフラグを立てて、自動的にビルド作業に進むようにしました。この修正でコンパイルはできるようになりました。

$ ./PlamoBuild.FD-3.01h 
no need to config, proceed to build
make -f Makefile.tmp
make[1]: ディレクトリ '/tmp/build' に入ります
cc -DLINUX=1 -O -D_FILE_OFFSET_BITS=64   -Wno-empty-body -Wno-shift-negative-value   -DFD=3 -c -o printf.o printf.c
...

しかしながら、パッケージを作成しようとすると、⁠インストール先に書き込めない」旨のエラーになります。

Do you want to package as root? [y/N] 
make BUILD= -f Makefile.tmp install
...
install: 通常ファイル '/usr/local/bin/fd-unicd.tbl' を作成できません: 許可がありません
chmod: '/usr/local/bin/fd-unicd.tbl' にアクセスできません: そのようなファイルやディレクトリはありません
make[1]: [Makefile.tmp:486: install-table] エラー 1 (無視されました)
...

このエラーは、一般ユーザ権限で/usr/local/binに書き込もうとしたことが原因で、インストール先を一般ユーザ領域にするためのmake install DESTDIR=$Pが機能していないようです。

"make install DESTDIR=..."はインストール先を変更するための指定ですが、インストール先を変更するためのオプションはソフトウェアによって異なり、"DESTDIR=..."とするものが多いものの、"INSTALLROOT=..."だったり、"prefix=..."だったりすることがあります。

インストール先をどう指定するかはMakefile等を調べる必要があり、FDcloneの場合はPREFIX=...という指定になるようです。そこで、この設定もPlamoBuildスクリプトに反映します。

 72    export LDFLAGS='-Wl,--as-needed'
 73    make install PREFIX=$P/usr

PlamoBuildスクリプトは"config"オプションを指定した際にビルド用ディレクトリが初期化されるようになっています。逆に言うと、"config"オプションを再実行するまでビルド用ディレクトリはそのまま保持されるので、一度ビルドが通っていれば、パッケージ化のみをやり直せます。

$ ./PlamoBuild.FD-3.01h package
Do you want to package as root? [y/N] 
make BUILD= -f Makefile.tmp install
make[1]: ディレクトリ '/tmp/build' に入ります
if [ -f fd-unicd.tbl ]; then \
      [ -d /home/kojima/Srcs/F/FDclone/work/usr/bin ] || ./mkdir_p /home/kojima/Srcs/F/FDclone/work/usr/bin; \
      install -c fd-unicd.tbl /home/kojima/Srcs/F/FDclone/work/usr/bin; \
      chmod a+r-x /home/kojima/Srcs/F/FDclone/work/usr/bin/fd-unicd.tbl; \
fi
...
pruning symlink in /home/kojima/Srcs/F/FDclone/work/usr/share/man/man9
pruning symlink in /home/kojima/Srcs/F/FDclone/work/usr/share/man/mann
basename:FD
version:3.01h
arch:x86_64
build:B1
ext:txz

上記の"make install PREFIX=$P/usr"の指定で、必要なファイルがインストール用ディレクトリに正しくインストールされ、パッケージも無事作成できました。

$ ls -l
合計 1,429,504
drwxr-xr-x 1 kojima users   2,452  8月 11日  00:00 FD-3.01h/
-rw-r--r-- 1 kojima users 463,872 12月 20日  23:37 FD-3.01h-x86_64-B1.txz
-rw-r--r-- 1 kojima users 957,354 12月 20日  15:24 FD-3.01h.tar.gz
-rwxr-xr-x 1 kojima users   2,914 12月 20日  21:46 PlamoBuild.FD-3.01h*
drwxr-xr-x 1 kojima users       6 12月 20日  23:37 work/

必要なファイル類が正しく収められているのを確認すれば、念のため、再度PlamoBuild.FD-3.01hスクリプトを最初から実行し直し、root権限でパッケージ化して、Plamo Linux用FDcloneパッケージの完成となります。


今回取りあげたFDcloneのように、configure等の標準的なビルドシステムを採用していないソフトウェアをパッケージ化するのは少し面倒なものの、現在ではこのような個別対応が必要となるソフトウェアは少数派で、たいていのソフトウェアはmake_PlamoBuild.pyで作成したビルドスクリプトのままパッケージ化することができます。

しかしながら、自動生成したビルドスクリプトだけで作れるパッケージだけでは飽き足らず、この種の手のかかるパッケージの方に作りがいを感じてしまうのは、メンテナの性(さが)というものでしょうか?(苦笑)

おすすめ記事

記事・ニュース一覧