wiki:Developers/kenta

Version 11 (modified by kenta, 10 years ago) (diff)

--

Todo

  • vlmag (due 2011/11/28)
  • VMWare Image
  • ToolChain?
    • binutils-2.21.53.0.2-1vl7
  • gcc-4.6.2
    • glibc-??
  • KVM ?

vlmag 下書きメモ

OSC 2011 Tokyo/Fall? に行ってきました

2011/11/19, 20 の 2日間、OSC 2011 Tokyo/Fall? に参加してきました。 展示内容は 2つでした。

  • Vine Linux 6のインストールメディア配布
  • 開発版 Vine Seed と Gnome Shell UIのデモ あとは、ブースの近くにいた munepiさん、Takemikaduchiさん、kudohさんと私 (kenta) の 4名で、その場で質問や相談に答えていました。

いやー、一日目はとっても寒かったですね。Project Vineのブースはドアの近くで、自動ドアが開くたびに凍えるようでした。 2日目は打って変わっての暖かいいい天気。ユーザーの集いも参加者の熱気に頼ることなく、暖かい和やかな会になりました。

<写真貼っとく?>

EnterpriseOSS の方には Vine が何であるかを大いに誤解されてしまったかもしれません。 Vineはスケスケを楽しんだりもしますが、国内の老舗ディストリビュータとしての基本は常に忘れず、これからも変わることなくユーザーに優しいLinuxディストリビューションを作り続けます。

RPMパッケージを作ってみよう

さて本題ですが、今回はrpmパッケージの作り方、はじめの一歩を紹介します。 これまでにも munepiさんが中心となって rpm開発講座を開催してきました。

  • 第 1 回 Vine Linux ユーザの集い - RPM パッケージ作成ハンズオン
  • 第 2 回 Vine Linux ユーザの集い - RPM パッケージ作成ハンズオン
  • 第 3 回 Vine Linux ユーザの集い - RPM パッケージ作成ハンズオン in 大阪

tar.gz をダウンロード、./configure && make && make install で何かしら自分が使うアプリケーションを追加したことがあるかと思います。 さて、今回もOSCで開催したユーザーの集いで参加者に挙手の形でアンケートを採ったところ、全員が経験有りでした。

単に make install すると、アンインストールが困難だったり、重複したファイルが意図せずに上書きされてしまったりします。 Prefixを間違えて意図しないディレクトリを書き換えてしまった時にはもう後には戻れなくなってしまいます。

ここでは、まず最低限の手間でパッケージを作る手順を紹介します。 例として hogehoge のサイトで紹介されていた、GXXをビルドしてみます。

Let's Try

はじめに

使用したのは Vine Linux 6 (x86_64)、標準のデスクトップ設定でインストールした環境です。

vine-rpm-helper

使い方は Trac http://trac.vinelinux.org/wiki/Packages/vine-rpm-helper を参照。

$ 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%]
完了

自分で ./configure && make && make install されている環境ならきっとビルド環境は揃っていると思いますが、もしインストールしていない場合は最低限の一式として build-essential をインストールして下さい。

$ 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%]
完了
$ 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/kenta/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/kenta/rpm/SOURCES/netcdf/netcdf-4.1.3.tar.gz' へ保存完了 [11097157/11097157]

パッケージを /home/kenta/rpm/BUILD/netcdf-4.1.3 に展開しました。
パッケージ形式は、autotoolize であると認識しました。
ドキュメントを発見: README
mkdir: ディレクトリ `/home/kenta/rpm/SPECS/netcdf' を作成しました
/home/kenta/rpm/SPECS/netcdf/netcdf-vl.spec  を作成しました

ソースをダウンロードして ~/rpm/SOURCES/netcdf/netcdf-4.1.3.tar.gz に配置し、specファイルのひな形を rpm/SPECS/netcdf/netcdf-vl.spec に作ってくれます。

では、ビルドしてみましょう。

$ cd ~/rpm/SPECS/
$ rpm -ba netcdf/netcdf-vl.spec 
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.Zv9qlh
+ umask 022
+ cd /home/kenta/rpm/BUILD
+ cd /home/kenta/rpm/BUILD
+ rm -rf netcdf-4.1.3
+ /bin/tar -xf -
+ /bin/gzip -dc /home/kenta/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/kenta/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)

どうも zlib-devel が足りないようにみえますね。 ここからは道が2つに分かれます。

まずはブログの記事にならって、--disable-netcdf-4 オプションをつけてみましょう。 specファイルをコピーして書き換え、再度ビルドしてみます。

$ cp -a netcdf/netcdf-vl.spec .
$ vim netcdf-vl.spec 
$ 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
$ rpm -ba netcdf-vl.spec

(中略)

make[3]: Leaving directory `/home/kenta/rpm/BUILD/netcdf-4.1.3'
make[2]: Leaving directory `/home/kenta/rpm/BUILD/netcdf-4.1.3'
make[1]: Leaving directory `/home/kenta/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/kenta/rpm/BUILD
+ cd netcdf-4.1.3
+ DOCDIR=/home/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3
+ export DOCDIR
+ rm -rf /home/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3
+ /bin/mkdir -p /home/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3
+ cp -pr README /home/kenta/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/kenta/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/kenta/rpm/SRPMS/netcdf-4.1.3-1vl6.src.rpm
書き込み完了: /home/kenta/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/kenta/rpm/BUILD
+ cd netcdf-4.1.3
+ /bin/rm -rf /home/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64
+ exit 0

