SUSE Linuxビルドのチュートリアル
はじめに
この文書は SUSE のビルド機構の概観と、SUSE Linux のために RPM パッケージを作成する仕方についてのチュートリアルです。 ここに書かれた情報は、あなたが自分の一時的なビルド環境をセットアップするのを助けるでしょう。最初の4つの章では、例に従っていくと手順がどう進んでいくかについての外観を与えます。
あらかじめ必要なもの
RPM パッケージの作成についてちゃんと理解していることが前提です。この文書は、RPM 自身の説明を目的としたものではありません。その目的のためには、すでにたくさんの HOWTO やガイド、書籍があります。RPM 関連のリンクは 参考資料 を参照して下さい。
また、PGP 関連のツール (特に 最も広く利用されている OpenPGP の実装である GNU Privacy Guard (gpg) )の経験も必要です。なぜ PGP が重要なのかは、パッケージ署名についてお話する時に説明します。パッケージに署名するためには、SUSE のビルド環境を使い始める前にあなた自身の PGP 鍵が必要になります。
そしてもちろん、自分のプロジェクトがパッケージに使っているソースコード環境をよく知っていることが必要です。SUSE のビルド機構は、プロジェクトのメンテナたちが犯しがちな共通のミスに対処することができます。しかし、make や autoconf、imake、もしくは他のソースコード・コンフィギュレーションのメカニズムについて知っていれば、パッケージを扱う際に役に立ちます。
必要なもの
単純です。3 GB の空き容量と私たちのビルドツールである y2pmbuild、これだけです。
3 GB の空き容量が必要なのは、SUSE のビルド機構はパッケージをビルドする環境として、ハードディスク上の独立した Linux 環境を使うからです。この孤立した環境は、一つの大きな利点を持っています。すなわち、パッケージをビルドしても、現在の Linux 環境がみだりに変更されたりはしないでしょう。唯一の欠点は、独立したビルド環境ごとに 3 GB の空き容量が必要だということです。とは言え、今日のハードディスク容量であれば、これは問題ではないでしょう。
ビルドツール (y2pmbuild) は指定された場所にビルド環境をセットアップし、それからその環境でパッケージをビルドします。ビルド環境は、ベースとなるシステムと自分が RPM の spec ファイルに指定した追加パッケージで構成されます。
作業手順
以下のステップがパッケージをビルドする通常の作業手順の概要です。もちろん、現実の世界の例でも、人はあるステップでつまづくでしょうし、それが失敗しなくなるまで繰り返さなければならないでしょう。この概要は、私たちが成し遂げようとしていることの「感じ」を与えるためのものにすぎません。
ステップ1 - 必要なものをインストールする
まだインストールしていないなら、YaST を使って、自分が設定している SUSE のインストールソースから以下のパッケージをインストールします:
- y2pmsh
- bzip2
- gpg
ステップ2 - y2pmsh を設定する
ビルドツール (y2pmbuild) を設定します。自分のローカルの環境に合わせるために手を加えなければならない設定がいくつかあります。たとえば:
- ビルド環境をセットアップするための RPM パッケージを入手してくる場所
- build root ディレクトリの basename
- ビルドされた rpm パッケージを保存する場所
- 自分独自の RPM マクロの設定
- 自分独自の RPM brp スクリプトを使う
- 自分の gpg の設定のコピー
等といったことです。
ステップ3 - ソースディレクトリを作成する
自分や root がアクセスできる場所にディレクトリを作成します。 ここが、パッケージをビルドするのに使われるファイル群を置く場所になります。どこでも好きな場所を使うことができます。とは言え、自分や root がアクセスできなければなりません。というのも、ビルド環境のセットアップを開始できるのは root だけだからです。しかし、常に root として作業したくはないでしょう。ですから、共有できる場所(訳注:一般ユーザである自分がアクセスできる場所)が必要なのです。
ステップ4 - プロジェクトのソースファイルを入手する
パッケージをビルドするのに必要なソースファイルを入手します。ほとんどのプロジェクトは圧縮された tarball でソースファイルを提供しています。
ステップ5 - spec ファイルを作成する
それでは、ソースが手に入ったので、通常の RPM 作成手順に従います。パッケージの spec ファイルを作成してください。SUSE 特有の情報は the spec file の 59494 章(訳注:何のことか不明)にあります。
ステップ6 - パッケージをビルドする
RPM の spec ファイルを作成したら、ビルドできるか確かめましょう。root ユーザになって、spec ファイルやソース、パッチのあるディレクトリに移動します。そうしたら、y2pmbuild を起動します。
ステップ7 - パッケージをテストする
ビルドが成功したら、y2pmbuild はビルドされたパッケージをそのパッケージのリポジトリに保存します。このリポジトリは、インストールに使うことのできる plain-cache YaST リポジトリです。また、y2pmbuild のリポジトリは、次のビルドのための第一リポジトリとして使うこともできます。このことは、これからビルドされるものが今回新しくビルドしたパッケージに依存する場合、この今回新しくビルドしたパッケージが常に使われるようにしてくれます。
Spec ファイル
RPM の spec ファイルは openSUSE の Package Conventions に従って書くようにしてください。これはそれ自体かなり複雑な話題なので、それに関する付属文書があります。 spec ファイルを作成する際には、この文書にきちんと従ってください。
y2pmbuild の機能
設定
y2pmbuild 環境変数
- BUILD_DIST
ビルドの対象としたいディストリビューションです。
BUILD_DIST=10.1-i386 y2pmbuild
y2pmbuild 設定ファイル
y2pmbuild の設定ファイルは
/etc/y2pmbuild
以下に保存されています。このディレクトリには、全ディストリビューション共通の設定ファイルである
/etc/y2pmbuild/dists_common
と、ディストリビューション特有の設定ファイルを入れておく
/etc/y2pmbuild/dists/DISTRONAME/
というディレクトリがあります。
y2pmbuild は初めに ディストリビューション共通の設定ファイルを読み込み、その後でディストリビューション特有の設定ファイルを読み込みます。
設定ファイルは、実際はシェルスクリプトで、y2pmbuild によってパースされます。 と言っても、シェルの特別な機能を使ったりはしないでください。これは、設定ファイルが他のプログラムからもパースできるようにしておくためです。コメントはファイル内のどこに書いても構いません(クォート内は別ですが)。コメントは # 文字で始まり、行末までです。空行、あるいは空白やコメントのみの行は無視されます。以下は、変数/値とその意味の一覧です。
build root のセットアップの仕方:
- url_*
RPM パッケージのソースとして、さまざまなタイプの URL を指定できます。指定できる URL は YaST によってサポートされたタイプのものです。FTP、HTTP、Samba/CIFS、NFS、CD、DVD、およびローカルのファイルシステムです。
url_opensuse="file:/space/dist/opensuse/10.0/" url_kde4="http://opensuse.org/projects/kde4/packages/" url_gcc5="ftp://ftp.gcc.gnu.org/pub/releases/gcc5/RPMS/"
- add_sources
build root をセットアップするために使うインストールソースは以下のように指定します:
add_sources="opensuse kde4 gcc5"
- buildrootbase
buildrootbase タグは実際のビルドディレクトリの場所を指定します。最終的な名前は $buildrootbase.$USER.$BUILD_DIST となります。
buildrootbase="/space/build"
パッケージ署名:
- rpm_sign_name
パッケージに署名するのに使いたい名前です。
rpm_sign_name="Tux Builder <tux@example.com>"
あるいは単に、
rpm_sign_name="tux@example.com"
- rpm_sign_key
署名するのに使う鍵ファイルです。
rpm_sign_key="/etc/y2pmbuild/signkey.asc"
鍵ファイルの作成は以下のようにします。
gpg -a --export tux@example.com > signkey.asc gpg -a --export-secret-key tux@example.com >> signkey.asc
ビルされた RPM ファイルの扱い方:
- repository
ビルドされた rpm ファイルを保存するディレクトリです。
repository="/space/done/$BUILD_DIST"
- regen_repository
ビルドされた RPM ファイルを(たとえば、次のビルドのために)インストール・ソースとして使うためには、RPM ファイルのあるディレクトリは YaST の理解できるインストール・ソースに変換されなければなりません。これには、genIS_PLAINcache (plain)、createrepo (yum) あるいは the create_package_descr (ul) ツールを利用することができます。もっとも、後者のサポートは現在使えませんが。
regen_repository="plain yum"
YaST のインストール・ソースについての詳細は Installation Sources を参照してください。
You can also give extra files y2pmbuild should copy into the build environment after its set up. Here you have a distribution specific directories. Note that rsync is used so you may want to think about when to append slashes to directory names.
/etc/y2pmbuild/files/DISTRONAME/
- extra_copy
パッケージのインストール後に buildroot にコピーされる extra ディレクトリです。
extra_copy="/etc/profile"
いくつかの例
以下は模範的なパッケージグループとパッケージ特有の特徴の実例です。 Here are some realworld examples for different exemplary package groups and specific package features.
KDE Packages
BuildRequires: kdelibs3-devel update-desktop-files
Name: kvpnc License: GPL Group: Productivity/Networking/System Summary: GUI frontend for openswan and vpnc Version: 0.7.2 Release: 1 URL: http://home.gna.org/kvpnc/ BuildRoot: %{_tmppath}/%{name}-%{version}-build Source0: %name-%{version}.tar.bz2
%description The application can create configurations for various kinds of VPN connections. You should install also the "vpnc" or "openswan" package.
%prep # extract the source and go into the kvpnc-0.7.2 directory %setup -q # source the standard build enviroment as defined in kdelibs3 package . /etc/opt/kde3/common_options # replace the admin/ folder with the version from kdelibs3 (will work for sure with # current autoconf and automake) and create Makefile.in and configure script. update_admin --no-unsermake
%build # source the standard build enviroment as defined in kdelibs3 package . /etc/opt/kde3/common_options ./configure $configkde --disable-final # do compile with the number of jobs given to the --jobs parameter of the build script. make %{?jobs:-j%jobs}
%install iconv -f iso8859-1 -t utf-8 src/kvpnc.desktop > w && mv w src/kvpnc.desktop # install all files into the BuildRoot make DESTDIR=$RPM_BUILD_ROOT install rm -rf $RPM_BUILD_ROOT/opt/kde3/share/doc/HTML/kvpnc # updates the .desktop file. It applys additional translations and Categories for a # proper position in the KDE menu %suse_update_desktop_file %name System Network # does find all localisation files and adds proper database attributes to them %find_lang %name
%clean # clean up the hard disc after build rm -rf $RPM_BUILD_ROOT
%files -f %name.lang %defattr(-,root,root) %dir /opt/kde3/share/icons/hicolor/16x16/apps %dir /opt/kde3/share/icons/hicolor/32x32/apps /opt/kde3/bin/kvpnc /opt/kde3/share/appl*/*/kvpnc.desktop /opt/kde3/share/apps/kvpnc /opt/kde3/share/icons/*/*/*/kvpnc*.png
Gnome Packages
# the following line is not a remark, but contains a macro for all # needed packages for a standard Gnome application: # neededforbuild gnome2-devel-packages
Name: gwget %define prefix /opt/gnome %define sysconfdir /etc%{prefix} License: GPL Group: Productivity/Networking/Web/Utilities Requires: wget Version: 0.95 Release: 1 Summary: Front-end for wget written in GTK+ URL: http://gnome.org/projects/gwget/ # the packages filesystem and gconf2 needs to be installed, before this # package gets installed. Otherwise the script in %post would fail. PreReq: filesystem gconf2 Source: %{name}-%{version}.tar.bz2 Source: %name.desktop BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description Front-end for wget written in GTK+
# extract source tar ball %prep %setup -n %{_name}-%{version}
%build # use global compile flags and run configure script CFLAGS="$RPM_OPT_FLAGS" \ ./configure \ --prefix=%prefix \ --libexecdir=%prefix/lib/gwget \ --libdir=%prefix/%_lib \ --sysconfdir=%sysconfdir \ --datadir=%prefix/share \ --localstatedir=/var/lib \ --mandir=%{_mandir} \ --disable-schemas-install # do compile make
%install # install all files make DESTDIR=$RPM_BUILD_ROOT install # create file list of localized files into file %name.lang %find_lang %{name} # install the gwget.desktop file from %Source1 and apply Catgories (Network and FileTransfer) %suse_update_desktop_file -i gwget Network FileTransfer
# the calls which does get called after installing this package %post # update the gconf database export GCONF_CONFIG_SOURCE=`opt/gnome/bin/gconftool-2 --get-default-source` opt/gnome/bin/gconftool-2 --makefile-install-rule etc/opt/gnome/gconf/schemas/gwget.schemas >/dev/null
%clean # clean up the hard disc after build rm -rf $RPM_BUILD_ROOT
%files -f %{name}.lang %defattr(-,root,root) # the files to package
Perl Packages
Perl のパッケージはとても簡単でパッケージに似ています(訳注:意味不明)。というのも、それらのパッケージはほとんど、CPAN アーカイブのためにすでに作成されているからです。 Perl packages are quite easy and similar to package because they are almost already prepared for the CPAN archive.
Name: perl-Curses Version: 1.12 Release: 1 # define the name from CPAN %define cpan_name Curses # do this package was known as "perl_cur" in old times. So we do need to Provide and Obsolete # this package. YaST will install this package during update instead of the old one in this way. Provides: %cpan_name # we better require the exact perl version, which was used to create this package Requires: perl = %{perl_version} Group: Development/Libraries/Perl License: Artistic License, Other License(s), see package URL: http://cpan.org/modules/by-module/Curses/ Summary: A Dynamic Loadable Curses Module for Perl5 Source: %cpan_name-%{version}.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description This is a dynamic loadable curses module for Perl5. This package can be found at any CPAN archive.
%prep %setup -q -n %cpan_name-%{version}
%build perl Makefile.PL OPTIMIZE="$RPM_OPT_FLAGS -Wall" make make test
%install make DESTDIR=$RPM_BUILD_ROOT install_vendor %perl_process_packlist
%clean # clean up the hard disc after build rm -rf $RPM_BUILD_ROOT
%files %defattr(-,root,root) %doc Artistic Copying README %doc %{_mandir}/man3/* %{perl_vendorarch}/%cpan_name.pm %{perl_vendorarch}/auto/%cpan_name /var/adm/perl-modules/%{name}
参考資料
- Package Conventions
- Maximum RPM - A book about the RPM Package Manager
- RPM HOWTO
- RPM Guide by Eric Foster-Johnson
- Package Conventions
- Maximum RPM - A book about the RPM Package Manager
- RPM HOWTO
- RPM Guide by Eric Foster-Johnson
- build HOWTO By Paul MacKay
- RPM install/uninstall script reference
- Presentation containing a good overview about make and autoconf by Stefan Hundhammer
- rpmbuild(8) man pages
- build(1) man pages