[wiki:docs Vine Linux ドキュメント] / [wiki:../ RPM パッケージの作成方法] / 環境変数とマクロの活用 = 環境変数とマクロの活用 = == 環境変数 == スクリプト部の各タグからはじまる部分は、先にも述べた通り独立した bash スクリプトとして働くので、 その範囲内で、 {{{ #!sh TEXMF="/usr/share/texmf" }}} と変数を定義して用いることができます。 定義した変数は ${ } で囲んで {{{ #!sh ${TEXMF} }}} のようにすると利用できます。 $TEXMF のように { } を省略することもできます。 /usr/share というディレクトリは標準で %{_datadir} というマクロが定義されているので {{{ #!sh TEXMF="%{_datadir}/texmf" }}} とすることができます。 マクロについては、次節以降で説明します。 また、以下の変数は各タグ毎に環境変数として定義されます。 RPM_SOURCE_DIR:: ディレクトリ SOURCES のパスを表す。デフォルトは、 ~/rpm/SOURCE です。 RPM_BUILD_DIR:: ディレクトリ BUILD を表す。デフォルトは、 ~/rpm/BUILD RPM_DOC_DIR:: %doc で指定されたドキュメントファイルをインストールするためのディレクトリを表す。 rpmrc ファイルの、defaultdocdir で指定する。デフォルトは、 /usr/share/doc です。 RPM_OPT_FLAGS:: コンパイル時にコンパイラにわたすデフォルトのオプション指定を表す。 rpmrc ファイルの、optflags で指定する。 アーキテクチャ毎に指定ができる。 例えば、%build において以下のように使う。 {{{ #!sh make CFLAGS=${RPM_OPT_FLAGS} }}} デフォルトはarchitectureがi386のときには、 {{{ #!sh RPM_OPT_FLAGS="-O2 -m486 -fno-strength-reduce" }}} です。 RPM_ARCH_FLAGS:: build を行なっているシステムのアーキテクチャを表す変数。アーキテクチャが i386 なら、 {{{ #!sh RPM_ARCH_FLAGS="i386" }}} です。 RPM_OS:: build を行なっているシステムの OS をあらわす変数。Linuxなら、 {{{ #!sh RPM_OS="Linux" }}} です。 RPM_BUILD_ROOT:: !BuildRoot タグで設定された仮想インストールのためのディレクトリを表す。 RPM_PACKAGE_NAME:: Name タグで設定されたパッケージ名を表す。 RPM_PACKAGE_VERSION:: Version タグで設定されたバージョン名を表す。 RPM_PACKAGE_RELEASE:: Release タグで設定されたリリース番号を表す。 == SPECファイル中のマクロ定義 == マクロは {{{ #!sh %define マクロの名前 内容 }}} のように書くことで定義できます。 {{{ #!sh %{マクロの名前} }}} のように書くことで利用できます。 {} を省略して %マクロの名前 と書くこともできますが、 {} をつけて利用したほうが、 [wiki:../make-spec#スクリプト部 スクリプト部]に出てきた %prep や %build などといったタグと区別しやすくなります。 マクロは、%setup や %install などのスクリプト部やファイル定義部など、SPEC ファイル全体で使えるので、うまく使うとバージョンアップに追随して SPEC ファイルを修正するときに楽ができます。 %define で定義せずに使えるマクロとして %{name} , %{version} , %{release} があります。[wiki:../make-spec#パッケージ情報の記述 パッケージ情報の記述]にでてきた、Name , Version , Release の値が、 それぞれ %{name} , %{version} , %{release} の内容になります。 {{{ #!Admonition %define name hoge として name を定義し Name: %{name} のように利用している SPEC ファイルを見かけることがありますが、 Name の値を参照するのが %{name} なので、本来とは逆の使い方になり問題を起こす場合があるかもしれません。このような場合は %define pkg_name hoge , Name: %{pkg_name} のように %{name} とは違う名前のマクロを利用したほうがよいでしょう。 }}} [wiki:../make-spec SPEC ファイルの記述]のSPECファイルの例のデータ定義部は、 %{name} と %{version} というマクロを利用して、以下のように書くことができます。 Name: hoge なので %{name} は hoge に、Version: 1.1 なので %{version} は 1.1 になります。 {{{ #!sh Name: hoge Version: 1.1 Release: 1 Source: %{name}-%{version}.tar.gz Patch: %{name}.patch }}} SPECファイルの中(どこでもいいです)に %dump と書いておくと、 rpmbuild コマンドでパッケージを作る時に、 すべてのマクロが標準エラー出力に出力され、確認することができます。 マクロの定義を取り消したいけれど、行を削除するのではなくコメントとして残しておきたいという場合には、 %define に % をつけて、%%define にし、さらに # をつけます。 {{{ #!sh %define hoge hige }}} を {{{ #!sh # %%define hoge hige }}} のようにします。 {{{ #!sh # %define hoge hige }}} ではだめです。 # 以降はコメントになるという処理よりも、マクロの %define の方が先に処理されるので、 %define hoge hige が解釈されてしまいます。 == 標準で定義されているマクロ == よく利用されるコマンドやディレクトリなどにはあらかじめマクロが定義されています。 自分で定義した変数と同様に SPEC ファイル全体で使えます。 標準で定義されているマクロは /usr/lib/rpm/macros に書かれています。 ユーザー毎のマクロを記述するファイルは ~/.rpmmacros です。 ~/.rpmmacros に書く場合には {{{ #!sh %マクロの名前 内容 }}} とします。 [wiki:../directories パッケージ作成に必要なディレクトリの準備]で出てきた %_topdir などもマクロです。 ユーザー毎のマクロと、標準で定義されているマクロをあわせたものは、 rpm コマンドの --showrc オプションで確認できます。 {{{ #!sh $ rpm --showrc }}} また、それぞれのマクロがどんなものかは、 {{{ #!sh $ rpm --eval "%{マクロ}" }}} のようにすると確認できます。 標準で定義されているマクロについてはなるべく利用してください。 SPEC ファイルのメンテナンスしやすさの向上につながります。 たとえば、%{configure} や %{makeinstall} といったマクロを利用することで、 %build や %install の部分を簡潔に書くことができる場合があります。 {{{ #!sh %build %{configure} %{__make} %install %{makeinstall} }}} rpm コマンドの --evel オプションでマクロの値を確認することができます。 {{{ #!sh $ rpm --eval "%{configure}" }}} rpm 4.x および Vine Linux で定義されているマクロを使うと[wiki:../make-spec SPEC ファイルの記述]の SPEC ファイルは次のようになります。 {{{ #!sh #---------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 # パッケージの作成時に必要となる情報 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 1.1-2 - added Japanese messages * Mon Feb 15 1999 Jun Nishii 1.1-1 - first release for version 1.1 #---------SPECファイルの例はここまで----------------------------------------- }}} [[FootNote]]