こんどはビルドできたみたいです。 でも、"警告: インストール済み(ただし未伸張)ファイルが見つかりました:" と警告が出てますね。 できた rpm を見てみましょう。

$ rpm -qlp /home/kenta/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

READMEファイルしか入ってませんね。。。

これを修正するには %files セクションを変更します。

とりあえず、SPEC Template (http://trac.vinelinux.org/wiki/SpecTemplates/PlainPackage) に倣って、%files セクションを埋めてみます。

$ 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

もう一度ビルドすると時間が掛かるので、コンパイルをスキップして試してみましょう。

$ 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/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/etc/*
実行中(%doc): /bin/sh -e /var/tmp/rpm-tmp.c6xhcf
+ umask 022
+ cd /home/kenta/rpm/BUILD
+ cd netcdf-4.1.3
+ DOCDIR=/home/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3
+ export DOCDIR
+ rm -rf /home/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3
+ /bin/mkdir -p /home/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3
+ cp -pr README /home/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/usr/share/doc/netcdf-4.1.3
+ exit 0


RPM ビルドエラー:
    ファイルが見つかりません (by glob): /home/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64/etc/*

/etc は不要だったので、%{_sysconfdir} を外しましょう。

$ 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

もう一度試してみましょう。

$ 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/kenta/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/kenta/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

ヘッダーファイルが入っていなかったので、

$ 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?/*
 

もう一度やってみます。

$ 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/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64

今度は良さそうですね。警告はまた後で調べることにして、これでパッケージを作ってインストールしてみましょう。

$ rpm -bb --short-circuit netcdf-vl.spec

(中略)

+ cp -pr README /home/kenta/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/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64
書き込み完了: /home/kenta/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/kenta/rpm/BUILD
+ cd netcdf-4.1.3
+ /bin/rm -rf /home/kenta/rpm/BUILDROOT/netcdf-4.1.3-1vl6.x86_64
+ exit 0

では、早速インストールしてみます。

$ sudo rpm -Uhv /home/kenta/rpm/RPMS/x86_64/netcdf-4.1.3-1vl6.x86_64.rpm 
[sudo] password for kenta: 
準備中...                ########################################### [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

ふーむ、netcdfパッケージに入っている /usr/share/info/dir が install-info とぶつかっているようです。 とりあえずやっつけですが、/usr/share/info/dir を外してしまいましょう。

$ cp -a netcdf-vl.spec netcdf-vl.spec.old 
$ 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/kenta/rpm/RPMS/x86_64/netcdf-4.1.3-1vl6.x86_64.rpm 
準備中...                ########################################### [100%]
   1:netcdf                 ########################################### [100%]

今度はインストールできました。 警告が出ていたり、/usr/share/info/dir を外したりしていますが、まずはとりあえずできました。 mkrpmspec を使うと、たった 7行の書き換えだけで rpm パッケージを作ることができました。

$ 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

make install と較べてほとんど手間無く、パッケージ管理されたきれいな環境が作れると思います。

やっていくと細かくいじるところがいくつも出てきますが、それは問題に出会ったときに少しずつ覚えていくことになります。 試してみて困ったことがありましたら、MLなどでご相談下さい。

なお、最終的に作った SPECファイルを ::: に置いています。 何が書き換わっているかを比較しながら、Develppers Guideを見てみてください。

参考資料

Vine Linux開発者ガイド: 第5章 SPECファイルの記述  http://vinelinux.org/docs/vine5/manuals/make-spec.html

Packages/vine-rpm-helper – VineSeed http://trac.vinelinux.org/wiki/Packages/vine-rpm-helper

spec ファイルのテンプレート - サブパッケージがない単純なパッケージ http://trac.vinelinux.org/wiki/SpecTemplates/PlainPackage

Linux life: NetCDF 4.1.3, GMT 4.5.7 install on Vine Linux 6  http://huchiura.blogspot.com/2011/11/netcdf-413-gmt-457-install-on-vine.html

Follow up

ここでは最小限の手間でrpmパッケージ作成を体験できる方法を紹介しました。 読者の環境によっては同じようにならないこともあると思います。その場合にはML等で質問して下さい。 続編として様々な問題に対処したパッケージ作成を紹介するつもりです。