Here's how to rebuild source RPMs on your computer.
First, if you do not already have one, you will need to set up a workspace for building RPMs. This requires nothing more than creating a simple
.rpmmacros file and an
rpms/ directory under your home directory. If you are using Fedora Linux, you can accomplish this goal by installing the
rpmdevtools package and then running the
rpmdev-setuptree command:
$ sudo yum -y install rpmdevtools
$ rpmdev-setuptree
Otherwise, the following shell commands will do the trick:
$ echo %_topdir ~/rpm >> ~/.rpmmacros
$ mkdir ~/rpm/{BUILD,SOURCES,SRPMS,RPMS,SPECS}
$ mkdir ~/rpm/RPMS/{i{3,5,6}86,noarch,athlon}Then you can rebuild packages from their
.src.rpm files with a single command:
rpmbuild --rebuild package-name-version-release.src.rpm
When the rebuilding process is complete, your new RPM file(s) will be located in the appropriate architecture-specific subdirectories of your
~/rpms/RPMS/ directory.
Example: Rebuilding perl-Test-LectroTest
Here's how you would go about rebuilding
perl-Test-LectroTest version 0.2007 from its
.src.rpm file:
$ rpmbuild --rebuild perl-Test-LectroTest-0.2007-1.src.rpm
The resulting output is verbose but informative. In particular, note the "Wrote:
file" lines near the end, which tell us exactly which RPM files were created for us.
Installing perl-Test-LectroTest-0.2007-1.src.rpm
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.18218
+ umask 022
+ cd /home/thor/rpm/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cd /home/thor/rpm/BUILD
+ rm -rf Test-LectroTest-0.2007
+ /usr/bin/gzip -dc /home/thor/rpm/SOURCES/Test-LectroTest-0.2007.tar.gz
+ tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd Test-LectroTest-0.2007
++ /usr/bin/id -u
+ '[' 500 = 0 ']'
++ /usr/bin/id -u
+ '[' 500 = 0 ']'
+ /bin/chmod -Rf a+rX,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.18218
+ umask 022
+ cd /home/thor/rpm/BUILD
+ cd Test-LectroTest-0.2007
+ LANG=C
+ export LANG
+ unset DISPLAY
+ CFLAGS=-O2 -g -pipe -march=i386 -mcpu=i686
+ perl Makefile.PL PREFIX=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr
Checking if your kit is complete…
Looks good
Writing Makefile for Test::LectroTest
+ make 'OPTIMIZE=-O2 -g -pipe -march=i386 -mcpu=i686'
cp lib/Test/LectroTest/TestRunner.pm blib/lib/Test/LectroTest/TestRunner.pm
cp lib/Test/LectroTest/Tutorial.pod blib/lib/Test/LectroTest/Tutorial.pod
cp lib/Test/LectroTest/Property.pm blib/lib/Test/LectroTest/Property.pm
cp lib/Test/LectroTest/Generator.pm blib/lib/Test/LectroTest/Generator.pm
cp lib/Test/LectroTest.pm blib/lib/Test/LectroTest.pm
Manifying blib/man3/Test::LectroTest::Tutorial.3pm
Manifying blib/man3/Test::LectroTest::TestRunner.3pm
Manifying blib/man3/Test::LectroTest::Generator.3pm
Manifying blib/man3/Test::LectroTest::Property.3pm
Manifying blib/man3/Test::LectroTest.3pm
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.86392
+ umask 022
+ cd /home/thor/rpm/BUILD
+ cd Test-LectroTest-0.2007
+ LANG=C
+ export LANG
+ unset DISPLAY
+ rm -rf /var/tmp/perl-Test-LectroTest-0.2007-1-root
++ perl -V:installarchlib
+ eval 'installarchlib='''/usr/lib/perl5/5.8.3/i386-linux-thread-multi''';'
++ installarchlib=/usr/lib/perl5/5.8.3/i386-linux-thread-multi
+ mkdir -p /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib/perl5/5.8.3/i386-linux-thread-multi
+ make prefix=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr exec_prefix=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr bindir=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/bin sbindir=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/sbin sysconfdir=/var/tmp/perl-Test-LectroTest-0.2007-1-root/etc datadir=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share includedir=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/include libdir=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib libexecdir=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/libexec localstatedir=/var/tmp/perl-Test-LectroTest-0.2007-1-root/var sharedstatedir=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/com mandir=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share/man infodir=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share/info install
Installing /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib/perl5/site_perl/5.8.3/Test/LectroTest.pm
Installing /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib/perl5/site_perl/5.8.3/Test/LectroTest/TestRunner.pm
Installing /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib/perl5/site_perl/5.8.3/Test/LectroTest/Tutorial.pod
Installing /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib/perl5/site_perl/5.8.3/Test/LectroTest/Property.pm
Installing /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib/perl5/site_perl/5.8.3/Test/LectroTest/Generator.pm
Installing /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share/man/man3/Test::LectroTest::Tutorial.3pm
Installing /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share/man/man3/Test::LectroTest::TestRunner.3pm
Installing /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share/man/man3/Test::LectroTest::Generator.3pm
Installing /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share/man/man3/Test::LectroTest::Property.3pm
Installing /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share/man/man3/Test::LectroTest.3pm
Writing /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi/auto/Test/LectroTest/.packlist
Appending installation info to /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib/perl5/5.8.3/i386-linux-thread-multi/perllocal.pod
++ find /var/tmp/perl-Test-LectroTest-0.2007-1-root -type f -name perllocal.pod -o -name .packlist
+ rm -f /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib/perl5/5.8.3/i386-linux-thread-multi/perllocal.pod /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi/auto/Test/LectroTest/.packlist
+ '[' -x /usr/lib/rpm/brp-compress ']'
+ /usr/lib/rpm/brp-compress
+ find /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr -type f -print
+ sed 's@^/var/tmp/perl-Test-LectroTest-0.2007-1-root@@g'
++ cat perl-Test-LectroTest-0.2007-1-filelist
+ '[' '/usr/lib/perl5/site_perl/5.8.3/Test/LectroTest.pm
/usr/lib/perl5/site_perl/5.8.3/Test/LectroTest/TestRunner.pm
/usr/lib/perl5/site_perl/5.8.3/Test/LectroTest/Tutorial.pod
/usr/lib/perl5/site_perl/5.8.3/Test/LectroTest/Property.pm
/usr/lib/perl5/site_perl/5.8.3/Test/LectroTest/Generator.pm
/usr/share/man/man3/Test::LectroTest::Generator.3pm.gz
/usr/share/man/man3/Test::LectroTest::Property.3pm.gz
/usr/share/man/man3/Test::LectroTest.3pm.gz
/usr/share/man/man3/Test::LectroTest::Tutorial.3pm.gz
/usr/share/man/man3/Test::LectroTest::TestRunner.3pm.gzX' = X ']'
+ /usr/lib/rpm/find-debuginfo.sh /home/thor/rpm/BUILD/Test-LectroTest-0.2007
0 blocks
find: /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/lib/debug: No such file or directory
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/redhat/brp-strip-comment-note /usr/bin/strip /usr/bin/objdump
Processing files: perl-Test-LectroTest-0.2007-1
Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.44472
+ umask 022
+ cd /home/thor/rpm/BUILD
+ cd Test-LectroTest-0.2007
+ DOCDIR=/var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share/doc/perl-Test-LectroTest-0.2007
+ export DOCDIR
+ rm -rf /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share/doc/perl-Test-LectroTest-0.2007
+ /bin/mkdir -p /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share/doc/perl-Test-LectroTest-0.2007
+ cp -pr Changes README TODO /var/tmp/perl-Test-LectroTest-0.2007-1-root/usr/share/doc/perl-Test-LectroTest-0.2007
+ exit 0
Provides: perl(Test::LectroTest) perl(Test::LectroTest::Generator) perl(Test::LectroTest::Property) perl(Test::LectroTest::TestRunner) perl(Test::LectroTest::TestRunner::results) perl(Test::LectroTest::TestRunner::testcontroller)
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires: perl(:WITH_ITHREADS) perl(:WITH_LARGEFILES) perl(:WITH_THREADS) perl(Carp) perl(Class::Struct) perl(Data::Dumper) perl(Exporter) perl(Filter::Util::Call) perl(List::Util) perl(Test::LectroTest::Generator) perl(Test::LectroTest::Property) perl(Test::LectroTest::TestRunner) perl(constant) perl(strict) perl(warnings)
Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/perl-Test-LectroTest-0.2007-1-root
Wrote: /home/thor/rpm/RPMS/noarch/perl-Test-LectroTest-0.2007-1.noarch.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.44472
+ umask 022
+ cd /home/thor/rpm/BUILD
+ cd Test-LectroTest-0.2007
+ rm -rf /var/tmp/perl-Test-LectroTest-0.2007-1-root
+ exit 0
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.44472
+ umask 022
+ cd /home/thor/rpm/BUILD
+ rm -rf Test-LectroTest-0.2007
+ exit 0
When everything was said and done, one custom-built RPM file was created:
Wrote: /home/thor/rpm/RPMS/noarch/perl-Test-LectroTest-0.2007-1.noarch.rpm
We can then install this package like normal:
$ cd /home/thor/rpm/RPMS/noarch
$ sudo rpm -Uhv perl-Test-LectroTest-0.2007-1.noarch.rpm
And that's all there is to it!