Most of the tips for building RPM as non-root says to
rewrite ~/.rpmmacros
to set %_topdir $HOME/rpmbuild
.
Don't. You are locking yourself into single build directory, which you do not want when building more than one RPM package.
Setting %_topdir
should be done in other ways.
for d in RPMS/i686 RPMS/i486 RPMS/i586 RPMS/noarch RPMS/i386 BUILD SPECS SRPMS SOURCES; do mkdir -p $d; done
Pass option like rpmbuild -D "_topdir `pwd`"
explicitly.
This will make %_topdir
change.
To expand the .src.rpm in the build directory,
pass options to rpm
:
rpm -ivh -D "_topdir `pwd`" gzip-1.5-8.el7.src.rpmYou don't need root priviledge for installing the source RPM under your directory.
If you are using CentOS, it tends to add .el7.centos
as %{dist}
macro, resulting in package names like
gzip-1.5-8.el7.centos.i586.rpm .
If you don't like this, add -D "dist .el7"
to the options.
Passing options every time will quickly be tedious, so you should write a Makefile, like
gzip: rpmbuild --target=i586 \ -D "_topdir `pwd`" \ -D "dist .el7" \ -bb SPECS/$@.spec
On CentOS 5 things get tricky.
-D "_topdir `pwd`"
won't work as expected;
you have to pass it via rpmmacros
file.
%_topdir $HOME/rpmbuild.gzip %dist .el5 %el5 1
macrofiles: /usr/lib/rpm/macros:/usr/lib/rpm/redhat/macros:/usr/lib/rpm/%{_target}/macros:/etc/rpm/macros.*:/etc/rpm/macros:/etc/rpm/%{_target}/macros:/home/kabe/rpmbuld.gzip/rpmmacros:~/.rpmmacros(this should be on single line)
rcfile="" for d in /usr/lib/rpm/rpmrc /usr/lib/rpm/redhat/rpmrc `pwd`/rpmrc ~/.rpmrc; do test -r "$d" && rcfile="${rcfile}${rcfile:+:}$d" done rpm -ivh --rcfile "$rcfile" gzip-1.3.5-13.el5.centos.src.rpm rpmbuild --rcfile "$rcfile" -bb SPECS/gzip.spec
The reason for checking existence of $rcfile in the for
loop,
is that rpmbuild
will fail silently when
given nonexistent file as --rcfile
list.
This will quickly grow burdensome, so you should write a Makefile.
If you're preparing multiple RPM build directories,
you would like to use a shellscript, as below.
This script prepares RPM build directory under current directory,
and sets up ./rpm
./rpmbuild
commands
which you will use instead of the standard ones.
#!/bin/sh # mkrpmdir.c5 ### mkdir for d in RPMS/i686 RPMS/i486 RPMS/i586 RPMS/noarch RPMS/i386 BUILD SPECS SRPMS SOURCES; do mkdir -p $d; done ### ./rpmbin cat > ./rpmbin << 'EOF' #!/bin/sh D=${0%/*} test x"$D" = x"." && D="`pwd`" # explicit --rcfile needs existence?? rcfile="" for d in /usr/lib/rpm/rpmrc /usr/lib/rpm/redhat/rpmrc ${D}/rpmrc ~/.rpmrc; do test -r "$d" && rcfile="${rcfile}${rcfile:+:}$d" done exec ${0##*/} --rcfile "$rcfile" \ --macros=/usr/lib/rpm/macros:/usr/lib/rpm/redhat/macros:/usr/lib/rpm/%{_target}/macros:/etc/rpm/macros.*:/etc/rpm/macros:/etc/rpm/%{_target}/macros:`pwd`/rpmmacros:~/.rpmmacros \ "$@" EOF chmod +x ./rpmbin ### symlink ./rpmbuild, ./rpm -> rpmbin for i in rpmbuild rpm; do rm -f ./$i; ln -s rpmbin ./$i; done ### ./rpmrc cat > ./rpmrc << EOF # rpmrc macrofiles: /usr/lib/rpm/macros:/usr/lib/rpm/redhat/macros:/usr/lib/rpm/%{_target}/macros:/etc/rpm/macros.*:/etc/rpm/macros:/etc/rpm/%{_target}/macros:`pwd`/rpmmacros:~/.rpmmacros EOF ### ./rpmmacros cat > ./rpmmacros << EOF # rpmmacros %_topdir `pwd` ##RHEL5: doesn't define dist,el5 %dist .el5 %el5 1 EOF
To expand the .src.rpm, you would use ./rpm
in the build directory:
./rpm -ivh gzip-1.3.5-13.el5.centos.src.rpm
./rpmbuild --target=i586 -bb SPECS/gzip.spec