summaryrefslogtreecommitdiff
path: root/doc/manual/buildroot
diff options
context:
space:
mode:
Diffstat (limited to 'doc/manual/buildroot')
-rw-r--r--doc/manual/buildroot122
1 files changed, 122 insertions, 0 deletions
diff --git a/doc/manual/buildroot b/doc/manual/buildroot
new file mode 100644
index 0000000..3bf0b05
--- /dev/null
+++ b/doc/manual/buildroot
@@ -0,0 +1,122 @@
+/*! \page buildroot Using a build root
+
+The build root is very similar to Root: (which is now legacy).
+By using Buildroot: in your spec file you are indicating
+that your package can be built (installed into and packaged from)
+a user-definable directory. This helps package building by normal
+users.
+
+\section buildroot_specfile The Spec File
+
+Simply use
+\verbatim
+ Buildroot: <dir>
+\endverbatim
+
+in your spec file. The actual buildroot used by RPM during the
+build will be available to you (and your %prep, %build, and %install
+sections) as the environment variable RPM_BUILD_ROOT. You must
+make sure that the files for the package are installed into the
+proper buildroot. As with Root:, the files listed in the %files
+section should *not* contain the buildroot. For example, the
+following hypothetical spec file:
+
+\verbatim
+ Name: foo
+ ...
+ Root: /tmp
+
+ %prep
+ ...
+
+ %build
+ ...
+
+ %install
+ install -m755 fooprog /tmp/usr/bin/fooprog
+
+ %files
+ /usr/bin/fooprog
+\endverbatim
+
+would be changed to:
+
+\verbatim
+ Name: foo
+ ...
+ BuildRoot: /tmp
+
+ %prep
+ ...
+
+ %build
+ ...
+
+ %install
+ install -m755 fooprog $RPM_BUILD_ROOT/usr/bin/fooprog
+
+ %files
+ /usr/bin/fooprog
+\endverbatim
+
+\section buildroot_building Building With a Build Root
+
+RPM will use the buildroot listed in the spec file as the default
+buildroot. There are two ways to override this. First, you can
+have "buildroot: <dir>" in your rpmrc. Second, you can override
+the default, and any entry in an rpmrc by using "--buildroot <dir>"
+on the RPM command line.
+
+\section buildroot_caveats Caveats using Build Roots
+
+Care should be taken when using buildroots that the install directory
+is owned by the correct package. For example the file
+
+\verbatim
+ /usr/lib/perl5/site_perl/MD5.pm
+\endverbatim
+
+is installed by the package perl-MD5. If we were to use a buildroot
+and specified
+
+\verbatim
+ %files
+ /usr/lib/perl5/site_perl
+\endverbatim
+
+we would end up with the directory /usr/lib/perl5/site_perl being
+owned by the library package. This directory is in fact used by ALL
+perl libraries and should be owned by the package for perl not any of
+its libraries. It is important that the %files command specifies all
+the known directories explicitly. So this would be preferable:
+
+\verbatim
+ /usr/lib/perl5/site_perl/*
+\endverbatim
+
+Since we only want the files and directories that the package perl-MD5
+installed into /usr/lib/perl5/site_perl/ to be owned by the package.
+The directory /usr/lib/perl5/site_perl/ is created when perl is
+installed.
+
+If we were to use the bad %files line shown above, then when the MD5
+package is removed, RPM will try to remove each of the perl-MD5 files and
+then try to remove the dir itself. If there's still files in the
+site_perl directory (e.g. from other packages) then the Unix rmdir(2)
+will fail and you will get a non-zero return code from RPM. If the
+rmdir succeeds then you will no longer have a site_perl directory on
+your machine even though this directory was created when Perl was
+installed.
+
+The other common problem is that two packages could install two files
+with the the same name into the same directory. This would lead to
+other collision problems when removing the file. Care should be taken
+by the packager to ensure that all packages install unique files.
+Explicit use of %files can help make the packager aware of potential
+problems before they happen. When you try to install a package which
+contains file names already used by other packages on the system then
+RPM will warn you of the problem and give a fatal error. This error can
+be overridden with --force and the installed file will be replaced by the
+new file and when the new package is removed the file will be removed as well.
+
+*/