2011,11,28 kenta RPMパッケージ作成って意外と簡単 <description> <p> Project Vine は、2011/11/19, 20 の 2日間、明星大学 日野校で開催された <a href="http://www.ospn.jp/osc2011-fall/">オープンソースカンファレンス 2011 Tokyo/Fall</a>(以下 OSC 2011 Tokyo/Fall)に参加してきました。 今号の Vine Linux Magazine では、OSC のセミナーでは時間が足りなかった、「パッケージ作成って簡単ですよ」という話を紹介したいと思います。 </p> <h2>オープンソースカンファレンス 2011 Tokyo/Fallに行ってきました</h2> <p> Project Vineでは OSC 2010 Tokyo/Spring から OSCに出展しています。 今回の OSC 2011 Tokyo/Fall も munepiさん、Takemikaduchiさん、kudohさんと私 (kenta) の 4名で、展示出展とセミナーを開催してきました。 いやー、1日目はとっても寒かったですね。特に Project Vineのブースはドアの近くに割り当てられていたので、自動ドアが開くたびに凍えるようでした。 2日目は打って変わっての暖かいいい天気。お昼に開催した Project Vine 主催のセミナーも参加者の熱気に頼ることなく、暖かい和やかな会になりました。 </p> <p> 展示内容は主に 2つでした。 <ul> <li>Vine Linux 6のインストールメディア配布 <li>開発版 VineSeed と Gnome Shell UIのデモ </ul> 基本はブースの近くでたむろしており、その場に来て頂いた皆さんの質問や相談に答えていました。 </p> <p> Project Vine & Vine Linux Developer 有志主催のセミナー「第7回 Vine Linuxユーザーの集い」では、Vine Linux 7ではどんなデスクトップが標準だといいかを見てもらうため、開発版 VineSeed での Gnome-3.2.1 (Gnome Shell), Gnome 3.2.1, KDE 4.7.2, LXDE, Xfce デスクトップ環境をそれぞれ紹介しました。 また、ユーザー事例紹介として 2件の発表がありました。 <ul> <li>透明感のあるデスクトップでWineを楽しむ (Takemikaduchiさん) <li>Vineの上で TeX Loveを叫ぶ (munepiさん) </ul> セミナーに参加下さった <a href=http://www.enterpriseoss.jp/>EnterpriseOSS</a> の方にはユーザー事例紹介を聞いて Vine が何であるかを大いに誤解されてしまったかもしれません。。。 Vineはスケスケを楽しんだりもしますが、国内の老舗ディストリビュータとしての基本を常に忘れず、これからも変わることなくユーザーに優しい Linuxディストリビューションを作り続けます。 </p> <p> <img src="images/20111128-1.jpg" alt="Takemikaduchiさんの透明感あふれるデスクトップ" width="400" height="300" Hspace="20" Vspace="10"> <img src="images/20111128-3.jpg" alt="TakemikaduchiさんによるWineのデモンストレーション" width="400" height="300" Hspace="20" Vspace="10"> </p> <h2>RPMパッケージ作成 はじめの一歩</h2> <h3>RPMパッケージ作成に挑戦してみませんか?</h3> <p> OSCでは時間がなくて紹介できなかったのですが、もう1つ「Vine Linuxの開発もしてみませんか?」という話題を用意していました。 ユーザーの多くの方は、ソースコードの tar.gz をダウンロードしてきて <pre class="screen"> $ tar xfvz hoge.tar.gz $ cd hoge $ ./configure $ make $ make install </pre> と、何かしら自分が使うアプリケーションをビルドして追加したことがあるかと思います。 今回のユーザーの集いで参加されたユーザーの皆様に訊いたところ全員に経験が有りました。 </p> <p> 単に <Tt>make install</Tt> でインストールすると、アンインストールが困難だったり、重複したファイルが意図せずに上書きされてしまったりします。 自分だけしか使わないアプリケーションでも、とりあえず RPMパッケージを作ってパッケージ管理できる便利なことはとても多いのです。 だけど、RPMパッケージ作るのは大変でそんな簡単にはできない、、、って思われる方も多いですよね。<br> 本当でしょうか?<br> ご自身でソースからビルドした経験があれば、RPMパッケージを作るのは案外簡単なんです。 今回はまず、<b>最低限の手間で</b>RPMパッケージを作る手順をご紹介します。 例としてたまたま見かけたブログ <a href="http://huchiura.blogspot.com/2011/11/netcdf-413-gmt-457-install-on-vine.html">Linux life</a> で紹介されていた、NetCDF 4.1.3のパッケージを作ってみます。 </p> <h3>はじめに</h3> <p> 使用したのは Vine Linux 6 (x86_64) を、標準のデスクトップ設定でインストールした環境です。 </p> <p> RPMパッケージ作成には <Tt>rpmbuild</Tt> コマンドを使用します。そのために、まず <Tt>rpm-build</Tt> パッケージをインストールしておきます。 <pre class="screen"> $ sudo apt-get install rpm-build パッケージリストを読みこんでいます... 完了 依存情報ツリーを作成しています... 完了 以下の追加パッケージがインストールされます: elfutils elfutils-libs patch 以下のパッケージが新たにインストールされます: elfutils elfutils-libs patch rpm-build アップグレード: 0 個, 新規インストール: 4 個, 削除: 0 個, 保留: 0 個 938kB のアーカイブを取得する必要があります。 展開後に 2405kB のディスク容量が追加消費されます。 続行しますか? [Y/n]Y 取得:1 http://updates.vinelinux.org 6/x86_64/main elfutils-libs 0.152-2vl6 [238kB] 取得:2 http://updates.vinelinux.org 6/x86_64/main elfutils 0.152-2vl6 [516kB] 取得:3 http://updates.vinelinux.org 6/x86_64/main patch 2.6.1-2vl6 [87.6kB] 取得:4 http://updates.vinelinux.org 6/x86_64/main rpm-build 4.8.1-3vl6 [97.3kB] 938kB を 0s 秒で取得しました (2070kB/s) 変更を適用しています... 準備中 ############################## [100%] 更新/インストール中 patch-2.6.1-2vl6.x86_64 ############################## [100%] elfutils-libs-0.152-2vl6.x86_64 ############################## [100%] elfutils-0.152-2vl6.x86_64 ############################## [100%] rpm-build-4.8.1-3vl6.x86_64 ############################## [100%] 完了 </pre> </p> <p> 自分で <Tt>./configure && make && make install</Tt> されている環境ならばきっとビルド環境は一通り揃っていると思います。 もし開発環境をインストールしていない場合には最低限の一式として <Tt>build-essential</Tt> をインストールして下さい。 <pre class="screen"> $ sudo apt-get install build-essential パッケージリストを読みこんでいます... 完了 依存情報ツリーを作成しています... 完了 以下の追加パッケージがインストールされます: autoconf automake gcc-c++ gettext gettext-devel gettext-libs intltool libsigsegv libstdc++-devel libtool m4 make perl-HTML-Parser perl-HTML-Tagset perl-URI perl-XML-Parser perl-libwww-perl 以下のパッケージが新たにインストールされます: autoconf automake build-essential gcc-c++ gettext gettext-devel gettext-libs intltool libsigsegv libstdc++-devel libtool m4 make perl-HTML-Parser perl-HTML-Tagset perl-URI perl-XML-Parser perl-libwww-perl アップグレード: 0 個, 新規インストール: 18 個, 削除: 0 個, 保留: 0 個 17.5MB のアーカイブを取得する必要があります。 展開後に 45.1MB のディスク容量が追加消費されます。 続行しますか? [Y/n]Y (中略) perl-HTML-Parser-3.68-2vl6.x86_64 ############################## [100%] perl-libwww-perl-5.833-3vl6.noarch ############################## [100%] perl-XML-Parser-2.40-1vl6.x86_64 ############################## [100%] intltool-0.41.1-2vl6.noarch ############################## [100%] build-essential-1.6-1vl6.noarch ############################## [100%] 完了 </pre> </p> <h3>vine-rpm-helper を使ったRPMパッケージ作成</h3> <p> RPMパッケージを作るには <a href="http://ml.vinelinux.org/vine-users/msg31524.html">yasumichiさんが最近公開された <Tt>vine-rpm-helper</Tt></a> に含まれている <Tt>mkrpmspec</Tt> を使うのが簡単です。 <Tt>mkrpmspec</Tt> コマンドは、引数に指定したソースコードをダウンロードして <Tt>~/rpm/SOURCES/«パッケージ名»</Tt> 以下に配置し、specファイルのひな形を <Tt>~rpm/SPECS/«パッケージ名»</Tt> 以下に作ってくれます。 <pre class="screen"> $ sudo apt-get install vine-rpm-helper $ mkrpmspec http://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-4.1.3.tar.gz --2011-11-24 22:16:53-- http://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-4.1.3.tar.gz www.unidata.ucar.edu をDNSに問いあわせています... 128.117.149.64 www.unidata.ucar.edu|128.117.149.64|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 11097157 (11M) [application/x-gzip] `/home/vine/rpm/SOURCES/netcdf/netcdf-4.1.3.tar.gz' に保存中 100%[==========================================================================>] 11,097,157 3.04M/s 時間 4.2s 2011-11-24 22:16:58 (2.51 MB/s) - `/home/vine/rpm/SOURCES/netcdf/netcdf-4.1.3.tar.gz' へ保存完了 [11097157/11097157] パッケージを /home/vine/rpm/BUILD/netcdf-4.1.3 に展開しました。 パッケージ形式は、autotoolize であると認識しました。 ドキュメントを発見: README mkdir: ディレクトリ `/home/vine/rpm/SPECS/netcdf' を作成しました /home/vine/rpm/SPECS/netcdf/netcdf-vl.spec を作成しました </pre> </p> <h3>RPMパッケージのビルド</h3> <p> では早速 <Tt>mkrpmspec</Tt> で作られた specファイルを使ってビルドしてみましょう。 <pre class="screen"> $ cd ~/rpm/SPECS/ $ rpm -ba netcdf/netcdf-vl.spec 実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.Zv9qlh + umask 022 + cd /home/vine/rpm/BUILD + cd /home/vine/rpm/BUILD + rm -rf netcdf-4.1.3 + /bin/tar -xf - + /bin/gzip -dc /home/vine/rpm/SOURCES/netcdf/netcdf-4.1.3.tar.gz + STATUS=0 + '[' 0 -ne 0 ']' + cd netcdf-4.1.3 + /bin/chmod -Rf a+rX,u+w,g-w,o-w . + exit 0 実行中(%build): /bin/sh -e /var/tmp/rpm-tmp.YV3T4f + umask 022 + cd /home/vine/rpm/BUILD + cd netcdf-4.1.3 + CFLAGS='-O2 -m64 -mtune=generic -fno-strict-aliasing -fno-schedule-insns2' + export CFLAGS + CXXFLAGS='-O2 -m64 -mtune=generic -fno-strict-aliasing -fno-schedule-insns2' + export CXXFLAGS + FFLAGS='-O2 -m64 -mtune=generic -fno-strict-aliasing -fno-schedule-insns2' + export FFLAGS + ./configure --host=x86_64-unknown-linux-gnu --build=x86_64-unknown-linux-gnu --program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/usr/share --mandir=/usr/share/man --infodir=/usr/share/info configure: netCDF 4.1.3 checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes (中略) checking whether byte ordering is bigendian... no checking size of short... 2 checking size of int... 4 checking size of long... 8 checking size of float... 4 checking size of double... 8 checking size of off_t... 8 checking size of size_t... 8 checking for library containing deflate... no configure: error: Can't find or link to the z library. Turn off netCDF-4 and opendap with --disable-netcdf-4 --disable-dap, or see config.log for errors. エラー: /var/tmp/rpm-tmp.YV3T4f の不正な終了ステータス (%build) </pre> エラーになってしまいました。 最後のメッセージを見ると、どうも <Tt>zlib-devel</Tt> が足りないようですね。 この対処法は 2通りありますが、今回のコンセプト最小限の手間で簡単に対処しましょう。 </p> <p> エラーメッセージには、<Tt>--disable-netcdf-4</Tt> を使うようにとも書かれていますよね。 そういえば、先の<a href="http://huchiura.blogspot.com/2011/11/netcdf-413-gmt-457-install-on-vine.html">ブログ</a>に載っていた手順 <pre class="screen"> $ cd /tmp $ wget http://www.gfd-dennou.org/library/netcdf/unidata-mirror/netcdf-4.1.3.tar.gz $ gtar xfvz ~/tmp/netcdf-4.1.3.tar.gz $ cd netcdf-4.1.3 $ ./configure --prefix=/usr/local/netcdf --disable-netcdf-4 $ make check $ su - # make install </pre> でも <Tt>./configure</Tt> の際に <Tt>--disable-netcdf-4</Tt> オプションがついていました。 ここは真似して <Tt>--disable-netcdf-4</Tt> オプションをつけましょう。 </p> <p> 先ほど自動生成された specファイルをコピーして編集します。 <pre class="screen"> $ cp -a netcdf/netcdf-vl.spec . $ vim netcdf-vl.spec </pre> 書き換えた行は次の通りです。 <pre class="screen diffUnifiedStyle"> $ diff -u netcdf/netcdf-vl.spec netcdf-vl.spec --- netcdf/netcdf-vl.spec 2011-11-24 22:17:01.708999998 +0900 +++ netcdf-vl.spec 2011-11-24 22:25:35.253996625 +0900 @@ -30,7 +30,7 @@ %setup -q %build -%configure +%configure --disable-netcdf-4 %{__make} %{?_smp_mflags} %install </pre> </p> <p> もう一度ビルドしてみましょう。 <pre class="screen"> $ rpm -ba netcdf-vl.spec (中略) make[3]: Leaving directory `/home/vine/rpm/BUILD/netcdf-4.1.3' make[2]: Leaving directory `/home/vine/rpm/BUILD/netcdf-4.1.3' make[1]: Leaving directory `/home/vine/rpm/BUILD/netcdf-4.1.3' + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-strip + /usr/lib/rpm/brp-strip-static-archive + /usr/lib/rpm/brp-strip-comment-note Processing files: netcdf-4.1.3-1vl6.x86_64 実行中(%doc): /bin/sh -e /var/tmp/rpm-tmp.Wetkf1 + umask 022 + cd /home/vine/rpm/BUILD + cd netcdf-4.1.3 + DOCDIR=/home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3 + export DOCDIR + rm -rf /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3 + /bin/mkdir -p /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3 + cp -pr README /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3 + exit 0 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 伸張ファイルの検査中: /usr/lib/rpm/check-files /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64 警告: インストール済み(ただし未伸張)ファイルが見つかりました: /usr/bin/nc-config /usr/bin/nccopy /usr/bin/ncdump /usr/bin/ncgen /usr/bin/ncgen3 /usr/include/ncvalues.h /usr/include/netcdf.h /usr/include/netcdf.hh /usr/include/netcdfcpp.h /usr/lib64/libnetcdf.a /usr/lib64/libnetcdf.la /usr/lib64/libnetcdf.so /usr/lib64/libnetcdf.so.7 /usr/lib64/libnetcdf.so.7.1.1 /usr/lib64/libnetcdf_c++.a /usr/lib64/libnetcdf_c++.la /usr/lib64/libnetcdf_c++.so /usr/lib64/libnetcdf_c++.so.4 /usr/lib64/libnetcdf_c++.so.4.1.0 /usr/lib64/pkgconfig/netcdf.pc /usr/share/info/dir /usr/share/info/netcdf-c.info-1.gz /usr/share/info/netcdf-c.info-2.gz /usr/share/info/netcdf-c.info.gz /usr/share/info/netcdf-cxx.info.gz /usr/share/info/netcdf-f77.info-1.gz /usr/share/info/netcdf-f77.info-2.gz /usr/share/info/netcdf-f77.info.gz /usr/share/info/netcdf-f90.info.gz /usr/share/info/netcdf-install.info.gz /usr/share/info/netcdf-tutorial.info.gz /usr/share/info/netcdf.info.gz /usr/share/man/man1/nccopy.1.gz /usr/share/man/man1/ncdump.1.gz /usr/share/man/man1/ncgen.1.gz /usr/share/man/man1/ncgen3.1.gz /usr/share/man/man3/netcdf.3.gz 書き込み完了: /home/vine/rpm/SRPMS/netcdf-4.1.3-1vl6.src.rpm 書き込み完了: /home/vine/rpm/RPMS/x86_64/netcdf-4.1.3-1vl6.x86_64.rpm 実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.NGMuhd + umask 022 + cd /home/vine/rpm/BUILD + cd netcdf-4.1.3 + /bin/rm -rf /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64 + exit 0 </pre> 今度はビルドできたみたいです。 でも、"警告: インストール済み(ただし未伸張)ファイルが見つかりました:" と警告が出てますね。 </p> <p> できた rpm を見てみましょう。 <pre class="screen"> $ rpm -qlp /home/vine/rpm/RPMS/x86_64/netcdf-4.1.3-1vl6.x86_64.rpm /usr/share/doc/netcdf-4.1.3 /usr/share/doc/netcdf-4.1.3/README </pre> README ファイルしか入ってませんね。。。 </p> <h3><Tt>%files</Tt> セクションの編集</h3> <p> これを修正するには、specファイルの <Tt%files</Tt> セクションを変更します。 とりあえず、<a href="http://trac.vinelinux.org/wiki/SpecTemplates/PlainPackage">SPEC Template</a> に倣って、<Tt>%files</Tt> セクションを埋めてみましょう。 <pre class="screen"> $ cp -a netcdf-vl.spec netcdf-vl.spec.old $ vim netcdf-vl.spec $ diff -u netcdf-vl.spec.old netcdf-vl.spec --- netcdf-vl.spec.orig 2011-11-24 22:17:01.708999998 +0900 +++ netcdf-vl.spec 2011-11-24 23:51:14.222999998 +0900 @@ -45,6 +45,11 @@ %files %defattr(-,root,root) %doc README +%{_bindir}/* +%{_libdir}/* +%{_datadir}/* +%{_mandir}/man?/* +%{_sysconfdir}/* %changelog * Thu Nov 24 2011 Your Name <name@yours.example.com> 4.1.3-1 </pre> </p> <p> もう一度ビルドすると時間が掛かるので、今度はコンパイルをスキップして試してみましょう。 <pre class="screen"> $ rpm -bi --short-circuit netcdf-vl.spec (中略) + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-strip + /usr/lib/rpm/brp-strip-static-archive + /usr/lib/rpm/brp-strip-comment-note Processing files: netcdf-4.1.3-1vl6.x86_64 エラー: ファイルが見つかりません (by glob): /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/etc/* 実行中(%doc): /bin/sh -e /var/tmp/rpm-tmp.c6xhcf + umask 022 + cd /home/vine/rpm/BUILD + cd netcdf-4.1.3 + DOCDIR=/home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3 + export DOCDIR + rm -rf /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3 + /bin/mkdir -p /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3 + cp -pr README /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3 + exit 0 RPM ビルドエラー: ファイルが見つかりません (by glob): /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/etc/* </pre> </p> <p> <Tt>/etc</Tt> は不要だったようですね。<Tt>%{_sysconfdir}</Tt> を外しましょう。 <pre class="screen"> $ cp -a netcdf-vl.spec netcdf-vl.spec.old $ vim netcdf-vl.spec $ diff -u netcdf-vl.spec.old netcdf-vl.spec --- netcdf-vl.spec.old 2011-11-24 23:51:14.222999998 +0900 +++ netcdf-vl.spec 2011-11-24 23:56:07.656999868 +0900 @@ -49,7 +49,6 @@ %{_libdir}/* %{_datadir}/* %{_mandir}/man?/* -%{_sysconfdir}/* %changelog * Thu Nov 24 2011 Your Name <name@yours.example.com> 4.1.3-1 </pre> </p> <p> もう一度試してみましょう。 <pre class="screen"> $ rpm -bl --short-circuit netcdf-vl.spec Processing files: netcdf-4.1.3-1vl6.x86_64 警告: ファイルが2回表記されています: /usr/share/doc/netcdf-4.1.3 警告: ファイルが2回表記されています: /usr/share/doc/netcdf-4.1.3/README 警告: ファイルが2回表記されています: /usr/share/man/man1/nccopy.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncdump.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncgen.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncgen3.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man3/netcdf.3.gz Provides: libnetcdf.so.7()(64bit) libnetcdf_c++.so.4()(64bit) pkgconfig(netcdf) = 4.1.3 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(VersionedDependencies) <= 3.0.3-1 Requires: /bin/sh /usr/bin/pkg-config libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.7)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libnetcdf.so.7()(64bit) libnetcdf_c++.so.4()(64bit) libstdc++.so.6()(64bit) libstdc++.so.6(CXXABI_1.3)(64bit) libstdc++.so.6(GLIBCXX_3.4)(64bit) libstdc++.so.6(GLIBCXX_3.4.9)(64bit) 伸張ファイルの検査中: /usr/lib/rpm/check-files /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64 警告: インストール済み(ただし未伸張)ファイルが見つかりました: /usr/include/ncvalues.h /usr/include/netcdf.h /usr/include/netcdf.hh /usr/include/netcdfcpp.h $ rpm -bl --short-circuit netcdf-vl.spec Processing files: netcdf-4.1.3-1vl6.x86_64 警告: ファイルが2回表記されています: /usr/share/doc/netcdf-4.1.3 警告: ファイルが2回表記されています: /usr/share/doc/netcdf-4.1.3/README 警告: ファイルが2回表記されています: /usr/share/man/man1/nccopy.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncdump.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncgen.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncgen3.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man3/netcdf.3.gz Provides: libnetcdf.so.7()(64bit) libnetcdf_c++.so.4()(64bit) pkgconfig(netcdf) = 4.1.3 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(VersionedDependencies) <= 3.0.3-1 Requires: /bin/sh /usr/bin/pkg-config libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.7)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libnetcdf.so.7()(64bit) libnetcdf_c++.so.4()(64bit) libstdc++.so.6()(64bit) libstdc++.so.6(CXXABI_1.3)(64bit) libstdc++.so.6(GLIBCXX_3.4)(64bit) libstdc++.so.6(GLIBCXX_3.4.9)(64bit) 伸張ファイルの検査中: /usr/lib/rpm/check-files /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64 警告: インストール済み(ただし未伸張)ファイルが見つかりました: /usr/include/ncvalues.h /usr/include/netcdf.h /usr/include/netcdf.hh /usr/include/netcdfcpp.h </pre> </p> <p> ヘッダーファイルが入っていなかったので、include ディレクトリを追加して、 <pre class="screen"> $ cp -a netcdf-vl.spec netcdf-vl.spec.old $ vim netcdf-vl.spec $ diff -u netcdf-vl.spec.old netcdf-vl.spec --- netcdf-vl.spec.old 2011-11-24 23:56:07.656999868 +0900 +++ netcdf-vl.spec 2011-11-25 00:02:37.313000003 +0900 @@ -47,6 +47,7 @@ %doc README %{_bindir}/* %{_libdir}/* +%{_includedir}/* %{_datadir}/* %{_mandir}/man?/* </pre> </p> <p> もう一度やってみます。 <pre class="screen"> $ rpm -bl --short-circuit netcdf-vl.spec Processing files: netcdf-4.1.3-1vl6.x86_64 警告: ファイルが2回表記されています: /usr/share/doc/netcdf-4.1.3 警告: ファイルが2回表記されています: /usr/share/doc/netcdf-4.1.3/README 警告: ファイルが2回表記されています: /usr/share/man/man1/nccopy.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncdump.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncgen.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncgen3.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man3/netcdf.3.gz Provides: libnetcdf.so.7()(64bit) libnetcdf_c++.so.4()(64bit) pkgconfig(netcdf) = 4.1.3 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(VersionedDependencies) <= 3.0.3-1 Requires: /bin/sh /usr/bin/pkg-config libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.7)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libnetcdf.so.7()(64bit) libnetcdf_c++.so.4()(64bit) libstdc++.so.6()(64bit) libstdc++.so.6(CXXABI_1.3)(64bit) libstdc++.so.6(GLIBCXX_3.4)(64bit) libstdc++.so.6(GLIBCXX_3.4.9)(64bit) 伸張ファイルの検査中: /usr/lib/rpm/check-files /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64 </pre> 今度は良さそうですね。 </p> <p> 警告はまた後で調べることにして、これでパッケージを作ってインストールしてみましょう。 <pre class="screen"> $ rpm -bb --short-circuit netcdf-vl.spec (中略) + cp -pr README /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3 + exit 0 警告: ファイルが2回表記されています: /usr/share/man/man1/nccopy.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncdump.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncgen.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man1/ncgen3.1.gz 警告: ファイルが2回表記されています: /usr/share/man/man3/netcdf.3.gz Provides: libnetcdf.so.7()(64bit) libnetcdf_c++.so.4()(64bit) pkgconfig(netcdf) = 4.1.3 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(VersionedDependencies) <= 3.0.3-1 Requires: /bin/sh /usr/bin/pkg-config libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.7)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libnetcdf.so.7()(64bit) libnetcdf_c++.so.4()(64bit) libstdc++.so.6()(64bit) libstdc++.so.6(CXXABI_1.3)(64bit) libstdc++.so.6(GLIBCXX_3.4)(64bit) libstdc++.so.6(GLIBCXX_3.4.9)(64bit) 伸張ファイルの検査中: /usr/lib/rpm/check-files /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64 書き込み完了: /home/vine/rpm/RPMS/x86_64/netcdf-4.1.3-1vl6.x86_64.rpm 実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.62PB3T + umask 022 + cd /home/vine/rpm/BUILD + cd netcdf-4.1.3 + /bin/rm -rf /home/vine/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64 + exit 0 </pre> </p> <p> では、早速インストールしてみます。 <pre class="screen"> $ sudo rpm -Uhv /home/vine/rpm/RPMS/x86_64/netcdf-4.1.3-1vl6.x86_64.rpm [sudo] password for vine: 準備中... ########################################### [100%] ファイル /usr/share/info/dir (パッケージ netcdf-4.1.3-1vl6.x86_64 から) は、パッケージ install-info-4.13a-1vl6.x86_64 からのファイルと競合しています。 $ rpm -qf /usr/share/info/dir install-info-4.13a-1vl6.x86_64 </pre> ふーむ、netcdfパッケージに入っている /usr/share/info/dir が install-info とぶつかっているようです。 </p> <p> とりあえずやっつけですが /usr/share/info/dir を外してしまいましょう。その上でバイナリパッケージ作成のところだけ再実行してインストールしてみます。 <pre class="screen"> $ cp -a netcdf-vl.spec netcdf-vl.spec.old $ vim netcdf-vl.spec $ diff -u netcdf-vl.spec.old netcdf-vl.spec --- netcdf-vl.spec.old 2011-11-25 00:22:45.191000089 +0900 +++ netcdf-vl.spec 2011-11-25 00:21:34.061999867 +0900 @@ -49,6 +49,7 @@ %{_libdir}/* %{_includedir}/* %{_datadir}/* +%exclude %{_infodir}/dir %{_mandir}/man?/* %changelog $ rpm -bb --short-circuit netcdf-vl.spec $ sudo rpm -Uhv /home/vine/rpm/RPMS/x86_64/netcdf-4.1.3-1vl6.x86_64.rpm 準備中... ########################################### [100%] 1:netcdf ########################################### [100%] </pre> 今度はうまくいきました。 </p> <p> 警告が出ていたり、やっつけの修正もありますが、mkrpmspec を使うと、たった 7行の書き換えだけで RPMパッケージを作ることができました。 <pre class="screen diffUnifiedStyle"> $ diff -u netcdf/netcdf-vl.spec netcdf-vl.spec --- netcdf/netcdf-vl.spec 2011-11-24 22:17:01.708999998 +0900 +++ netcdf-vl.spec 2011-11-25 00:21:34.061999867 +0900 @@ -30,7 +30,7 @@ %setup -q %build -%configure +%configure --disable-netcdf-4 %{__make} %{?_smp_mflags} %install @@ -45,6 +45,12 @@ %files %defattr(-,root,root) %doc README +%{_bindir}/* +%{_libdir}/* +%{_includedir}/* +%{_datadir}/* +%exclude %{_infodir}/dir +%{_mandir}/man?/* %changelog * Thu Nov 24 2011 Your Name <name@yours.example.com> 4.1.3-1 </pre> </p> <p> make install と較べてもほとんど手間無く、パッケージ管理されたきれいな環境が作れると思います。 やっていくと細かくいじるところがいくつも出てきますが、それは問題に出会ったときに少しずつ覚えていくことになります。試してみて困ったことがありましたら MLなどで質問して下さい。 なお、最終的に作った SPECファイルを<a href="./20111128/netcdf-vl.spec">こちら</a>に置いています。何が書き換わっているかを比較しながら、<a href="http://vinelinux.org/docs/vine5/manuals/make-spec.html">Develppers Guide</a>と見較べてみてください。 </p> <h3>参考資料</h3> <ul> <li><a href="http://vinelinux.org/docs/vine5/manuals/make-spec.html">Vine Linux開発者ガイド: 第5章 SPECファイルの記述</a> <li><a href="http://trac.vinelinux.org/wiki/Packages/vine-rpm-helper">Packages/vine-rpm-helper -- VineSeed</a> <li><a href="http://trac.vinelinux.org/wiki/SpecTemplates/PlainPackage">spec ファイルのテンプレート - サブパッケージがない単純なパッケージ</a> <li><a href="http://huchiura.blogspot.com/2011/11/netcdf-413-gmt-457-install-on-vine.html">Linux life: NetCDF 4.1.3, GMT 4.5.7 install on Vine Linux 6</a> </ul> <h2>おわりに</h2> <p> Project Vineではこれまでにも munepiさんが中心となって RPMパッケージ作成ハンズオンを実施してきました。 <ul> <li><a href="http://trac.vinelinux.org/wiki/OfflineMeeting/20100529">第 2 回 Vine Linux ユーザの集い - RPM パッケージ作成ハンズオン</a> <!-- <li>第 ?? 回 Vine Linux ユーザの集い - RPM パッケージ作成ハンズオン --> <li><a href="http://trac.vinelinux.org/wiki/OfflineMeeting/20110717">第 6 回 Vine Linux ユーザの集い with LILO - RPM パッケージ作成ハンズオン - in 大阪</a> </ul> ここでは最小限の手間でRPMパッケージ作成を体験できる方法を紹介しました。 普段は面倒で <Tt>make install</Tt> されているときに、ちょっとだけ頑張って vine-rpm-helper を使ったRPMパッケージ作成に挑戦してみてください。 手間を掛けた以上に快適な管理ができること間違いありません。 </p> <p> なお、環境によっては今回紹介した結果と同じようにならないこともあるかもしれません。 その場合には是非 ML等で質問して下さい。 いろんな疑問やコメントが頂けましたら、続編として様々な問題に対処するより実践的なパッケージ作成を紹介するつもりです。 </p> <p> Vine Linux Magazine では、Vine Linux に関する様々な情報、小ネタ、Tips、ノウハウ(バッドノウハウ含む)、活用事例などを書いていただける方を募集しています。また、「XXの記事を書いて欲しい」などのご要望なども随時お待ちしておりますので、<a href="http://vinelinux.org/ml.html">ML</a> や Twitter のハッシュタグ <a href="http://twitter.com/#search?q=%23VineLinux">#VineLinux</a>、IRC、個別メールなどでお知らせください。 </p>