環境変数とマクロの活用

III.8.1. 環境変数

スクリプト部の各タグからはじまる部分は、先にも述べた通り独立したbash scriptとして働くので、 その範囲内で、

TEXMF="/usr/share/texmf"
と変数を定義して用いることができます。

定義した変数は ${ } で囲んで

${TEXMF}
のようにすると利用できます。 $TEXMF のように { } を省略することもできます。

/usr/share というディレクトリは標準で %{_datadir} というマクロが定義されているので

TEXMF="%{_datadir}/texmf"
とすることができます。 マクロについては、次節以降で説明します。

また、以下の変数は各タグ毎に環境変数として定義されます。

RPM_SOURCE_DIR

ディレクトリSOURCESを表す。表 I.2-1参照。 デフォルトは、

RPM_SOURCE_DIR="/usr/src/redhat/SOURCES"

RPM_BUILD_DIR

ディレクトリBUILDを表す。表 I.2-1参照。 デフォルトは、

RPM_BUILD_DIR="/usr/src/redhat/BUILD"

RPM_DOC_DIR

%docで指定されたドキュメントファイルをインストールするためのディレクトリを表す。 rpmrcファイルの、defaultdocdirで指定する。デフォルトは、

RPM_DOC_DIR="/usr/doc"

RPM_OPT_FLAGS

コンパイル時にコンパイラにわたすデフォルトのオプション指定を表す。 rpmrcファイルの、optflagsで指定する。 アーキテクチャ毎に指定ができる。 例えば、%buildにおいて以下のように使う

make CFLAGS=${RPM_OPT_FLAGS}
デフォルトはarchitectureがi386のときには、
RPM_OPT_FLAGS="-O2 -m486 -fno-strength-reduce"

RPM_ARCH_FLAGS

buildを行なっているシステムのアーキテクチャを表す変数。 アーキテクチャがi386なら、

RPM_ARCH_FLAGS="i386"

RPM_OS

buildを行なっているシステムのOSをあらわす変数。Linuxなら、

RPM_OS="Linux"

RPM_BUILD_ROOT

BuildRootで設定された仮想インストールのためのディレクトリを表す。 (セクション II.5.1 - パッケージ情報の記述のBuildRootの項参照)

RPM_PACKAGE_NAME

Nameで設定されたパッケージ名を表す。 (セクション II.5.1 - パッケージ情報の記述のNameの項参照)

RPM_PACKAGE_VERSION

Versionで設定されたバージョン名を表す。 (セクション II.5.1 - パッケージ情報の記述のVersionの項参照)

RPM_PACKAGE_RELEASE

Releaseで設定されたリリース番号を表す。 (セクション II.5.1 - パッケージ情報の記述のReleaseの項参照)

III.8.2. SPECファイル中のマクロ定義

マクロは

%define マクロの名前 内容
のように書くことで定義できます。

%{マクロの名前}
のように書くことで利用できます。 {} を省略して %マクロの名前 と書くこともできますが、 {} をつけて利用したほうが、 セクション II.5.2 - スクリプト部に出てきた %prep や %build などといったタグと区別しやすくなります。

マクロは、%setupや%installなどのスクリプト部やファイル定義部など、 SPECファイル全体で使えるので、 うまく使うとバージョンアップに追随してSPECファイルを書くときに楽ができます。

%define で定義せずに使えるマクロとして %{name} , %{version} , %{release} があります。 セクション II.5.1 - パッケージ情報の記述にでてきた、Name Version Release の値が、 それぞれ %{name} , %{version} , %{release} の内容になります。

%define name hoge として name を定義し Name: %{name} のように利用しているSPECファイルを見かけることがありますが、 Name の値を参照するのが %{name} なので、本来とは逆の使い方になり問題を起こす場合があるかもしれません。 このような場合は %define pkg_name hoge , Name: %{pkg_name} のように %{name} とは違う名前のマクロを利用したほうがよいでしょう。

第II.5章 - SPECファイルの記述のSPECファイルの例のデータ定義部は、 %{name} と %{version} というマクロを利用して、以下のように書くことができます。 Name: hoge なので %{name} は hoge に、Version: 1.1 なので %{version} は 1.1 になります。

Name: hoge
Version: 1.1
Release: 1
Source: %{name}-%{version}.tar.gz
Patch: %{name}.patch

