久しぶりに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 でのお話でした。