Initial revision
CVS patchset: 795 CVS date: 1996/07/12 02:31:16
This commit is contained in:
parent
3d2adecc22
commit
0d58d15991
|
@ -0,0 +1,110 @@
|
|||
DEPENDENCIES
|
||||
============
|
||||
|
||||
Dependencies provide a way for a package builder to require other
|
||||
packages or capabilities to be installed before or simultaneously
|
||||
with one another. These can be used to require a python interpretor
|
||||
for a python based application for example. RPM ensures dependencies
|
||||
are satisfied whenever packages are installed, erased, or upgraded.
|
||||
|
||||
Requiring Packages
|
||||
------------------
|
||||
|
||||
To require packages, use:
|
||||
|
||||
Requires: python perl
|
||||
|
||||
in the spec file. Note that "Requires python, perl" would work as well. If you
|
||||
needed to have a very recent version of python but any version of perl,
|
||||
|
||||
Requires: python >= 1.3, perl
|
||||
|
||||
would do the trick. Again, the ',' in the line is optional. Instead of
|
||||
'>=', you may also use '<', '>', '<=', or '='.
|
||||
|
||||
RPM uses an internal algorithm to determine version number orderings which
|
||||
works correctly most of the time. For example, it will know that
|
||||
1.9a is older then 1.9b. However, it will also be later then 1.9 which
|
||||
may or may not be correct as some programmers use letters in version numbers
|
||||
to indicate beta versions.
|
||||
|
||||
To work around this, you may specify a serial number for a package like this:
|
||||
|
||||
Serial: 23
|
||||
|
||||
If a Requires: line should be comparing the given number with a serial number
|
||||
instead of a version number, you would do this:
|
||||
|
||||
Requires: somepackage =S 23
|
||||
|
||||
Virtual Packages
|
||||
----------------
|
||||
|
||||
Sometimes you need to make sure the system your package is being installed
|
||||
on has a package which provides a certain capability, even though you don't
|
||||
care what specific package provides it. For example, sendmail won't work
|
||||
properly unless a local delivery agent (lda) is present. You can ensure that
|
||||
one is installed like this:
|
||||
|
||||
Requires: lda
|
||||
|
||||
This will match either a package called lda (as mentioned above), or any
|
||||
package which contains:
|
||||
|
||||
Provides: lda
|
||||
|
||||
in its .spec file. No version numbers may be used with virtual packages.
|
||||
|
||||
Automatic Dependencies
|
||||
----------------------
|
||||
|
||||
To reduct the amount of work required by the package builder, RPM scans
|
||||
the file list of a package when it is being built. Any files in the file
|
||||
list which require shared libraries to work (as determined by ldd) cause
|
||||
that package to require the shared library.
|
||||
|
||||
For example, if your package contains /bin/vi, RPM will add dependencies
|
||||
for both libtermcap.so.2 and libc.so.5. These are treated as virtual
|
||||
packages, so no version numbers are used.
|
||||
|
||||
A similar process allows RPM to add Provides information automatically. Any
|
||||
shared library in the file list is examined for its soname (the part of
|
||||
the name which must match for two shared libraries to be considered
|
||||
equivalent) and that soname is automatically provided by the package. For
|
||||
example, the libc-5.3.12 package has provides information added for
|
||||
libm.so.5 and libc.so.5. We expect this automatic dependency generation
|
||||
to eliminate the need for most packages to use explicit Requires: lines.
|
||||
|
||||
Installing and Erasing Packages with Dependencies
|
||||
-------------------------------------------------
|
||||
|
||||
For the most part, dependencies should be transparent to the user. However,
|
||||
a few things will change.
|
||||
|
||||
First, when packages are added or upgraded, all of their dependencies
|
||||
must be satisfied. If they are not, an error message like this appears:
|
||||
|
||||
failed dependencies:
|
||||
libICE.so.6 is needed by somepackage-2.11-1
|
||||
libSM.so.6 is needed by somepackage-2.11-1
|
||||
libc.so.5 is needed by somepackage-2.11-1
|
||||
|
||||
Similarly, when packages are removed, a check is made to ensure that
|
||||
no installed packages will have their dependency conditions break due to
|
||||
the packages being removed. If you wish to turn off dependency checking for
|
||||
a particular command, use the --nodeps flag.
|
||||
|
||||
Querying with Dependencies
|
||||
--------------------------
|
||||
|
||||
Two new query information selection options are now available. The first,
|
||||
--provides, prints a list of all of the capabilities a package provides.
|
||||
The second, --requires, shows the other packages that a package requires
|
||||
to be installed, along with any version number checking.
|
||||
|
||||
There are also two new ways to search for packages. Running a query with
|
||||
--whatrequires <item> queries all of the packages that require <item>.
|
||||
Similarly, running --whatprovides <item> queries all of the packages that
|
||||
provide the <item> virtual package. Note that querying for package that
|
||||
provides "python" will not return anything, as python is a package, not
|
||||
a virtual package.
|
|
@ -0,0 +1,93 @@
|
|||
QUERY FORMATS
|
||||
=============
|
||||
|
||||
As it is impossible to please everyone with one style of query output, RPM
|
||||
allows you to specify what information should be printed during a query
|
||||
operation and how it should be formatted.
|
||||
|
||||
Tags
|
||||
----
|
||||
|
||||
All of the information a package contains, apart from signatures and the
|
||||
actual files, is in a part of the package called the header. Each piece
|
||||
of information in the header has a tag associated with it which allows
|
||||
RPM to to tell the difference between the name and description of a
|
||||
package.
|
||||
|
||||
To get a list of all of the tags your version of RPM knows about, run the
|
||||
command 'rpm --querytags'. It will print out a list like (but much longer
|
||||
then) this:
|
||||
|
||||
RPMTAG_NAME
|
||||
RPMTAG_VERSION
|
||||
RPMTAG_RELEASE
|
||||
RPMTAG_SERIAL
|
||||
RPMTAG_SUMMARY
|
||||
RPMTAG_DESCRIPTION
|
||||
RPMTAG_BUILDTIME
|
||||
RPMTAG_BUILDHOST
|
||||
RPMTAG_INSTALLTIME
|
||||
RPMTAG_SIZE
|
||||
|
||||
As all of these tags begin with RPMTAG_, you may omit it from query format
|
||||
specifiers and it will be omitted from the rest of this documentation for
|
||||
the same reason.
|
||||
|
||||
A tag can consist of one element or an array of elements. Each element can
|
||||
be a string or number only.
|
||||
|
||||
Query Formats
|
||||
-------------
|
||||
|
||||
A query format is passed to RPM after the --queryformat argument, and normally
|
||||
should be enclosed in single quotes. This query format is then used to print
|
||||
the information section of a query. This means that when both -i and
|
||||
--queryformat are used in a command, the -i is essentially ignored.
|
||||
|
||||
The query format is similar to a C style printf string, which the printf(2)
|
||||
man page provides a good introduction to. However, as RPM already knows the
|
||||
type of data that is being printed, you must omit the type specifier. In
|
||||
its place put the tag name you with to print enclosed in curly braces
|
||||
({}). For example, the following RPM command prints the names and sizes
|
||||
of all of the packages installed on a system:
|
||||
|
||||
rpm -qa --queryformat "%{NAME} %{SIZE}\n"
|
||||
|
||||
If you want to use printf formatters, they go between the % and {. To
|
||||
change the above command to print the NAME in the first 30 bytes and
|
||||
right align the size to, use:
|
||||
|
||||
rpm -qa --queryformat "%-30{NAME} %10{SIZE}\n"
|
||||
|
||||
Arrays
|
||||
------
|
||||
|
||||
RPM uses many parallel arrays internally. For example, file sizes and
|
||||
file names are kept as an array of numbers and an array of strings
|
||||
respectively, with the first element in the size array corresponding
|
||||
to the first element in the name array.
|
||||
|
||||
To iterate over a set of parallel arrays, enclose the format to be used
|
||||
to print each item in the array within square brackets ([]). For example,
|
||||
to print all of the files and their sizes in the slang-devel package
|
||||
followed by their sizes, with one file per line, use this command:
|
||||
|
||||
rpm -q --queryformat "[%-50{FILENAMES} %10{FILESIZES}\n]" slang-devel
|
||||
|
||||
Note that since the trailing newline is inside of the square brackets, one
|
||||
newline is printed for each filename.
|
||||
|
||||
Formatting Tags
|
||||
---------------
|
||||
|
||||
One of the weaknesses with query formats is that it doesn't recognize
|
||||
that the INSTALLTIME tag (for example) should be printed as a date instead
|
||||
of as a number. To compensate, you can specify one of a few different
|
||||
formats to use when printing tags by placing a colon followed the formatting
|
||||
name after the tag name. Here are some examples:
|
||||
|
||||
rpm -q --queryformat "%{NAME} %{INSTALLTIME:date}\n" fileutils
|
||||
rpm -q --queryformat "[%{FILEMODES:perms} %{FILENAMES}\n]" rpm
|
||||
rpm -q --queryformat \
|
||||
"[%{REQUIRENAME} %{REQUIREFLAGS:depflags} %{REQUIREVERSION}\n]" \
|
||||
vlock
|
|
@ -0,0 +1,36 @@
|
|||
RELOCATABLE PACKAGES
|
||||
====================
|
||||
|
||||
Relocatable packages are a way to give the user a little control
|
||||
over the installation location of a package. For example, a vendor
|
||||
may distribute their software to install in "/opt" but you'd like
|
||||
it to install in "/usr/opt". If the vendor were distributing a
|
||||
relocatable RPM package, it would be easy.
|
||||
|
||||
Building a Relocatable Package
|
||||
------------------------------
|
||||
|
||||
Not all software can be "relocatable". Before continuing you should
|
||||
think about how the program works, what files it accesses, what other
|
||||
programs access *it* (and expect it to be in a certain place), etc.
|
||||
If you determine that the location of the package doesn't matter,
|
||||
then it can probably be built as "relocatable".
|
||||
|
||||
All you need to do to build a relocatable package is put:
|
||||
|
||||
Prefix: <dir>
|
||||
|
||||
in your spec file. The "<dir>" will usually be something like "/usr",
|
||||
"/usr/local", or "/opt". Every file in your %files list must start
|
||||
with that prefix. For example, if you have "Prefix: /usr" and your
|
||||
%files list contains "/etc/foo.conf", the build will fail.
|
||||
|
||||
Installing Relocatable Packages
|
||||
-------------------------------
|
||||
|
||||
By default, RPM will install a relocatable package in the prefix
|
||||
directory listed in the spec file. You can override this on the
|
||||
RPM install command line with "--prefix <dir>". For example, if
|
||||
the package in question were going to be installed in "/opt" but
|
||||
you don't have enough disk space there (and it is a relocatable
|
||||
package), you could install it "--prefix /usr/opt".
|
|
@ -0,0 +1,70 @@
|
|||
New RPM Signatures
|
||||
==================
|
||||
|
||||
The 2.1 release of RPM had a few improvements in the area of
|
||||
digital package signatures. The usage of PGP has been cleaned
|
||||
up and extended, the signature section in the RPM file format
|
||||
has been made easily extensible with new signature types, and
|
||||
packages can have multiple signatures.
|
||||
|
||||
PGP
|
||||
---
|
||||
|
||||
RPM's previous usage of PGP was cumbersome, and only supported
|
||||
1024 bit keys. Both of these problems have been corrected.
|
||||
|
||||
Whereas previously you needed many rpmrc entries to clue in
|
||||
RPM about keyring locations and such, RPM now behaves as PGP
|
||||
users would expect. The PGPPATH environment variable can be
|
||||
used to specify keyring locations. You can also use a
|
||||
"pgp_path:" line in your rpmrc to specify a different value
|
||||
for RPM to use for PGPPATH. If neither of these are used PGP
|
||||
uses its default ($HOME/.pgp).
|
||||
|
||||
If you just want to verify packages, you do not need any entries
|
||||
in your rpmrc (except possibly "pgp_path:"). The minimal rpmrc
|
||||
entries to use PGP for package building are:
|
||||
|
||||
signature: pgp
|
||||
pgp_name: <name to uniquely select the key to use for signing>
|
||||
|
||||
Signature Creation
|
||||
------------------
|
||||
|
||||
Signature creation is the same as previous releases: just add
|
||||
a --sign to your build command line. You can sign a package
|
||||
after the package is built with:
|
||||
|
||||
rpm --resign <package>
|
||||
|
||||
Using --resign removes any previous signature in the package.
|
||||
To *add* a signature to a package, leaving all existing
|
||||
signatures use:
|
||||
|
||||
rpm --addsign <package>
|
||||
|
||||
RPM always creates MD5 and SIZE signatures when it build
|
||||
packages, which means that packages built without --sign can
|
||||
be "verified" to some extent. The MD5 signature should catch
|
||||
problems like corrupt packages, faulty downloads, etc.
|
||||
|
||||
Signature Verification
|
||||
----------------------
|
||||
|
||||
Package signature verification is the same as previous releases:
|
||||
|
||||
rpm -K <package>
|
||||
|
||||
RPM will verify evey signature in the package, which may include
|
||||
more than one PGP signature. The output indicates what types of
|
||||
signatures are being checked. If any checks fail you'll see a
|
||||
"NOT OK" message, and you should be worried.
|
||||
|
||||
If you have a package with PGP signatures, but don't have PGP
|
||||
installed, but still want to verify it as much as possible, you
|
||||
can do:
|
||||
|
||||
rpm -K --nopgp <package>
|
||||
|
||||
That will cause RPM to skip any PGP signatures, but still check
|
||||
any others (currently only MD5 and SIZE).
|
|
@ -0,0 +1,59 @@
|
|||
SPEC FILE ADDITIONS
|
||||
===================
|
||||
|
||||
A few additions have been made to the spec file format.
|
||||
|
||||
Summary and Description
|
||||
-----------------------
|
||||
|
||||
The Summary: tag should be use to give a short (50 char or so) summary
|
||||
of the package. Most package's Description: line should be changed to
|
||||
a Summary: line. The Description: tag is still supported but should
|
||||
be changed to a "%description" entry similar to %package and %files.
|
||||
At some point in the future support will be removed for "Description:".
|
||||
As an example, this spec file fragment:
|
||||
|
||||
Description: Screen drawing library
|
||||
Name: screenlib
|
||||
Version: 1.0
|
||||
|
||||
%package devel
|
||||
Description: Screen drawing library headers and static libs
|
||||
|
||||
might be changed to:
|
||||
|
||||
Summary: Screen drawing library
|
||||
Name: screenlib
|
||||
Version: 1.0
|
||||
|
||||
%description
|
||||
The screen drawing library
|
||||
is a handy development tool
|
||||
|
||||
%package devel
|
||||
Summary: Screen drawing library headers and static libs
|
||||
|
||||
%description devel
|
||||
This package contains all of the
|
||||
headers and the static libraries for
|
||||
screenlib.
|
||||
|
||||
You'll only need this package if you
|
||||
are doing development.
|
||||
|
||||
The description is free form text, but there are two things to note.
|
||||
The first regards reformating. Lines that begin with white space
|
||||
are considered "pre-formatted" and will be left alone. Adjacent
|
||||
lines without leading whitespace are considered a single paragraph
|
||||
and may be subject to formatting by glint or another RPM tool.
|
||||
|
||||
Other Tags
|
||||
----------
|
||||
|
||||
Two new tags are "URL:" and "Packager:". "URL:" is a place to put a
|
||||
URL for more information and/or documentation on the software
|
||||
contained in the package. Some future RPM package tool may make use
|
||||
of this. The Packager: tag is meant to contain the name and email
|
||||
address of the person who "maintains" the RPM package (which may be
|
||||
different from the person who actually maintains the program the
|
||||
package contains).
|
Loading…
Reference in New Issue