Arcen's Blog

アクセスカウンタ

zoom RSS specの書き方

<<   作成日時 : 2011/06/05 07:04   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

rpmの構築用ファイルの書き方メモ

manpage
rpm
rpmbuils

●ユーザ環境でのビルド環境設定
$ mkdir -p ~/rpm/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
$ echo "%_topdir /home/<ユーザ名>/rpm" > ~/.rpmmacros


●srpmを取得
rikenのサイトあたりで取得してくる。
http://ftp.riken.jp/Linux/

●srpmの展開
$ rpmbuild --rebuild *.srpm

~/rpm/SPECSにspecファイルが展開され、SOURCESにtarやbz2ファイルと、パッチなどが展開される。

●specの中身
CentOS 5.6はboost 1.33.1がデフォルトで入っているが、古すぎる。boost 1.41.0がepelで公開されているが、cmakeでビルドするspecになっていて、1.46.1用のcmake用ファイルは開発がとまっているようだ。現在は1.46.1なので、specを書いてみたのでそれをサンプルにする。

ビルド時に外部で定義して渡すことができる。
$ rpmbuild -ba --define="dist .el5" --define="rhel 5" --define="ver 1.46.1" boost.spec
マクロ定義
%define boost_docdir __tmp_docdir
%define with_openmpi 1

条件分岐とマクロ参照
%if %{with_openmpi} > 0
%if 0%{?rhel} < 6
%define _openmpi_load \
mpi-selector --yes --set `mpi-selector --list | grep openmpi` \
source %{_sysconfdir}/profile.d/mpi-selector.sh \
export MPI_INCLUDE_PATH="%{_libdir}/openmpi/1.4-gcc/include" \
export MPI_LIB="%{_libdir}/openmpi/1.4-gcc/lib" \
export MPI_SUFFIX="_openmpi"
%define _openmpi_unload \
mpi-selector --yes --unset \
unset MPI_INCLUDE_PATH \
unset MPI_LIB \
unset MPI_SUFFIX
%endif
%endif

外部定義から条件分岐
%define fixver %{?ver}%{!?ver:"1.46.1"}
正規表現で文字列訂正
%define shortver %(echo "%{fixver}" | sed -e "s/\\\.//g")
パッケージ基本情報
Name: boost%{shortver}
Summary: The free peer-reviewed portable C++ source libraries
Version: %{fixver}
Release: 1%{?dist}
License: Boost and MIT
URL: http://www.boost.org/
Group: System Environment/Libraries
BuildArch: %{_arch}
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

