RPMマクロ

便利に使えるRPMのマクロたち

%define foo bar

%fooをbarに定義するマクロ.cpp(1)の#defineみたいなもの.
後から上書きできる.

%define foo 1
%define foo 2
%foo  # => 2
%{?name:expr}

nameが定義されていたらexprを評価.cpp(1)の#ifdefみたいなもの.

%{!?name:expr}

nameが定義されていなかったらexprを評価.cpp(1)の#ifndefみたいなもの.

%(expr)

exprの中身を/bin/shで実行する.評価結果は標準出力に出力された文字列となる.cpp(1)にはこんな変態マクロは無い.

組み合わせても使える
%{!?uname:%define uname %(uname)}
%ifもあるよ

condは,少なくとも 0 or 1 の場合に,期待通りに動くようだ.

%if cond
commands
%endif

RPMマクロの働きの調べ方

RPMのspecファイル中に現れる%{...}という形の式は,rpm(8)がマクロと判断して評価する.RedHatベースのシステムには,いくつか定義済みのマクロがあり,これらは/usr/lib/rpm/macrosファイルを調べる事で確認することができる.

しかし,わからないマクロが出てくるたびにいちいちこのファイルを読むのはとても面倒である.そんなときのために,rpm(8)には--evalオプションがある.これを使うと,マクロがどのように展開されるのか確認することができる.

実行例
% rpm --eval '%configure'

evalオプションを複数書くこともできる.この場合,オプションの順番通りに評価が行われる.

% rpm --eval '%{!?python_sitelib: %define python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}' \
      --eval '%{python_sitelib}'
/usr/lib/python2.3/site-packages