.specファイルの%{?hoge:1}とか%{!?hoge:0}について

rpmパッケージを作るときに必要になる.specファイルのマクロについて、かつて自分が悩んだのと同じ問題で悩んでいる人がいるかもしれないのでメモしておく。
例としてVine Linuxndiswrapper.specをとりあげると、

$ []wget 'ftp://ftp.jaist.ac.jp/pub/Linux/Vine/Vine-4.2/SRPMS/SRPMS/ndiswrapper-1.27-0vl2.src.rpm'[]
$ []rpm2cpio ndiswrapper-1.27-0vl2.src.rpm |cpio -id[]
[]379 blocks[]
$ []lv ndiswrapper.spec[]
[]%define build_kmod %{?_with_kmod:1}%{!?_with_kmod:0}[]
...省略...
[]%install[]
...省略...
[]%if %{build_kmod}[]
[]rm -f $RPM_BUILD_ROOT%{_syssbindir}/loadndisdriver[]
[]rm -f $RPM_BUILD_ROOT%{_sbindir}/ndiswrapper*[]
[]rm -f $RPM_BUILD_ROOT%{_mandir}/man8/ndiswrapper*[]
[]%else[]
[]rm -f $RPM_BUILD_ROOT/lib/modules/%{kversion}/misc/ndiswrapper.ko[]
[]%endif[]
...省略...

となっていて、build_kmodが真(0以外)ならndiswrapper.ko以外のファイルが、作成されるrpmパッケージから除外され、逆にbuild_kmodが偽(=0)なら、ndiswrapper.koのみが作成されるrpmパッケージから除外される。ここでndiswrapper.specの最初の行にマクロ%{?_with_kmod:1}、および%{!?_with_kmod:0}が書かれているが、これは

_with_kmod 定義されている 定義されていない
%{?_with_kmod:1} 1 {空}
%{!?_with_kmod:0} {空} 0

と展開される。これは以下のコマンドで確かめられる。

$ []rpm --eval '%{?_with_kmod:1}'[]

$ []rpm --eval '%{!?_with_kmod:0}'[]
0
$ []rpm --define '_with_kmod fuga' --eval '%{?_with_kmod:1}'[]        []fugaの部分は何でも良い。[]
1
$ []rpm --define '_with_kmod fuga' --eval '%{!?_with_kmod:0}'[]

"_with_kmod"はndiswrapper.spec内に定義されていないので普通にrpmbuildするとndiswrapper.koを含まないrpmパッケージが作成される。ndiswrapper.koのみを含むパッケージを作るには、rpmbuild に--defineオプションをつけて実行する。

$ []rpmbuild --define '_with_kmod fuga'[]                []fugaの部分は何でも良い。[]