[Momonga-devel.ja:01827] Momonga Linux のリリースへ向けた spec ファイルの見直し


むらけんです.

[Momonga-devel.ja:01822] でアナウンスがあったように,8月には 
stable ブランチが切られ,そのブランチでは大きな変更はされなく
なります.

そこで,spec ファイルに関してやらなければならない事 or やって
おきたいと思っている事を具体的に挙げていこうと思います.

* 現在 Release タグの値で suffix が `k' のものを `m' に変更し
  なければなりません.これは,小さなスクリプトで簡単にできるの
  で,stable ブランチを切る*直前*で良いと思いますが,必ずブラ
  ンチを切る前にやります.ブランチを切った後だと面倒ですから.

* Release タグの値で,数値を直接指定しているものを,momorel と
  いうマクロを使用する形式に変更します.

* make の引数に %{?_smp_mflags} が存在しない場合,書き足します.

* install-info で指定するファイル名で hoge.info.* となっている
  場合は hoge.info に変更します.

* License タグの値の規則を作り,統一します.この作業は1ヶ月で
  終わる気がしないのですが,がんばります.

* Momonga Antena でステータスが 0 になっているものの URL タグ
  の値を修正します.URL タグが存在しないものについては,適宜指
  定します (この適宜を決めなければなりませんね).

これ以外にありましたら,追加してください.


それから,記念すべきバージョン1.0のリリースということで,僕が
個人的にやってからリリースしたいと思っている事があるので,以下
に列挙させてください.

* [Momonga-devel.ja:00492] で小松さんが作成された %NoSource と,
  %NoPatch マクロを使用した形式に変更します.specopt における
  オプションの定義で扱われている

    %{?!with_hoge:%define with_hoge 1}

  のような記述は

    %{?!with_hoge:%global with_hoge 1}

  というように,%define を %global に変更することで,%NoSource 
  の使用によるマクロの無効化を回避する (以下で詳細を述べます).

* gcc のターゲットプラットフォームは %{_target_platform} マク
  ロで指定されています.このマクロの値は rpm の configure スク
  リプトで自動的に i586-redhat-linux-gnu になるように設定され
  てしまいます.そこで,rpm の configure スクリプトを変更して,
  i586-momonga-linux-gnu にします.もしやるのであれば,gcc-3.3 
  を HEAD に入れる前に rpm の方を対応させたいです.


最後に,%NoSource によって %define が無効化されてしまう件につ
いての詳細を説明します.

この現象は,rpm のバグで,現在最新の 4.2.1 でも直っていません.
rpm のマクロにはネストレベルという値が関連付けられているのです
が,例えば spec ファイルにおいて

  %define hoge 1
  %{?!fuga:%define fuga 0}

のように記述すると,%hoge のネストレベルは 0,%fuga が定義され
ていない場合は %fuga のネストレベルは 1 になります.もうちょっ
と踏み込んで説明すると,ネストレベルの値はマクロが定義された時
点での expandMacro 関数 (rpmio/macro.c で定義) の再帰レベル -
1 になります.

また,%NoSource のような引数付きのマクロの場合,%0, %*, %# と
いった引数が定義されますが,これらはマクロの本体が展開される時
に動的に定義されるマクロです (以下,引数マクロ).

引数マクロは,元のマクロを展開する expandMacro の再起レベルを
ネストレベルとして,addMacro を直接呼び出して定義されます (通
常のマクロは doDefine が expandMacro の再起レベル -1 を 
addMacro に指定して呼び出す).そのため,

  %{?!fuga:%define fuga 0}

で定義されたマクロ %fuga と,トップレベルで

  %NoSource 0 ...

として使用したマクロ %NoSource の引数マクロのネストレベルが同
じになります.

問題はここからで,rpm は freeArgs 関数 (rpmio/macro.c で定義) 
で引数マクロを解放しますが,この関数はまだ未完成であり,引数マ
クロのネストレベルと同じかそれより深いネストレベルで定義された
マクロを全て解放してしまいます.しかも,現在の最新である 4.2.1 
までほったらかしになったままというのも痛いですね.

このままでは,いくら rpm のバージョンを新しくしても %NoSource 
と specopt を共存できないのですが,幸いなことに %global という
手段が残っています.

%global は,必ずネストレベルを -1 にしてマクロを定義してくれる
*マクロ*です (ちなむと,%define もマクロです).spec ファイルで
は,どうがんばっても引数マクロのネストレベルを 1 より小さくす
ることはできないので,%global を使用すれば確実に問題を回避でき
ます.

ということで,どうでしょうか?やりませんか?

参考までに,確認用の spec ファイルを添付します.これをビルドさ
せると,spec ファイルの各行に対して

    0< 
    0< 
    0< Summary: hoge
    0< Name: hoge
    0< 
    1>   %{?!zzz_macro1:%define zzz_macro1 1}^
    2>     %define^zzz_macro1 1
    1<   (empty)
    0< 

のように expandMacro の再起レベルを行頭に表示しながらビルドを
実行し (%trace マクロによる効果),また,spec ファイルで %dump 
マクロを使用したところで

  ========================
  -14: GNUconfigure(MCs:) 
    CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS; 
    LDFLAGS="${LDFLAGS:-%{-s:-s}}"  ; export LDFLAGS; 
       :
     <snip>
       :
    1: zzz_macro1 1
    1: zzz_macro2 2
   -1: zzz_macro3 3
  ======================== active 236 empty 0

というマクロのダンプが表示されます.各行は

  (ネストレベル):(マクロ名) (値)

という対応です.

%dump マクロを

  * %prep の直後

  * %test_macro マクロの先頭と末尾

  * %prep の最後

の4箇所に入れたので,最後の %dump で %zzz_macor1 と 
%zzz_macor2 が消えて %zzz_macor3 だけが残っている様子を確認し
てみてください.ログフェチな方は何度か楽しめるでしょう(とか言
う).

# ここまでわかってるんだから rpm 本体に手を入れるべきなんです
# が,現在,そこまで没頭できる程暇ではないので,もし rpm 本体
# に手を入れたい方がいれば任せます.

-- 
1024D/2A3FDBE6 2001-08-26 Kenta MURATA (muraken) <muraken2@xxxxxxxxx>
Key fingerprint = 622A 61D3 280F 4991 4833  5724 8E2D C5E1 2A3F DBE6


Attachment: hoge.spec
Description: Binary data