[Momonga-devel.ja:00707] Re: [momonga-cvs] pkgs/apache


小松です。

From: HOSONO Hidetomo <h@xxxxxxxx>
Subject: [Momonga-devel.ja:00706] Re: [momonga-cvs] pkgs/apache
Date: Thu, Oct 31, 2002 at 05:54:10PM JST

> /etc/rpm/macrosで
> 
>   %suexec_uidmin 500
>   %suexec_gidmin 100
> 
> とすればいかようにでも変更できます。

%{?include_specopt} に対応してくれるとうれしいかも。

Index: apache.spec
===================================================================
RCS file: /home/cvs/pkgs/apache/apache.spec,v
retrieving revision 1.19
diff -u -u -r1.19 apache.spec
--- apache.spec	2002/10/31 06:08:41	1.19
+++ apache.spec	2002/10/31 18:01:04
@@ -1,12 +1,15 @@
+Name: apache
+
 %define contentdir /home/httpd
 %define mod_ssl_ver 2.8.11
 %define _ipv6 0
+
+%{?include_specopt}
+
 %{?!suexec_uidmin: %define suexec_uidmin 500}
 %{?!suexec_gidmin: %define suexec_gidmin 100}
 
-
 Summary: The most widely used Web server on the Internet.
-Name: apache
 Version: 1.3.27
 Release: 3m
 Group: System Environment/Daemons


ところで、%{?include_specopt} 使う場合の一般的な注意をいくつか。

(1) %include_specopt の前には %name が定義されていなければならない。
    定義を見てもらえばわかりますが、%name を見て 
    include すべきファイルを決めているからです。

(2) %include_specopt は spec file 内で define する option より
    前に書かないといけない。

    上の例だと、%{?!suexec_uidmin: ...} の前に書くべし、
    ということです。

    また、%_specoptfile (上の例だと /etc/rpm/specopt/apache.specopt)
    の中では spec 中と同じような形、つまり

       %{?!suexec_uidmin: %define suexec_uidmin 1000} 

    というように定義する方がいいでしょう。
    つまり、suexec_uidmin が定義されていない時のみ define する、
    ということです。
    これは、rpm --define で option を与えた時に
    spec file でその option を上書きしないようにするためです。
    
    (rpm の場合、--define で与えた option よりも spec 中の %define が
    優先されるという、直観に反する動作をしてくれます)。

    こうすれば、

        1. --define で与えた option
	2. %_specoptfile に書いた option
	3. spec 中に書かれた option (default 値)

    という優先順位になって、いろいろとうれしいでしょう。
    
(3) %include_specopt が定義されていない環境に持って行っても
    問題なく動くように、%{?include_specopt} と書くことが望ましい。

    こう書いておけば %include_specopt が定義されている環境では
    マクロが展開され(て %_specoptfile が include され)、
    定義されていない環境では単に無視されます。
    
(4) %_specoptdir や %_specoptfile は ~/.rpmmacros や --define などで
    上書きすることができます(できるはずです。が、未確認。。。)。

    例えば、official package を build する時など、
    自分の %_specoptfile を読んでもらっては困るような時には

        %_specoptdir  /nonexistent

    のように、存在しない directory を指定するとよいでしょう
    (%_specoptfile がみつからない場合には単に無視するだけになっているので)。

    また、~/.rpmmacros で

        %_specoptdir ~/.rpm/specopt

    として、自分の home directory に %_specoptfile を置く、
    なんてこともできるでしょう。
    # ~ を home directory に展開してくれたかどうかは未確認。


とりあえず思いついたのはこんなところです。
%include_specopt も市民権を得つつある気がするので、
そろそろ document に書いた方がいいかもしれませんね。

-- 
---------------------------------------
東京大学大学院総合文化研究科
広域科学専攻相関基礎科学系 
  佐々研究室  博士3年
    小松  晋一朗            
koma2@xxxxxxxxxxxxxxxxxxxx
koma2@xxxxxxxxxxxxxxxxx
http://kamuy.c.u-tokyo.ac.jp/~koma2/
---------------------------------------