By thomas, Mon, 09/21/2009 - 16:50
%install is where you create directories and move the compiled files into those directories. If your package has no build section, it is where you copy the files from your sources into the appropriate directories on the final system. A word on how this actually works though, you create a sandbox directory in which all the files will live. You never install files directly on the system, this is why you should never build rpms as root. When running rpmbuild as a regular user, a bad spec file will fail when it tries to write files where it shouldn't.

Again rpm provides a great macro in this section, but you can use whatever scripts you want to move the files. The root directory for your fake filesystem is in the variable $RPM_BUILD_ROOT. Consider this a blank canvas. If you want to put a file in /usr/bin, you have to create $RPM_BUILD_ROOT/usr/bin in your %install section. In our example, we only need use the %makeinstall macro. This macro do a make install with appropriate options, including setting the prefix and installdir variables for you.

%install
%makeinstall
When we run rpmbuild this time, we should see the files being built, and then installed into $RPM_BUILD_ROOT.
[build@client11 SPECS]$ rpmbuild -bb tar.spec 
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.14568
+ umask 022
+ cd /home/build/rpmbuild/BUILD
+ cd /home/build/rpmbuild/BUILD
+ rm -rf tar-1.22
+ /usr/bin/bzip2 -dc /home/build/rpmbuild/SOURCES/tar-1.22.tar.bz2
...
+ ./configure --host=x86_64-redhat-linux-gnu --build=x86_64-redhat-linux-gnu --target=x86_64-redhat-linux-gnu --program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/usr/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib --libexecdir=/usr/libexec --localstatedir=/usr/var --sharedstatedir=/usr/com --mandir=/usr/man --infodir=/usr/info
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
...
installing zh_TW.gmo as /tmp/tar-1.22/usr/share/locale/zh_TW/LC_MESSAGES/tar.mo
if test "tar" = "gettext-tools"; then \
	  /bin/mkdir -p /tmp/tar-1.22/usr/share/gettext/po; \
	  for file in Makefile.in.in remove-potcdate.sin quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot   Makevars.template; do \
	    /usr/bin/install -c -m 644 ./$file \
			    /tmp/tar-1.22/usr/share/gettext/po/$file; \
	  done; \
	  for file in Makevars; do \
	    rm -f /tmp/tar-1.22/usr/share/gettext/po/$file; \
	  done; \
	else \
	  : ; \
	fi
make[1]: Leaving directory `/home/build/rpmbuild/BUILD/tar-1.22/po'
Making install in tests
make[1]: Entering directory `/home/build/rpmbuild/BUILD/tar-1.22/tests'
make[2]: Entering directory `/home/build/rpmbuild/BUILD/tar-1.22/tests'
make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/home/build/rpmbuild/BUILD/tar-1.22/tests'
make[1]: Leaving directory `/home/build/rpmbuild/BUILD/tar-1.22/tests'
make[1]: Entering directory `/home/build/rpmbuild/BUILD/tar-1.22'
make[2]: Entering directory `/home/build/rpmbuild/BUILD/tar-1.22'
make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/home/build/rpmbuild/BUILD/tar-1.22'
make[1]: Leaving directory `/home/build/rpmbuild/BUILD/tar-1.22'
+ exit 0
Checking for unpackaged file(s): /usr/lib/rpm/check-files /tmp/tar-1.22
error: Installed (but unpackaged) file(s) found:
   /usr/bin/tar
   /usr/info/tar.info
   /usr/info/tar.info-1
   /usr/info/tar.info-2
   /usr/libexec/rmt
   /usr/share/locale/bg/LC_MESSAGES/tar.mo
...
RPM build errors:
    Installed (but unpackaged) file(s) found:
   /usr/bin/tar
   /usr/info/tar.info
   /usr/info/tar.info-1
...
We haven't defined any files installed by this package, but our %install section created many files. We can look at them by looking in the BuildRoot directory.
[build@client11 SPECS]$ find /tmp/tar-1.22/ |head
/tmp/tar-1.22/
/tmp/tar-1.22/usr
/tmp/tar-1.22/usr/sbin
/tmp/tar-1.22/usr/share
/tmp/tar-1.22/usr/share/locale
/tmp/tar-1.22/usr/share/locale/pl
/tmp/tar-1.22/usr/share/locale/pl/LC_MESSAGES
/tmp/tar-1.22/usr/share/locale/pl/LC_MESSAGES/tar.mo
/tmp/tar-1.22/usr/share/locale/ky
/tmp/tar-1.22/usr/share/locale/ky/LC_MESSAGES
We need to tell rpm what we want done with these files, we'll do that next.