#navi(FAQ-4.2)
カテゴリー: アプリケーション
* Plamo Linux 的パッケージ作成方法 [#je1ddd39]
RIGHT:2006-06-18 (日) 18:10:39投稿
RIGHT:登録者: Plamodocs Project
----
Plamo の世界では rpm や deb のような洗練されたパッケージ作成の仕組みは用意されていませんが,手元では PlamoBuild.template と言うビルド用のスクリプト (以下テンプートスクリプト) でたいていのパッケージを作成しています.~
本稿では,このテンプレートスクリプトについて,その使い方を簡単に紹介します.~

PlamoBuild.template は configure スクリプトによって環境を調べて Makefile を作成る GNU Autoconf に対応したソフトウェアを前提にしており,このタイプのソフトウェアならたいてい以下に示す先頭部分の修正のみで適用できるはずです.~
逆に Autoconf にきちんと対応していないソフトウェアの場合は,多少の手作業が必要になりますので注意してください.~
#contents
**事前準備 (テンプレートスクリプトの入手 ) [#w8a84256]
+テンプレートスクリプトの入手~
テンプレートスクリプトは ftp://plamo.linet.gr.jp/pub/Plamo-src/admin/PlamoBuild.template からダウンロードできますので,適宜ダウンロードしておいてください.~
+パッケージ化したいソフトウェアの入手と展開,事前チェック~
パッケージ化したいソフトウェアをダウンロードして適当なディレクトリで展開しておきます.展開した時にでも,そのソフトウェアが Autoconf に対応しているか ( configure スクリプトが含まれているか ) ,./configure が正しく実行できるか (必要な環境が揃
っているか) を確認しておく方がいいでしょう.~
もしヘッダファイルやライブラリ等が不足しているようならば,まずそれら必要なファイルを含んだパッケージを作るところから始めましょう.
**実際の作成方法 [#j0a275b4]
~以下では http://prdownloads.sourceforge.net/linux-diag/sysfsutils-2.0.0.tar.gz?download からダウンロードしてきた sysfsutils-2.0.0.tar.gz というソフトウェアをパッケージ化してみます.
+ビルドスクリプトの準備~
何というソフトウェアを作るためのスクリプトかが一目で分るようにテンプレートスクリプトを元にパッケージ化したいソフトウェア用のビルドスクリプトを用意します.
 % mv PlamoBuild.template PlamoBuild.sysfsutils-2.0.0
ビルドスクリプトはパッケージ化したいソフトウェアの一つ上のディレクトリに置いておくのが便利です.~
mv の場合 PlamoBuild.template は PlamoBuild.sysfsutils-2.0.0 と変更されますので cp を使い,元の PlamoBuild.template はそのままの名称で残しておく方法を採っても構いません.
+ビルドスクリプトの修正~
エディタ等で PlamoBuild.sysfsutils-2.0.0 を開くと,先頭に以下のような部分があります.
 #!/bin/sh
 
 ###################
 url=
 src=
 pkgbase=
 vers=
 arch=
 build=P1
 pkg=`echo $pkgbase"-"$vers"-"$arch"-"$build".tgz"`
 DOCS="README ../PlamoBuild.$src"
 OPT_CONFIG=''
 ###################
凝ったことをする必要が無い場合,この #### で囲った部分に必要な情報を設定するだけでビルドスクリプトは機能します.それぞれの項目の意味は以下の通りです.
 url=
 そのソフトウェアの入手先.無くても構いませんが,記録に残しておく方が後々便利です.
  
 src=
 ソフトウェアのバージョン込みの名称
 (/usr/share/docs 以下にドキュメントファイルを作る際に利用)
 
 pkgbase=
 ソフトウェアのバージョン抜きの名称
 (Plamo的にはパッケージのベース名./var/log/packages 以下にはこの名称が記録される)
 
 vers=
 ソフトウェアのバージョン
 
 arch= 
 アーキテクチャ名(CPUの種類)の指定
 
 Plamo の場合,アーキテクチャ名の意味は以下の通り.
    i386 : ix86 系の CPU ではたいてい動くはず
    i586 : Pentium 以降じゃないと動かない
    i686 : Coppermine(PentiumIII/Celeron あたり)以降じゃないと動かない
  noarch : バイナリではなくテキストや設定ファイル等
 
 build=
 ビルド番号.同じパッケージを作り直した時の識別用
 
 pkg=
 上記情報から生成されるパッケージのフルネーム.通常は設定不要.
 
 DOCS=
 ソフトウェアに含まれているドキュメントファイル群.ここで指定したファイルが
 /usr/share/$src 以下に格納される.ドキュメントにどのファイルを含めるかの決
 まりはありませんが,最低限 README と Copyright 関係のファイルは含めるように
 しておきましょう.
 
 OPT_CONFIG=
 ./configure 実行時に --enable-gui 等,別途指定したいオプションを追加する.
今回パッケージ化しようとしている sysfsutils-2.0.0 の場合は以下のように指定しました.
 
 ###################
 url=http://prdownloads.sourceforge.net/linux-diag/sysfsutils-2.0.0.tar.gz?download
 src=sysfsutils-2.0.0
 pkgbase=sysfsutils
 vers=2.0.0
 arch=i386
 build=P1
 pkg=`echo $pkgbase"-"$vers"-"$arch"-"$build".tgz"`
 DOCS="AUTHORS COPYING CREDITS ChangeLog INSTALL NEWS README TODO docs/libsysfs.txt ../PlamoBuild.$src"
 OPT_CONFIG=''
 ###################
+ビルドスクリプトの実行~
PlamoBuild スクリプトは config と build, package の 3 つの引数を取ります.引数を指定しない場合は config, build, package が順番に実行されます.~
引数として config を指定すると ./configure スクリプトを実行するところまでで終了します.~
build を指定するとmake を実行し,package を指定すると make install DESTDIR=`pwd`/work で現在のディレクトリの work/ 以下にファイルをインストールした上で work ディレクトリで /sbin/makepkg を実行してパッケージを作成します.~
ソフトウェアによってはインストール時の DESTDIR= の指定を受けつけない場合があるので,一度上記過程を一般ユーザーで実行し,問題なくパッケージが作成されることを確認した上で (この段階ではパッケージ内のファイルの所有者は一般ユーザー) root になっ
てパッケージを再度作る (ファイルの所有者が root 等の正しい権限になる) のがいいでしょう.~
以下,実際に実行される様子を順を追って説明します.
 % cd sysfsutils-2.0.0
 % sh ../PlamoBuild.sysfsutils-2.0.0
 sh ../PlamoBuild.sysfsutils-2.0.0
 Making clean in test
 make[1]: Entering directory `/mnt/Srcs/S/sysfsutils-2.0.0/test'
  rm -f dlist_test dlist_test
  rm -f get_device get_device
sysfsutils-2.0.0 を展開したディレクトリに移って,一つ上の PlamoBuild.sysfsutils-2.0.0 が引数なしで実行されます.
 make[1]: Leaving directory `/mnt/Srcs/S/sysfsutils-2.0.0'
 checking for a BSD-compatible install... /usr/bin/install -c
 checking whether build environment is sane... yes
 checking for gawk... gawk
 checking whether make sets $(MAKE)... yes
まず ./configure が走り環境をチェックし,問題なければ必要な Makefile が生成されて make が実行されます.
 make[1]: Entering directory `/mnt/Srcs/S/sysfsutils-2.0.0'
 Making all in lib
 make[2]: Entering directory `/mnt/Srcs/S/sysfsutils-2.0.0/lib'
 if /bin/sh ../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I.. 
 -I../include   -Wall -W -Wstrict-prototypes  -g -O2 -MT libsysfs_la-sysfs_utils.lo
 -MD -MP -MF ".deps/libsysfs_la-sysfs_utils.Tpo" -c -o libsysfs_la-sysfs_utils.lo
 `test -f 'sysfs_utils.c' || echo './'`sysfs_utils.c; \then mv -f 
 ".deps/libsysfs_la-sysfs_utils.Tpo" ".deps/libsysfs_la-sysfs_utils.Plo"; 
 else rm -f ".deps/libsysfs_la-sysfs_utils.Tpo"; exit 1; fi
make が終ると make install DESTDIR=`pwd`/work が実行されます.
 Making install in lib
 make[1]: Entering directory `/mnt/Srcs/S/sysfsutils-2.0.0/lib'
 make[2]: Entering directory `/mnt/Srcs/S/sysfsutils-2.0.0/lib'
 test -z "/usr/lib" || mkdir -p -- "/mnt/Srcs/S/sysfsutils-2.0.0/work/usr/lib"
 /bin/sh ../libtool --mode=install /usr/bin/install -c  'libsysfs.la' '
 /mnt/Srcs/S/sysfsutils-2.0.0/work/usr/lib/libsysfs.la' /usr/bin/install -c 
 .libs/libsysfs.so.2.0.0 /mnt/Srcs/S/sysfsutils-2.0.0/work/usr/lib/libsysfs.so.2.0.0
make install が終了すると,インストール済みのバイナリファイルを strip したり man pages を圧縮したりの処理が実行されます.
 make[1]: Leaving directory `/mnt/Srcs/S/sysfsutils-2.0.0'
 compressing /mnt/Srcs/S/sysfsutils-2.0.0/work/usr/lib
 j:libsysfs.so
 j:libsysfs.so.2
 j:libsysfs.so.2.0.0
 stripping -g libsysfs.so.2.0.0
 ranlib and stripping -g libsysfs.a
 compressing /mnt/Srcs/S/sysfsutils-2.0.0/work/lib
 compressing /mnt/Srcs/S/sysfsutils-2.0.0/work/usr/bin
最後に work/ ディレクトリで /sbin/makepkg sysfsutils-2.0.0-i386-P1.tgz が実行されます.
 There are symbolic links in this package.
 
 Do you want to convert the symbolic links in this package into an installation
 script named "/install/doinst.sh"? If you do, the symbolic links will be
 removed. You can get them back easily, though, by typing
 ... 
 ./usr/lib/libsysfs.so
 ./usr/lib/libsysfs.so.2
 
 Making sysfsutils-2.0.0-i386-P1.tgz...
作成されたパッケージの内容をチェック (この時点では各ファイルの所有者は一般ユーザー kojima のまま) してみます.
 % tar tvzpf work/sysfsutils-2.0.0-i386-P1.tgz 
 tar tvzpf work/sysfsutils-2.0.0-i386-P1.tgz 
 drwxr-xr-x kojima/users      0 2006-06-05 15:43:54 usr/
 drwxr-xr-x kojima/users      0 2006-06-05 15:43:54 usr/bin/
 -rwxr-xr-x kojima/users   6952 2006-06-05 15:43:54 usr/bin/dlist_test
 -rwxr-xr-x kojima/users   3520 2006-06-05 15:43:54 usr/bin/get_device
 -rwxr-xr-x kojima/users   4572 2006-06-05 15:43:54 usr/bin/get_driver
 -rwxr-xr-x kojima/users   4136 2006-06-05 15:43:54 usr/bin/get_module
パッケージが正しく作成されていることを確認したら,root 権限でパッケージ作成部分 ( make install から /sbin/makepkg まで) を再実行します.
 % su
 root's password: ********
 # sh ../PlamoBuild.sysfsutils-2.0.0 package
 Making install in lib
 make[1]: Entering directory `/mnt/Srcs/S/sysfsutils-2.0.0/lib'
 make[2]: Entering directory `/mnt/Srcs/S/sysfsutils-2.0.0/lib'
こうすれば各ファイルの所有者が root (あるいは root 以外の適切な所有者) になります.~
確認してみましょう.
 # tar tvzpf work/sysfsutils-2.0.0-i386-P1.tgz
 drwxr-xr-x root/root         0 2006-06-05 15:50:12 usr/
 drwxr-xr-x root/root         0 2006-06-05 15:50:13 usr/bin/
 -rwxr-xr-x root/root      6952 2006-06-05 15:50:13 usr/bin/dlist_test
 -rwxr-xr-x root/root      3520 2006-06-05 15:50:13 usr/bin/get_device
 -rwxr-xr-x root/root      4572 2006-06-05 15:50:13 usr/bin/get_driver
 -rwxr-xr-x root/root      4136 2006-06-05 15:50:13 usr/bin/get_module
これで sysfsutils-2.0.0 をパッケージ化した work/sysfsutils-2.0.0-i386-P1.tgz というパッケージが完成しました.~

このパッケージは /sbin/installpkg や /sbin/removepkg でインストールやアンインストールが実行できます.~

PlamoBuild.template 自体は簡単なシェルスクリプトになっているので,内部でどのような処理をしているかは適宜スクリプトを読解してみてください.~
また,パッケージ作成時に用いた PlamoBuild スクリプトは /usr/share/docs/ 以下の各パッケージのドキュメントにたいてい添付されていますので参考にしてください.

**改造版テンプレートスクリプトの使用法 [#le106727]
~新しいテンプレートスクリプトと,実際の作成例として TiMidity++-2.13.2 のビルド用スクリプトは,以下のURLからダウンロードできます.~
- ftp://plamo.linet.gr.jp//pub/Plamo-src/admin/PlamoBuild.template.new
- ftp://plamo.linet.gr.jp/pub/Plamo-src/contrib/Sound/timidity/PlamoBuild.TiMidity++-2.13.2

パッケージ作成の基本的な流れは,上記と大きく変わっていませんが,スクリプト内部的に以下の部分が変更されています。

-前方互換性のためのinstall2関数を追加~
Plamo-4.2 に入っている最近の install ( coreutils 5.2.1由来) では,-D オプションがサポートされています.~
これは,インストール先ファイルにコピーするために必要な全ディレクトリを (それがない場合は) 前もって作成する機能で,新しいスクリプトではコード簡略化のためにこれを使おうとしたのですが,その場合,過去の Plamo で使えないスクリプトになってしまい
ます.~
そこで,-D オプションに相当する機能を install2 に埋め込みました.ただし -m 644 専用です.
なお,-p オプション (インストール先ファイルのタイムスタンプをインストール元ファイルと合わせる機能) については,適宜 touch で代用することにします.

 [使用例]
 
 # install -D -m 644 $srcfile $destfile
 # install -pD -m 644 $srcfile $destfile
        ↓
 # install2 $srcfile $destfile
 # install2 $srcfile $destfile ; touch -r $srcfile $destfile

-ディレクトリ一括 strip/gzip 処理を compress から分離独立~

--compress 関数は,{ bin,lib,info,man } の標準的なディレクトリを対象に圧縮するものですが,それ以外で圧縮したいディレクトリがある場合に流用できるように,一括 strip/gzip 処理を compress から分離独立しました.
--また,何も考えずに普通に圧縮すると,ディレクトリ内ファイルのタイムスタンプやファイル並びが make install した状態から変化することがあり,それがパッケージ作成結果に影響するので,そうならないように配慮しています.~
--上記の理由から,インストール直後の単体ファイルを圧縮する目的で,gzip_one 関数を用意しました.
--%%今のところ,対象ファイルがハードリンクになっている場合の考慮がされていません.この場合,ハードリンクになっている同士のうち最初のファイルだけを強制処理して,残りのファイルはその時点でハードリンクが解かれるので,一旦削除してからハードリンクを再作成するかシンボリックリンクを作成するかのいずれかになると思います.%%
-パッケージ化したいソフトウェアのダウンロードの自動化~
せっかく url= という情報があるのだから,パッケージ化したいソフトウェアを自動でダウンロードできるようにしてみました (複数ファイル可) .~
これにともない,スクリプトに download 引数を新設しました.ネットワークが整っている環境なら,作業ディレクトリにビルド用スクリプトを一つ放り込んで,
 $ ./Plamobuild.hoge download config build
 $ su
 # ./Plamobuild.hoge package
でパッケージが作成できるので便利です.

--http://prdownloads.sourceforge.net/linux-diag/sysfsutils-2.0.0.tar.gz?download のようなURLのファイルは,wgetだと上手く取り込めません.Web ページ的には直接見えませんが,jaist 決め打ちで http://jaist.dl.sourceforge.net/sourceforge/linux-diag/sysfsutils-2.0.0.tar.gz このように指定すれば wget でもダウンロード可能なようです.

ちなみに,このスクリプトで作った Plamo パッケージは,同じ日であれば何度作っても 
(ファイルにタイムスタンプ埋め込みなどが無い限り) ,バイナリ的に同一となります.

----
この件に関して追加情報などありましたら、以下にどうぞ;
-gzip_dir関数の中のrmには、-f オプションを付けた方がいいと思います。それとcompress関数の中でfor i in `seq 9` n ; にして、man9とmannの圧縮を追加してください。 -- [[hatya]] &new{2006-08-01 (火) 23:02:39};
-url="ftp://jaist.dl.sourceforge.net/pub/sourceforge/t/tc/tclx/tclx8.4.tar.bz2" などとやれば確実みたいです。このダウンロード機能は便利! -- [[hatya]] &new{2006-08-03 (木) 19:50:07};
-PREFIX=/usr などとして、/usr を$PREFIX に置き換えるようにすれば、PREFIX=/usr/X11R6 や PREFIX=/opt/kde でXやKDEのアプリケーションのmakeもいけそうです。 -- [[hatya]] &new{2006-08-07 (月) 21:15:24};
-fscheck関数の中で使われているtarはバージョン1.15以降、デフォルトのフォーマットが変更されているらしいので注意が必要です。tar-1.13.25(Plamo4.0x標準)、tar-1.14(Plamo4.2x標準)では問題ありません。恐らくtar-1.13以前でも問題無いでしょう。独自にtar-1.15以降にバージョンアップされている方は、fscheck関数の中のtar cpf, tar rpf をtar --format=oldgnu -cpf, tar --format=oldgnu -rpf に書き換えれば一応チェックはOKになると思います。しかしながら、tar-1.15以降でバイナリ的に同一になるかは確認の要ありです。私はバイナリ的に同一では無くても良いので、compressの前のtouchなんかもコメントアウトしちゃってますが。そうしないと午前0時すぎに未来の時間を指定したり、ほとんどファイルが午前9時作成になるので気持ち悪いです。 -- [[hatya]] &new{2006-09-17 (日) 12:50:56};
-荒らし防止のためか長文が打ちづらいのが難点ですね。 -- [[hatya]] &new{2006-09-17 (日) 12:57:00};
-「コメントの挿入」は一行分しか入力ウィンドウがでないけど、ざっと入力してから「編集」で直接修正してしまえば何とでも書ける気がする > wiki  -- [[kojima]] &new{2006-09-17 (日) 14:38:04};
-ちょっと壊しそうで恐いですが、「編集」にすれば何でも書き直せるんですね。アドバイス恐縮ですm(_ _)m 追記:とりあえず、kdelibsとModular Xのmakeはこのスクリプトでいけました。Xはパッケージがバラバラですが… -- [[hatya]] &new{2006-09-17 (日) 21:49:04};
-tarをバージョンアップするとfscheck関数の動作がおかしくなる件ですが,これはtar-1.15においてOLDGNUフォーマットの考慮不足のため,同一のtarアーカイブを作成するたびにバイナリが異なるというバグが混入していたためです。この不具合はtar-1.16で修正済みです。 http://cvs.savannah.gnu.org/viewcvs/tar/src/create.c?rev=1.119&root=tar&view=log -- [[tamu]] &new{2006-11-01 (水) 22:13:06};
-ついでに,coreutils-5.96にバージョンアップすると,gzip_dir関数の中の“tail +3”のような古いオプション形式をサポートしなくなるようなので,代わりに“tail -n +3”としておくと吉です。 -- [[tamu]] &new{2006-11-01 (水) 22:17:53};
-ところで,gzip_dir関数の中のrmに-fオプションを付けた方が良いとのことですが,例えばどういった状況で必要になるでしょうか? -- [[tamu]] &new{2006-11-01 (水) 22:18:55};
-おお、tar-1.15.xのバグだったんですか。gzip_dir関数のrmの-fオプションは、試しに一般ユーザーの権限でパッケージを作ろうとする場合、パーミッションが落っこちている(落としてある)と、rm: remove write-protected file `XXXXX'? というメッセージが出力されて進まなくなることがあるからです。 -- [[hatya]] &new{2006-11-03 (金) 10:09:56};
-ふみ,PlamoBuildの実行途中で“Do you want to package as root? [y/N]”に対してnを選択した場合,そうなる可能性がありますね。直しておきます。 -- [[tamu]] &new{2006-11-05 (日) 20:27:13};
-man9とmannの圧縮を追加する件ですが,man9はLinux独自のカーネルルーチン用のドキュメンテーションで,mannは新しいドキュメンテーションですね。これも直しておきます。 -- [[tamu]] &new{2006-11-05 (日) 20:27:39};

#navi(FAQ-4.2)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS