久しぶりにRPMパッケージの作成について復習していて、install時には
%install make install PREFIX=$RPM_BUILD_ROOT/usr
か、もしも標準的なconfigureスクリプトによるMakefile生成を使っているなら
%install %makeinstall
使うと良いですよ~、とあったので、試しに"--eval"で覗いてみた。
$ rpmbuild --eval '%makeinstall' /usr/bin/make \ prefix=/usr \ exec_prefix=/usr \ bindir=/usr/bin \ sbindir=/usr/sbin \ sysconfdir=/etc \ datadir=/usr/share \ includedir=/usr/include \ libdir=/usr/lib \ libexecdir=/usr/libexec \ localstatedir=/var \ sharedstatedir=/usr/com \ mandir=/usr/share/man \ infodir=/usr/share/info \ install rpmbuild: ビルドのための spec ファイルが指定されていません。
・・・RPMBUILDが影も形も見えない。で、「あ、マクロだから、元の定義を見ないと駄目か」と気づいてあちこち探し回ると、rpmパッケージで
/usr/lib/rpm/macros
が提供されており、その中で定義されていた。
#------------------------------------------------------------------------------ # The make install analogue of %configure: %makeinstall \ make \\\ prefix=%{?buildroot:%{buildroot}}%{_prefix} \\\ exec_prefix=%{?buildroot:%{buildroot}}%{_exec_prefix} \\\ bindir=%{?buildroot:%{buildroot}}%{_bindir} \\\ sbindir=%{?buildroot:%{buildroot}}%{_sbindir} \\\ sysconfdir=%{?buildroot:%{buildroot}}%{_sysconfdir} \\\ datadir=%{?buildroot:%{buildroot}}%{_datadir} \\\ includedir=%{?buildroot:%{buildroot}}%{_includedir} \\\ libdir=%{?buildroot:%{buildroot}}%{_libdir} \\\ libexecdir=%{?buildroot:%{buildroot}}%{_libexecdir} \\\ localstatedir=%{?buildroot:%{buildroot}}%{_localstatedir} \\\ sharedstatedir=%{?buildroot:%{buildroot}}%{_sharedstatedir} \\\ mandir=%{?buildroot:%{buildroot}}%{_mandir} \\\ infodir=%{?buildroot:%{buildroot}}%{_infodir} \\\ install
"buildroot"マクロや"_prefix"マクロを定義すれば上手く反映出来そうなことが分かった。
というわけで再度実験:
$ rpmbuild --define 'buildroot /foo' --define '_prefix /bar' --eval '%makeinstall' /usr/bin/make \ prefix=/foo/bar \ exec_prefix=/foo/bar \ bindir=/foo/bar/bin \ sbindir=/foo/bar/sbin \ sysconfdir=/foo/etc \ datadir=/foo/bar/share \ includedir=/foo/bar/include \ libdir=/foo/bar/lib \ libexecdir=/foo/bar/libexec \ localstatedir=/foo/var \ sharedstatedir=/foo/bar/com \ mandir=/foo/usr/share/man \ infodir=/foo/usr/share/info \ install rpmbuild: ビルドのための spec ファイルが指定されていません。
恐らくRPM作成時に、コマンドラインオプションや他のmacroファイル読み込みにより内部的に"buildroot", "_prefix"マクロが定義された後に、'%makeinstall' マクロが展開されるのだろう。
以上、CentOS 5.3, RPM-4.4.2.3 でのお話でした。