SPECファイルの中(どこでもいいです)に %dump と書いておくと、 rpmbuild コマンドでパッケージを作る時に、 すべてのマクロが標準エラー出力に出力され、確認することができます。

マクロの定義を取り消したいけれど、行を削除するのではなくコメントとして残しておきたいという場合には、 %define に % をつけて、%%define にし、さらに # をつけます。

%define hoge hige
# %%define hoge hige
のようにします。
# %define hoge hige
ではだめです。 # 以降はコメントになるという処理よりも、マクロの %define の方が先に処理されるので、 %define hoge hige が解釈されてしまいます。

III.8.3. 標準で定義されているマクロ

よく利用されるコマンドやディレクトリなどにはあらかじめマクロが定義されています。 自分で定義した変数と同様にSPECファイル全体で使えます。

標準で定義されているマクロは /usr/lib/rpm/macros に書かれています。 ユーザー毎のマクロを記述するファイルは~/.rpmmacrosです。

~/.rpmmacros に書く場合には

%マクロの名前 内容
とします。 第I.2章 - パッケージ作成に必要なディレクトリの準備で出てきた %_topdir などもマクロです。

ユーザー毎のマクロと、標準で定義されているマクロをあわせたものは、 rpmコマンドの --showrcオプションで確認できます。

$ rpm --showrc

また、それぞれのマクロがどんなものかは、

$ rpm --eval "%{マクロ}"
のようにすると確認できます。

標準で定義されているマクロについてはなるべく利用してください。 SPECファイルのメンテナンスしやすさの向上につながります。

たとえば、%{configure} や %{makeinstall} といったマクロを利用することで、 %build や %install の部分を簡潔に書くことができる場合があります。

%build
%{configure}
%{__make}

%install
%{makeinstall}
$ rpm --eval "%{configure}"
などとやってそれぞれのマクロがどんなものか確認して下さい。

rpm 4.x および Vine Linux 4.1 で定義されているマクロを使うと 第II.5章 - SPECファイルの記述のSPECファイルは次のようになります。

#---------SPEC ファイルの例 (#から始まる行は、コメント行です)--------

# 基本情報
Summary: hoge is a harehare horehore
Summary(ja): hoge は harehare な horehore です。
Name: hoge
Version: 1.1
Release: 1%{?_dist_release}
License: GPL2
Group: Local
URL: http://www.fugahogo.com/hogehoge.html
Vendor:	Project Vine
Distribution: Vine Linux
Packager: yourid,otherid
Packager: Jun Nishii <jun@vinelinux.org>

# パッケージの作成時に必要となる情報
Source: %{name}-%{version}.tar.gz
Patch: %{name}.patch.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-root

# 依存情報
Requires:	piyo
BuildRequires:	piyo-devel

# 詳しい解説
%description
Hoge is a harehare horehore and convenient for fugafuga.
Enjoy!

%description -l ja
hoge は harehare な horehore で、fugafuga するときなどとても便利なツー
ルです。みんなでなかよく使いましょう。

# スクリプト部
%prep       #rpmを構築する前の準備です。
%{__rm} -rf $RPM_BUILD_ROOT

%setup      #ソースをBUILDに展開します。
%patch -p1  #パッチをあてます。

%build      #makeのための手順を書きます。
%{__make}
(cd man; %{__make} man)

%install    #installのための手順を書きます。
%{__make} prefix=${RPM_BUILD_ROOT}/%{_prefix}/local install
(cd man; %{__make} prefix=${RPM_BUILD_ROOT}/%{_prefix}/local install.man)

%clean      #rpmを作ったあとの後始末です。
%{__rm} -rf $RPM_BUILD_ROOT

# ファイルリスト部 --------------
%files
%defattr(-,root,root)
%doc README
%doc docs/ 
%{_bindir}/hoge.bin
%{_libdir}/hoge/
%{_mandir}/man1/hoge.1.gz
%dir %{_libdir}/hoge/
%config %{_libdir}/hoge/fuga.conf

# 更新履歴
%changelog
* Tue Feb 16 1999 Jun Nishii <jun@vinelinux.org> 1.1-2
- added Japanese messages

* Mon Feb 15 1999 Jun Nishii <jun@vinelinux.org> 1.1-1
- first release for version 1.1

#---------SPECファイルの例はここまで-----------------------------------------