Penguin
Diff: HowToRPMHOWTO
EditPageHistoryDiffInfoLikePages

Differences between current version and predecessor to the previous major change of HowToRPMHOWTO.

Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History

Newer page: version 3 Last edited on Tuesday, October 26, 2004 4:43:41 pm by AristotlePagaltzis
Older page: version 2 Last edited on Friday, June 7, 2002 1:07:23 am by perry Revert
@@ -1,1345 +1 @@
-RPM HOWTO  
-!!!RPM HOWTO  
-!!RPM at Idle  
-!Donnie !BarnesRed Hat, Inc.  
-  
- djb@redhat.com  
-  
-  
-  
-  
-Copyright (c) 1999 by Red Hat, Inc.  
-  
-  
-__Revision History__Revision V3.03 November 1999----; __Table of Contents__; Introduction; Overview; General Information: ; Acquiring RPM; RPM Requirements; Using RPM; Now what can I really do with RPM?; Building RPMs: ; The Spec File; The Header; Prep; Build; Install; Cleaning your system; Optional pre and post Install/Uninstall Scripts; Files; Changelog; Building It: ; The Source Directory Tree; Test Building; Generating the File List; Building the Package with RPM; Testing It; What to do with your new RPMs; What Now?; Multi-architectural RPM Building: ; Sample spec File; Optflags; Macros; Excluding Architectures from Packages; Finishing Up  
-!!!Introduction  
-  
- RPM is the ''R''PM ''P''ackage  
-''M''anager. It is an open packaging system available  
-for anyone to use. It allows users to take source code for new software  
-and package it into source and binary form such that binaries can be  
-easily installed and tracked and source can be rebuilt easily. It also  
-maintains a database of all packages and their files that can be used  
-for verifying packages and querying for information about files and/or  
-packages.  
-  
-  
-  
-  
- Red Hat, Inc. encourages other distribution vendors to take the time  
-to look at RPM and use it for their own distributions. RPM is quite  
-flexible and easy to use, though it provides the base for a very  
-extensive system. It is also completely open and available, though we  
-would appreciate bug reports and fixes. Permission is granted to use  
-and distribute RPM royalty free under the GPL.  
-  
-  
-  
-  
- More complete documentation is available on RPM in the book by Ed Bailey,  
-''Maximum RPM''. That book is available for download or  
-purchase at www.redhat.com.  
-  
-  
-----  
-!!!Overview  
-  
- First, let me state some of the philosophy behind RPM. One design goal  
-was to allow the use of "pristine" sources. With RPP (our former  
-packaging system of which ''none'' of RPM is derived),  
-our source packages were the "hacked" sources that we built from.  
-  
-  
-  
-  
- Theoretically, one could install a source RPP and then  
-''make'' it with no problems. But the sources were not  
-the original ones, and there was no reference as to what changes we had to  
-make to get it to build. One had to download the pristine sources  
-separately. With RPM, you have the pristine sources along with patches  
-that we used to compile from. We see this as a big advantage. Why?  
-Several reasons. For one, if a new version of a program comes out, you  
-don't necessarily have to start from scratch to get it to compile under  
-RHL. You can look at the patch to see what you ''might''  
-need to do. All the compile-in defaults are easily visible this way.  
-  
-  
-  
-  
- RPM is also designed to have powerful querying options. You can do  
-searches through your entire database for packages or just certain files.  
-You can also easily find out what package a file belongs to and where it  
-came from. The RPM files themselves are compressed archives, but you can  
-query individual packages easily and ''quickly'' because  
-of a custom binary header added to the package with everything you could  
-possibly need to know contained in uncompressed form. This allows for  
-''fast'' querying.  
-  
-  
-  
-  
- Another powerful feature is the ability to verify packages. If you are  
-worried that you deleted an important file for some package, just verify  
-it. You will be notified of any anomalies. At that point, you can  
-reinstall the package if necessary. Any config files that you had are  
-preserved as well.  
-  
-  
-  
-  
- We would like to thank the folks from the BOGUS distribution for many of  
-their ideas and concepts that are included in RPM. While RPM was  
-completely written by Red Hat, Inc., its operation is based on code  
-written by BOGUS (PM and PMS).  
-  
-  
-----  
-!!!General Information  
-!!Acquiring RPM  
-  
- The best way to get RPM is to install Red Hat Linux. If you don't want  
-to do that, you can still get and use RPM. It can be acquired from  
-ftp.redhat.com.  
-  
-  
-----  
-!!RPM Requirements  
-  
- RPM itself should build on basically any Unix-like system. It has been  
-built and used on Tru64 Unix, AIX, Solaris, SunOS, and basically all  
-flavors of Linux.  
-  
-  
-  
-  
- To build RPMs from source, you also need everything normally required to  
-build a package, like ''gcc'',  
-''make'', etc.  
-  
-  
-----  
-!!!Using RPM  
-  
- In its simplest form, RPM can be used to install packages:  
-  
-  
-  
-rpm -i foobar-1.-1.i386.rpm  
-  
-  
- The next simplest command is to uninstall a package:  
-  
-  
-  
-rpm -e foobar  
-  
-  
- One of the more complex but ''highly'' useful commands  
-allows you to install packages via FTP. If you are connected to the net  
-and want to install a new package, all you need to do is specify the file  
-with a valid URL, like so:  
-  
-  
-  
-rpm -i ftp://ftp.redhat.com/pub/redhat/rh-2.-beta/RPMS/foobar-1.-1.i386.rpm  
-  
-  
- Please note, that RPM will now query and/or install via FTP.  
-  
-  
-  
-  
- While these are simple commands, rpm can be used in a multitude  
-of ways. To see which options are available in your version of  
-RPM, type:  
-  
-  
-  
-rpm --help  
-  
-  
- You can find more details on what those options do in the RPM man  
-page, found by typing:  
-  
-  
-  
-man rpm  
-----  
-!!!Now what can I really do with RPM?  
-  
- RPM is a very useful tool and, as you can see, has several options.  
-The best way to make sense of them is to look at some examples. I covered  
-simple install/uninstall above, so here are some more examples:  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- Let's say you delete some files by accident, but you aren't sure  
-what you deleted. If you want to verify your entire system and see what  
-might be missing, you would do:  
-  
-  
-  
-rpm -Va  
-  
-*  
-*  
-  
- Let's say you run across a file that you don't recognize. To find  
-out which package owns it, you would do:  
-  
-  
-  
-rpm -qf /usr/X11R6/bin/xjewel  
-  
-  
- The output would be sometime like:  
-  
-  
-  
-xjewel-1.6-1  
-  
-*  
-*  
-  
- You find a new koules RPM, but you don't know what it is. To find out  
-some information on it, do:  
-  
-  
-  
-rpm -qpi koules-1.2-2.i386.rpm  
-  
-  
- The output would be:  
-  
-  
-  
-Name : koules Distribution: Red Hat Linux Colgate  
-Version : 1.2 Vendor: Red Hat Software  
-Release : 2 Build Date: Mon Sep 02 11:59:12 1996  
-Install date: (none) Build Host: porky.redhat.com  
-Group : Games Source RPM: koules-1.2-2.src.rpm  
-Size : 614939  
-Summary : SVGAlib action game with multiplayer, network, and sound support  
-Description :  
-This arcade-style game is novel in conception and excellent in execution.  
-No shooting, no blood, no guts, no gore. The play is simple, but you  
-still must develop skill to play. This version uses SVGAlib to  
-run on a graphics console.  
-  
-*  
-*  
-  
- Now you want to see what files the koules RPM installs. You would  
-do:  
-  
-  
-  
-rpm -qpl koules-1.2-2.i386.rpm  
-  
-  
- The output is:  
-  
-  
-  
-/usr/doc/koules  
-/usr/doc/koules/ANNOUNCE  
-/usr/doc/koules/BUGS  
-/usr/doc/koules/COMPILE.OS2  
-/usr/doc/koules/COPYING  
-/usr/doc/koules/Card  
-/usr/doc/koules/!ChangeLog  
-/usr/doc/koules/INSTALLATION  
-/usr/doc/koules/Icon.xpm  
-/usr/doc/koules/Icon2.xpm  
-/usr/doc/koules/Koules.FAQ  
-/usr/doc/koules/Koules.xpm  
-/usr/doc/koules/README  
-/usr/doc/koules/TODO  
-/usr/games/koules  
-/usr/games/koules.svga  
-/usr/games/koules.tcl  
-/usr/man/man6/koules.svga.6  
-  
-*  
-  
- These are just several examples. More creative ones can be thought of  
-really easy once you are familiar with RPM.  
-  
-  
-----  
-!!!Building RPMs  
-  
- Building RPMs is fairly easy to do, especially if you can get the  
-software you are trying to package to build on its own. We assume  
-here that you know how to build software from source. If you don't  
-you probably shouldn't be starting with this document.  
-  
-  
-  
-  
- The basic procedure to build an RPM is as follows:  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- Get the source code you are building the RPM for to build  
-on your system.  
-  
-  
-  
-*  
-*  
-  
- Make a patch of any changes you had to make to the sources to get  
-them to build properly.  
-  
-  
-  
-*  
-*  
-  
- Make a spec file for the package.  
-  
-  
-  
-*  
-*  
-  
- Make sure everything is in its proper place.  
-  
-  
-  
-*  
-*  
-  
- Build the package using RPM.  
-  
-  
-  
-*  
-  
- Under normal operation, RPM builds both binary and source packages.  
-  
-  
-----  
-!!The Spec File  
-  
- We'll begin with discussion of the spec file. Spec files are required  
-to build a package. The spec file is a description of the software  
-along with instructions on how to build it and a file list for all the  
-binaries that get installed.  
-  
-  
-  
-  
- You'll want to name your spec file according to a standard convention.  
-It should be the package name-dash-version number-dash-release  
-number-dot-spec. This will ensure that if you install multiple source  
-RPMs for different versions of the same package that at least the spec  
-files remain intact.  
-  
-  
-  
-  
- Here is a small spec file (eject-2..2-1.spec):  
-  
-  
-  
-Summary: A program that ejects removable media using software control.  
-Name: eject  
-Version: 2..2  
-Release: 3  
-Copyright: GPL  
-Group: System Environment/Base  
-Source: http://metalab.unc.edu/pub/Linux/utils/disk-management/eject-2..2.tar.gz  
-Patch: eject-2..2-buildroot.patch  
-!BuildRoot: /var/tmp/%{name}-buildroot  
-%description  
-The eject program allows the user to eject removable media  
-(typically CD-ROMs, floppy disks or Iomega Jaz or Zip disks)  
-using software control. Eject can also control some multi-  
-disk CD changers and even some devices' auto-eject features.  
-Install eject if you'd like to eject removable media using  
-software control.  
-%prep  
-%setup -q  
-%patch -p1 -b .buildroot  
-%build  
-make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"  
-%install  
-rm -rf $RPM_BUILD_ROOT  
-mkdir -p $RPM_BUILD_ROOT/usr/bin  
-mkdir -p $RPM_BUILD_ROOT/usr/man/man1  
-install -s -m 755 eject $RPM_BUILD_ROOT/usr/bin/eject  
-install -m 644 eject.1 $RPM_BUILD_ROOT/usr/man/man1/eject.1  
-%clean  
-rm -rf $RPM_BUILD_ROOT  
-%files  
-%defattr(-,root,root)  
-%doc README TODO COPYING !ChangeLog  
-/usr/bin/eject  
-/usr/man/man1/eject.1  
-%changelog  
-* Sun Mar 21 1999 Cristian Gafton `gafton@redhat.comb  
-- auto rebuild in the new build environment (release 3)  
-* Wed Feb 24 1999 Preston Brown `pbrown@redhat.comb  
-- Injected new description and group.  
- [[ Some changelog entries trimmed for brevity. -Editor. ]  
-----  
-!!The Header  
-  
- The header has some standard fields in it that you need to fill in. There  
-are a few caveats as well. The fields must be filled in as follows:  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- ''Summary:'' This is a one line description of the  
-package.  
-  
-  
-  
-*  
-*  
-  
- ''Name:'' This must be the name string from the rpm  
-filename you plan to use.  
-  
-  
-  
-*  
-*  
-  
- ''Version:'' This must be the version string from  
-the rpm filename you plan to use.  
-  
-  
-  
-*  
-*  
-  
- ''Release:'' This is the release number for a  
-package of the same version (ie. if we make a package and find it to  
-be slightly broken and need to make it again, the next package would  
-be release number 2).  
-  
-  
-  
-*  
-*  
-  
- ''Copyright:'' This line tells how a package is  
-copyrighted. You should use something like GPL, BSD, MIT, public  
-domain, distributable, or commercial.  
-  
-  
-  
-*  
-*  
-  
- ''Group:'' This is a group that the package belongs  
-to in a higher level package tool or the Red Hat installer.  
-  
-  
-  
-*  
-*  
-  
- ''Source:'' This line points at the HOME location  
-of the pristine source file. It is used if you ever want to get the  
-source again or check for newer versions. Caveat: The filename in  
-this line MUST match the filename you have on your own system  
-(ie. don't download the source file and change its name). You can  
-also specify more than one source file using lines like:  
-  
-  
-  
-Source0: blah-.tar.gz  
-Source1: blah-1.tar.gz  
-Source2: fooblah.tar.gz  
-  
-  
- These files would go in the SOURCES  
-directory. (The directory structure is discussed in a later section,  
-"The Source Directory Tree".)  
-  
-  
-  
-*  
-*  
-  
- ''Patch:'' This is the place you can find the patch  
-if you need to download it again. Caveat: The filename here must  
-match the one you use when you make YOUR patch. You may also want  
-to note that you can have multiple patch files much as you can have  
-multiple sources. ] You would have something like:  
-  
-  
-  
-Patch0: blah-.patch  
-Patch1: blah-1.patch  
-Patch2: fooblah.patch  
-  
-  
- These files would go in the SOURCES  
-directory.  
-  
-  
-  
-*  
-*  
-  
- ''Group:'' This line is used to tell high level  
-installation programs (such as Red Hat's  
-gnorpm) where to place this particular  
-program in its hierarchical structure. You can find the latest  
-description in /usr/doc/rpm*/GROUPS. The  
-group tree currently looks something like this:  
-  
-  
-  
-Amusements/Games  
-Amusements/Graphics  
-Applications/Archiving  
-Applications/Communications  
-Applications/Databases  
-Applications/Editors  
-Applications/Emulators  
-Applications/Engineering  
-Applications/File  
-Applications/Internet  
-Applications/Multimedia  
-Applications/Productivity  
-Applications/Publishing  
-Applications/System  
-Applications/Text  
-Development/Debuggers  
-Development/Languages  
-Development/Libraries  
-Development/System  
-Development/Tools  
-Documentation  
-System Environment/Base  
-System Environment/Daemons  
-System Environment/Kernel  
-System Environment/Libraries  
-System Environment/Shells  
-User Interface/Desktops  
-User Interface/X  
-User Interface/X Hardware Support  
-  
-*  
-*  
-  
- ''!BuildRoot:'' This line allows you to specify a  
-directory as the "root" for building and installing the new  
-package. You can use this to help test your package before having  
-it installed on your machine.  
-  
-  
-  
-*  
-*  
-  
- ''%description'' It's not really a header item, but  
-should be described with the rest of the header. You need one  
-description tag per package and/or subpackage. This is a multi-line  
-field that should be used to give a comprehensive description of the  
-package.  
-  
-  
-  
-*----  
-!!Prep  
-  
- This is the second section in the spec file. It is used to get the  
-sources ready to build. Here you need to do anything necessary to get  
-the sources patched and setup like they need to be setup to do a  
-__make__.  
-  
-  
-  
-  
- One thing to note: Each of these sections is really just a place to  
-execute shell scripts. You could simply make an  
-sh script and put it after the  
-''%prep'' tag to unpack and patch your sources.  
-We have made macros to aid in this, however.  
-  
-  
-  
-  
- The first of these macros is the ''%setup''  
-macro. In its simplest form (no command line options), it simply  
-unpacks the sources and __cd__'s into the source  
-directory. It also takes the following options:  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- ''-n name'' will set the name of  
-the build directory to the listed ''name''. The  
-default is ''$NAME-$VERSION''. Other  
-possibilities include ''$NAME'',  
-''${NAME}${VERSION}'', or whatever  
-the main tar file uses. (Please note that these "$"  
-variables are ''not'' real variables available  
-within the spec file. They are really just used here in place of a  
-sample name. You need to use the real name and version in your  
-package, not a variable.)  
-  
-  
-  
-*  
-*  
-  
- ''-c'' will create and cd to the  
-named directory ''before'' doing the untar.  
-  
-  
-  
-*  
-*  
-  
- ''-b #'' will untar Source#  
-''before'' __cd__'ing into the  
-directory (and this makes no sense with ''-c'' so don't do it). This is only useful  
-with multiple source files.  
-  
-  
-  
-*  
-*  
-  
- ''-a #'' will untar Source#  
-''after'' cd'ing into the directory.  
-  
-  
-  
-*  
-*  
-  
- ''-T'' This option overrides the  
-default action of untarring the Source and requires a ''-b '' or ''-a  
-'' to get the main source file untarred. You need this  
-when there are secondary sources.  
-  
-  
-  
-*  
-*  
-  
- ''-D'' Do ''not''  
-delete the directory before unpacking. This is only useful where  
-you have more than one setup macro. It should  
-''only'' be used in setup macros  
-''after'' the first one (but never in the first  
-one).  
-  
-  
-  
-*  
-  
- The next of the available macros is the ''%patch''  
-macro. This macro helps automate the process of applying patches to the  
-sources. It takes several options, listed below:  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- ''#'' will apply Patch# as the patch file.  
-  
-  
-  
-*  
-*  
-  
- ''-p #'' specifies the number  
-of directories to strip for the patch(1) command.  
-  
-  
-  
-*  
-*  
-  
- ''-P'' The default action is to  
-apply __Patch__ (or __Patch0__). This  
-flag inhibits the default action and will require a '''' to get the main source file untarred.  
-This option is useful in a second (or later)  
-__%patch__ macro that required a different  
-number than the first macro.  
-  
-  
-  
-*  
-*  
-  
- You can also do __%patch#__ instead  
-of doing the real command: __%patch # -P__  
-  
-  
-  
-*  
-*  
-  
- ''-b extension'' will save  
-originals as filename.extension before  
-patching.  
-  
-  
-  
-*  
-  
- That should be all the macros you need. After you have those right, you  
-can also do any other setup you need to do via  
-sh type scripting. Anything you include up  
-until the ''%build'' macro (discussed in the  
-next section) is executed via sh. Look at the  
-example above for the types of things you might want to do here.  
-  
-  
-----  
-!!Build  
-  
- There aren't really any macros for this section. You should just put  
-any commands here that you would need to use to build the software once  
-you had untarred the source, patched it, and cd'ed into the directory.  
-This is just another set of commands passed to  
-sh, so any legal sh  
-commands can go here (including comments).  
-  
-  
-  
-  
-__Important: __ Your current working directory is reset in each of these sections to  
-the toplevel of the source directory, so keep that in mind. You can  
-__cd__ into subdirectories if necessary.  
-  
-  
-  
-  
- The variable RPM_OPT_FLAGS is set using values in  
-/usr/lib/rpm/rpmrc. Look there to make sure  
-you are using values appropriate for your system (in most cases you  
-are). Or simply don't use this variable in your spec file. It is  
-optional.  
-  
-  
-----  
-!!Install  
-  
- There aren't really any macros here, either. You basically just want to  
-put whatever commands here that are necessary to install. If you have  
-__make install__ available to you in the package you are  
-building, put that here. If not, you can either patch the makefile for  
-a __make install__ and just do a __make  
-install__ here, or you can hand install them here with  
-sh commands. You can consider your current  
-directory to be the toplevel of the source directory.  
-  
-  
-  
-  
- The variable RPM_BUILD_ROOT is available to tell you  
-the path set as the ''Buildroot:'' in the header.  
-Using build roots are optional but are highly recommended because they  
-keep you from cluttering your system with software that isn't in your  
-RPM database (building an RPM doesn't touch your database...you must go  
-install the binary RPM you just built to do that).  
-  
-  
-----  
-!!Cleaning your system  
-  
- It's a good idea to always make sure there is a clean build root before  
-building a package a second time on a system. The  
-''%clean'' macro will help with that. Simply  
-put the proper commands there to blow away a former build root. Anal,  
-err, careful folks may want to test that  
-RPM_BUILD_ROOT wasn't set to  
-/ before doing something this volatile.  
-  
-  
-----  
-!!Optional pre and post Install/Uninstall Scripts  
-  
- You can put scripts in that get run before and after the installation  
-and uninstallation of binary packages. A main reason for this is to do  
-things like run __ldconfig__ after installing or  
-removing packages that contain shared libraries. The macros for each of  
-the scripts is as follows:  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- %pre is the macro to do pre-install  
-scripts.  
-  
-  
-  
-*  
-*  
-  
- %post is the macro to do  
-post-install scripts.  
-  
-  
-  
-*  
-*  
-  
- %preun is the macro to do  
-pre-uninstall scripts.  
-  
-  
-  
-*  
-*  
-  
- %postun is the macro to do  
-post-uninstall scripts.  
-  
-  
-  
-*  
-  
- The contents of these sections should just be any  
-sh style script, though you do  
-''not'' need the  
-#!/bin/sh.  
-  
-  
-----  
-!!Files  
-  
- This is the section where you ''must'' list the files  
-for the binary package. RPM has no way to know what binaries get  
-installed as a result of __make install__. There is  
-''NO'' way to do this. Some have suggested doing a  
-__find__ before and after the package install. With a  
-multiuser system, this is unacceptable as other files may be created  
-during a package building process that have nothing to do with the  
-package itself.  
-  
-  
-  
-  
- There are some macros available to do some special things as well. They  
-are listed and described here:  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- %doc is used to mark documentation  
-in the source package that you want installed in a binary install.  
-The documents will be installed in  
-/usr/doc/$NAME-$VERSION-$RELEASE.  
-You can list multiple documents on the command line with this macro,  
-or you can list them all separately using a macro for each of them.  
-  
-  
-  
-*  
-*  
-  
- %config is used to mark  
-configuration files in a package. This includes files like  
-sendmail.cf, passwd, etc. If you later uninstall a package  
-containing config files, any unchanged files will be removed and any  
-changed files will get moved to their old name with a  
-.rpmsave appended to the filename. You can  
-list multiple files with this macro as well.  
-  
-  
-  
-*  
-*  
-  
- %dir marks a single directory in a  
-file list to be included as being owned by a package. By default,  
-if you list a directory name ''WITHOUT'' a  
-%dir macro,  
-''EVERYTHING'' in that directory is included in the  
-file list and later installed as part of that package.  
-  
-  
-  
-*  
-*  
-  
- %defattr allows you to set default  
-attributes for files listed after the defattr declaration. The  
-attributes are listed in the form ''(mode, owner,  
-group)'' where the mode is the octal number representing  
-the bit pattern for the new permissions (like  
-__chmod__ would use), owner is the username of the  
-owner, and group is the group you would like assigned. You may  
-leave any field to the installed default by simply placing a  
-''-'' in its place, as was done in the mode field  
-for the example package.  
-  
-  
-  
-*  
-*  
-  
- %files -f `filenameb will  
-allow you to list your files in some arbitrary file within the build  
-directory of the sources. This is nice in cases where you have a  
-package that can build it's own filelist. You then just include  
-that filelist here and you don't have to specifically list the  
-files.  
-  
-  
-  
-*  
-  
- The ''biggest caveat'' in the file list is listing  
-directories. If you list /usr/bin by accident,  
-your binary package will contain ''every'' file in  
-/usr/bin on your system.  
-  
-  
-----  
-!!Changelog  
-  
- This is a log of what changes occurred when the package is updated. If  
-you are modifying an existing RPM it is a good idea to list what changes  
-you made here.  
-  
-  
-  
-  
- The format is simple. Start each new entry with a line with a *  
-followed by the date, your name, and your email address. The date  
-should appear in the same format that is output by:  
-  
-  
-  
- date +"%a %b %d %Y"  
-  
-  
- The rest of the section is a free text field, but should be organized  
-in some coherent manner.  
-  
-  
-----  
-!!!Building It  
-!!The Source Directory Tree  
-  
- The first thing you need is a properly configured build tree. This is  
-configurable using the /etc/rpmrc file. Most  
-people will just use /usr/src.  
-  
-  
-  
-  
- You may need to create the following directories to make a build  
-tree:  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- BUILD is the directory where all building  
-occurs by RPM. You don't have to do your test building anywhere in  
-particular, but this is where RPM will do it's building.  
-  
-  
-  
-*  
-*  
-  
- SOURCES is the directory where you should  
-put your original source tar files and your patches. This is where  
-RPM will look by default.  
-  
-  
-  
-*  
-*  
-  
- SPECS is the directory where all spec files  
-should go.  
-  
-  
-  
-*  
-*  
-  
- RPMS is where RPM will put all binary RPMs  
-when built.  
-  
-  
-  
-*  
-*  
-  
- SRPMS is where all source RPMs will be put.  
-  
-  
-  
-*----  
-!!Test Building  
-  
- The first thing you'll probably want to to is get the source to build  
-cleanly without using RPM. To do this, unpack the sources, and change  
-the directory name to $NAME.orig. Then unpack the source again.  
-Use this source to build from. Go into the source directory and follow  
-the instructions to build it. If you have to edit things, you'll need a  
-patch. Once you get it to build, clean the source directory. Make sure  
-and remove any files that get made from a __configure__  
-script. Then __cd__ back out of the source directory to  
-its parent. Then you'll do something like:  
-  
-  
-  
-diff -uNr dirname.orig dirname b ../SOURCES/dirname-linux.patch  
-  
-  
- This will create a patch for you that you can use in your spec file.  
-Note that the "linux" that you see in the patch name is just an  
-identifier. You might want to use something more descriptive like  
-"config" or "bugs" to describe ''why'' you had to  
-make a patch. It's also a good idea to look at the patch file you are  
-creating before using it to make sure no binaries were included by  
-accident.  
-  
-  
-----  
-!!Generating the File List  
-  
- Now that you have source that will build and you know how to do it,  
-build it and install it. Look at the output of the install sequence and  
-build your file list from that to use in the spec file. We usually  
-build the spec file in parallel with all of these steps. You can create  
-the initial one and fill in the easy parts, and then fill in the other  
-steps as you go.  
-  
-  
-----  
-!!Building the Package with RPM  
-  
- Once you have a spec file, you are ready to try and build your  
-package. The most useful way to do it is with a command like the  
-following:  
-  
-  
-  
-rpm -ba foobar-1..spec  
-  
-  
- There are other options useful with the ''-b'' switch as well:  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- ''p'' means just run the  
-prep section of the specfile.  
-  
-  
-  
-*  
-*  
-  
- ''l'' is a list check that does  
-some checks on %files.  
-  
-  
-  
-*  
-*  
-  
- ''c'' do a prep and compile. This  
-is useful when you are unsure of whether your source will build at  
-all. It seems useless because you might want to just keep playing  
-with the source itself until it builds and then start using RPM, but  
-once you become accustomed to using RPM you will find instances when  
-you will use it.  
-  
-  
-  
-*  
-*  
-  
- ''i''do a prep, compile, and  
-install.  
-  
-  
-  
-*  
-*  
-  
- ''b'' prep, compile, install, and  
-build a binary package only.  
-  
-  
-  
-*  
-*  
-  
- ''a''build it all (both source and  
-binary packages).  
-  
-  
-  
-*  
-  
- There are several modifiers to the ''-b'' switch. They are as follows:  
-  
-  
-  
-  
-  
-  
-  
-*  
-  
- ''--short-circuit'' will skip  
-straight to a specified stage (can only be used with c and i).  
-  
-  
-  
-*  
-*  
-  
- ''--clean'' removes the build tree  
-when done.  
-  
-  
-  
-*  
-*  
-  
- ''--keep-temps'' will keep all the  
-temp files and scripts that were made in /tmp. You can actually see  
-what files were created in /tmp using the ''-v'' option.  
-  
-  
-  
-*  
-*  
-  
- ''--test'' does not execute any  
-real stages, but does keep-temp.  
-  
-  
-  
-*----  
-!!Testing It  
-  
- Once you have a source and binary rpm for your package, you need to test  
-it. The easiest and best way is to use a totally different machine from  
-the one you are building on to test. After all, you've just done a lot  
-of __make install__'s on your own machine, so it should  
-be installed fairly well.  
-  
-  
-  
-  
- You can do an __rpm -e packagename__ on the package to  
-test, but that can be deceiving because in building the package, you did  
-a __make install__. If you left something out of your  
-file list, it will not get uninstalled. You'll then reinstall the  
-binary package and your system will be complete again, but your rpm  
-still isn't. Make sure and keep in mind that just because you do a  
-__rpm -ba package__, most people installing your package  
-will just be doing the __rpm -i package__. Make sure you  
-don't do anything in the build or  
-install sections that will need to be done when  
-the binaries are installed by themselves.  
-  
-  
-----  
-!!What to do with your new RPMs  
-  
- Once you've made your own RPM of something (assuming its something that  
-hasn't already been RPM'ed), you can contribute your work to others  
-(also assuming you RPM'ed something freely distributable). To do so,  
-you'll want to upload it to ftp.redhat.com.  
-  
-  
-----  
-!!What Now?  
-  
- Please see the above sections on Testing and What to do with new RPMs.  
-We want all the RPMs available we can get, and we want them to be good  
-RPMs. Please take the time to test them well, and then take the time to  
-upload them for everyone's benefit. Also, ''please''  
-make sure you are only uploading ''freely available  
-software''. Commercial software and shareware should  
-''not'' be uploaded unless they have a copyright  
-expressly stating that this is allowed. This includes ssh, pgp, etc.  
-  
-  
-----  
-!!!Multi-architectural RPM Building  
-  
- RPM can now be used to build packages for the Intel i386, the Digital  
-Alpha running Linux, and the Sparc (and others). There are several  
-features that make building packages on all platforms easy. The first of  
-these is the "optflags" directive in the  
-/etc/rpmrc. It can be used to set flags used  
-when building software to architecture specific values. Another feature  
-is the "arch" macros in the spec file. They can be used to do different  
-things depending on the architecture you are building on. Another feature  
-is the "Exclude" directive in the header.  
-  
-  
-----  
-!!Sample spec File  
-  
- The following is part of the spec file for the "fileutils" package.  
-It is setup to build on both the Alpha and the Intel.  
-  
-  
-  
-Summary: GNU File Utilities  
-Name: fileutils  
-Version: 3.16  
-Release: 1  
-Copyright: GPL  
-Group: Utilities/File  
-Source0: prep.ai.mit.edu:/pub/gnu/fileutils-3.16.tar.gz  
-Source1: DIR_COLORS  
-Patch: fileutils-3.16-mktime.patch  
-%description  
-These are the GNU file management utilities. It includes programs  
-to copy, move, list, etc, files.  
-The ls program in this package now incorporates color ls!  
-%prep  
-%setup  
-%ifarch alpha  
-%patch -p1  
-autoconf  
-%endif  
-%build  
-configure --prefix=/usr --exec-prefix=/  
-make CFLAGS="$RPM_OPT_FLAGS" LDFLAGS=-s  
-%install  
-rm -f /usr/info/fileutils*  
-make install  
-gzip -9nf /usr/info/fileutils*  
-.  
-.  
-.  
-----  
-!!Optflags  
-  
- In this example, you see how the "optflags" directive is used from the  
-/etc/rpmrc. Depending on which architecture  
-you are building on, the proper value is given to  
-RPM_OPT_FLAGS. You must patch the Makefile for your  
-package to use this variable in place of the normal directives you might  
-use (like ''-m486'' and ''-O2''). You can get a better feel for what  
-needs to be done by installing this source package and then unpacking  
-the source and examine the Makefile. Then look at the patch for the  
-Makefile and see what changes must be made.  
-  
-  
-----  
-!!Macros  
-  
- The %ifarch macro is very important to all of  
-this. Most times you will need to make a patch or two that is specific  
-to one architecture only. In this case, RPM will allow you to apply  
-that patch to just one architecture only.  
-  
-  
-  
-  
- In the above example, fileutils has a patch for 64 bit machines.  
-Obviously, this should only be applied on the Alpha at the moment. So,  
-we add an %ifarch macro around the 64 bit patch  
-like so:  
-  
-  
-  
-%ifarch axp  
-%patch1 -p1  
-%endif  
-  
-  
- This will insure that the patch is not applied on any architecture  
-except the alpha.  
-  
-  
-----  
-!!Excluding Architectures from Packages  
-  
- So that you can maintain source RPMs in one directory for all platforms,  
-we have implemented the ability to "exclude" packages from being built  
-on certain architectures. This is so you can still do things like  
-  
-  
-  
-rpm --rebuild /usr/src/SRPMS/*.rpm  
-  
-  
- and have the right packages build. If you haven't yet ported an application  
-to a certain platform, all you have to do is add a line like:  
-  
-  
-  
-!ExcludeArch: alpha  
-  
-  
- to the header of the spec file of the source package. Then rebuild the  
-package on the platform that it does build on. You'll then have a  
-source package that builds on an Intel and can easily be skipped on an  
-Alpha.  
-  
-  
-----  
-!!Finishing Up  
-  
- Using RPM to make multi-architectural packages is usually easier to do  
-than getting the package itself to build both places. As more of the  
-hard packages get built this is getting much easier, however. As  
-always, the best help when you get stuck building an RPM is to look a  
-similar source package
+Describe [HowToRPMHOWTO ] here.