ビルドに必要なソースファイル。
Source: http://umn.dl.sourceforge.net/sourceforge/boost/%{folder_name}.tar.gz
今回はパッチは作らずに済んだ。パッチはバージョンが変わるごとに書き直す必要があるかどうか調べるのが大変なのでなるべく避けたい。
ビルドに必要なパッケージ。大体十分に書いてないことが多いし、必要かどうか不明なものもある。
BuildRequires: libstdc++-devel
オプションパッケージを必ず一緒に入れるようにする書き方。ただ、今回これらは全て削除した。
Requires: %{name}-date-time = %{version}-%{release}
パッケージの記述情報。
%description
Boost provides free peer-reviewed portable C++ source libraries. The
emphasis is on libraries which work well with the C++ Standard
Library, in the hopes of establishing "existing practice" for
extensions and providing reference implementations so that the Boost
libraries are suitable for eventual standardization. (Some of the
libraries have already been proposed for inclusion in the C++
Standards Committee's upcoming C++ Standard Library Technical Report.)

オプションパッケージの宣言とその記述情報
%package date-time
Summary: Runtime component of boost date-time library
Group: System Environment/Libraries

%description date-time

Runtime support for Boost Date Time, set of date-time libraries based
on generic programming concepts.

そのほかに、開発用のdevel、ドキュメントのdoc等を定義する。

ビルド前に実行するコマンド。
%prep
ファイルを展開する。実際はここにパッチを書く
%setup -q -n %{folder_name}
ビルドを実行する。
%build
パイソンのバージョンを調べる。
%define python_version %(python -c 'import sys; print sys.version[:3]')
bjamに渡すパラメータを定義する。
%define boost_jam_common_flags -q --layout=tagged --toolset=gcc variant=release optimization=speed -sPYTHON_ROOT=/usr -sPYTHON_VERSION=%{python_version} -sHAVE_ICU=1 -sEXPAT_INCLUDE=%{_includedir} -sEXPAT_LIBPATH=%{_libdir} runtime-link=shared -j2 -d2 debug-symbols=on
boostの場合、APIが変わることが多いので、上書きで入れてしまうと何かと面倒なことになるので別ディレクトリにインストールする。
具体的には/usr/lib64にlibboost_date_time.so.1.46.1を入れて、/usr/lib64/boost1461/libboost_date_time.soから参照させることでリンク時に-L/usr/lib64/boost1461と指定することで版を指定することができる。includeも/usr/include/boost1461にインストールするようにする。
--layout=taggedで1.46.1を後ろにつけて作製する。fedora用の1.41.0は後ろに単一の数字をつけて管理していたが、毎回作っているとどの数字がどの版かがわからないのと、パッチ等でいろいろやっていたので修正した。
debug-symbols=onでデバッグ情報つきでビルドする。ただ、パッケージ作製時に自動的にstripしてくれるので問題ない。
-j2は並列ビルド数。環境依存なので外部から指定したほうがいいとは思う。

mpiをビルドするのにopenmpiを利用した。mpich2は開発が停止していて、centosからなくなっている。mpiでビルドするにはuser-config.jamを書いて指定する必要がある。openmpiの場合にはmpiCCの場所を指定する必要がある。32bitの場合、調べていないので直書きになっている。
%if %{with_openmpi} > 0
echo "using mpi : /usr/lib64/openmpi/1.4-gcc/bin/mpiCC ;" >> ./tools/build/v2/user-config.jam
%define boost_bjam bjam %{boost_jam_common_flags} --user-config=tools/build/v2/user-config.jam
%{_openmpi_load}
%else
%define boost_bjam bjam %{boost_jam_common_flags} --without-mpi
%endif

追加やちょっとした変更なら、パッチにする必要はない。

bjamのビルドとbjamを使ったmakeの実行
./bootstrap.sh --prefix=%{_prefix} --libdir=%{_libdir}
./%{boost_bjam} --prefix=%{_prefix} --libdir=%{_libdir}

%if %{with_openmpi} > 0
%{_openmpi_unload}
%endif

bjamでのインストール。
%install
%{__rm} -rf $RPM_BUILD_ROOT

%if %{with_openmpi} > 0
%{_openmpi_load}
%endif

./%{boost_bjam} --prefix=$RPM_BUILD_ROOT%{_prefix} --libdir=$RPM_BUILD_ROOT%{_libdir} install

cd %{_builddir}/%{folder_name}/


docのインストール箇所はそのまま流用した。

パッケージ名でディレクトリをinclude,lib64の下につくり、includeファイルを移動して、.aファイルを移動する。
mpiはビルド時にタグがつけられていないので、名前を変えて、リンクを張った。
残りのタグがついていないリンクファイルの.soを削除して、ディレクトリの下に新しく作る。

# Perform the necessary renaming according to package renaming
mkdir -p $RPM_BUILD_ROOT{%{_includedir},%{_libdir}}/%{name}
# move include files to %{name}
mv -f $RPM_BUILD_ROOT%{_includedir}/{boost,%{name}}
# move .a to %{name}
mv -f $RPM_BUILD_ROOT%{_libdir}/{*.a,%{name}}
mv -f $RPM_BUILD_ROOT%{_libdir}/{mpi.so,mpi-mt.so.%{tagged}}
ln -s ../mpi-mt.so.%{tagged} $RPM_BUILD_ROOT%{_libdir}/%{name}/mpi-mt.so
for library in $RPM_BUILD_ROOT%{_libdir}/*.so; do
rm -f $library
ln -s ../$(basename $library).%{tagged} $RPM_BUILD_ROOT%{_libdir}/%{name}/$(basename $library)
done


ビルド完了時の後始末。
%clean
%{__rm} -rf $RPM_BUILD_ROOT

パッケージに必要なファイルを書く。全てのパッケージのどれかにインストールされる全てのファイルが入っていないとエラーになるので注意。
%files

%files date-time
%defattr(-, root, root, -)
%doc LICENSE_1_0.txt
%{_libdir}/libboost_date_time*.so.%{tagged}


%changelogには変更履歴を書く。
%changelog
* Fri Jun 02 2011 Arcen 1.46.1-1
- Remove CMake dependency
- Add random package


●rpmの構築

全ての再構築
$ cd ~/rpm/SPECS/
$ rpmbuild -ba *.spec


ビルドが成功したときに、%installからリトライ
$ cd ~/rpm/SPECS/
$ rpmbuild -bi --short-circuit *.spec


インストールが成功したときに、%filesを確認
$ cd ~/rpm/SPECS/
$ rpmbuild -bl *.spec

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
specの書き方 Arcen's Blog/BIGLOBEウェブリブログ
文字サイズ:       閉じる