| Home Up |
Date: 13 Nov 2002
This HOWTO is aimed at helping people who want to produce software packages which should integrate well in the Mandrake Linux distribution of GNU/Linux. In particular, it will stress in what way the packages are slightly different from the packages anyone would write for other rpm-based distributions. This document should be useful to MandrakeSoft developers, but also to external people. The Mandrake Linux distribution of GNU/Linux is produced and published by MandrakeSoft, Inc. 1. ForewordIt is assumed in this document that the reader is "linux-ready". He already knows the basic commands, directory structure, and has already used rpm at least for installing packages. This document is constructed as a step by step recipe to obtain a rpm package that can integrate well in the Mandrake Linux distribution of GNU/Linux, from either a previous source rpm or a tar source. If you haven't done it yet, you should read the cooker web page, which explains the development process of Mandrake Linux. RPM roughly means three things:
The program rpm is, from the user's point of view, a powerful package manager. It acts as a "conductor" for any action on rpm packages. Among other things, it can:
From the programmer's point of view, the program rpm is a packager which encapsulates in a single rpm file all the information needed to install a program on a given platform. It is important to distinguish from the beginning the difference between source (.src.rpm) and binary (.<archtype>.rpm) packages. The first one contains (yes you guessed) the complete source tree from the original programmer, plus all the stuff the packager added in order to configure, compile and install the program. It generally consists of a spec file (the file used to tell rpm which operations perform in order to create the package) along with patches, if needed. The second one contains the compiled binary, and all the files (documentation, config files, icons,...) that will be installed on the target system. It also contains the procedure used to put the files at their correct location, and the actions to perform in order to have the program operational. 2. Install the software2.1. The basicsAlthough RPM was originally designed to work with RedHat Linux, it also works on other rpm-based distributions: Mandrake Linux, Suse, Caldera, etc ; rpm is already installed on these systems. You can get the vanilla rpm distribution from RedHat here: ftp://ftp.rpm.org/pub/rpm/dist/ The binary rpm you will build for Mandrake Linux may not work across the distributions, although Mandrake makes everything possible to stay compatible with Red Hat. 2.2. Building for Mandrake LinuxBuilding packages for Cooker (e.g. the development version of Mandrake Linux) is always submitted to small patches and enhancements on the rpm program in use. Open any Mandrake-Cooker mirror and get:
3. Preliminary tasks3.1. Create required foldersTo build packages, rpm needs a special tree in your home directory. This tree can be created with the following command: mkdir -p ~/rpm/{BUILD,RPMS/$ARCH,RPMS/noarch,SOURCES,SRPMS,SPECS,tmp}. Replace $ARPH with the architecture(s) you plan to build packages for, basically this can be i586 but also sparc/alpha/ppc.
Make sure that the tree is of the form :
3.2. Add configuration filesIn order to build packages for Mandrake Linux, you will need to add two configuration files in your home directory:
which you will have to edit to fit your name and directory. Warning, don't set %optflags, as one is already provided for you in the system-wide /usr/lib/rpm/rpmrc. In the same way, don't set %packager, so that rebuilding other people's packages won't put yourself in the Packager: field of the RPM, possibly in a public release which would direct bug reports to you instead of maintainer. Your rpm program is then setup to build packages. 3.3. Subscribe to mailing listsMandrake's lists (Consult Mailing list pages on Mandrake Linux pages):
4. Building a RPM
This graph represents the different steps one has to follow to build a rpm package. Circled numbers are references to sections of this howto. 4.1. From an existing source RPMThis is generally the case for the packages which are already included in the distribution. The latest rpm files from cooker are available on many mirrors which list is available at http://www.linux-mandrake.com/en/cookerdevel.php3 . Under the ftp hierarchy, you will find:
When you find the source rpm you want to modify for Mandrake Linux, just issue rpm -ivh mypackage.src.rpm; it'll install all source files into your RPM directory. For example:
We see that rpm installed in our RPM tree the source file ktron-1.0.1.tar.bz2 and the spec file. It is all we need, in that case, to modify the spec file and then rebuild the package. It is important to note that each package maintained at MandrakeSoft is stored on a cvs system. This allows every state of a package to being recorded by the system, so that the developer may consult the archive to check previous modifications and eventually come back to an older release version. Each spec file is stored on a module called SPECS/<package> or contrib-SPECS/<package>. For details on how to access cvs system, consult Mandrake Linux CVS pages 4.2. From raw sourcesYou found an interesting program at freshmeat or AppWatch or sourceforgewhich warns you when the tea is ready. And you want it available to all our Mandrake Linux's english tea drinkers. Download it and place it in the SOURCES directory. 4.3. Preliminary checks
4.4. Inside the spec fileHere we are. This is the important section of this document. The spec file contains all the information needed by rpm to:
The fact that these two types of information are messed up into one single file may be quite confusing for the beginner. Actually, this is due to the source tar tree, which contains already this information. As installation procedure is extracted from the installation process generally run by make install into the source tree, both parts are tightly linked.
This part is not intended to explain you in details all the features of a spec file. The book Maximum RPM (see Section 7) explains it deeply. All we are going to do here is quickly check all of the features used into one standard example Mandrake spec file. This is an example from the cooker repository. You may also consider our template spec file to begin your from scratch. As you build more and more RPMs,you will find that there are some options that we have not told you about. RPM is extremely extensible, so, finding out all of those is left as an exercise to the reader. It is always good practice to open up some spec files to take a look at them and see how they work. you can get a list of specs and patches here.
Let's then analyze in details each line of this file. Be careful, a % at the beginning of a line may tell different things :
4.4.1. Header section
These three lines define constants that may be used in many following sections of the spec file, named %{name}, %{version} and %{release}. Then, we can fill up some information fields for rpm :
The name of the package as used in package's name and package database on the user's machine. Note that the "%{name}" is a reference to the previous define.
This is the moment to explain how is formed the name of a package. It is important to always respect this standard in order to make your work understandable to others. There are also some tags that you might want to know about, but are not in the example spec file. There are some that you might encounter. It is not expected that you remember all of this if you just started building rpms, but after some time, this list makes good reference!
The name is generally chosen to be the name of the main binary of the package, though with adequate reasons this you can get away with another name. The version is the number from the unpatched sources. It is the version number in the name of the original archive file: name-version.tar.gz. The release is a number followed by mdk (stands for "Mandrake"; this is absolutely mandatory) which is incremented at each new build of the package. This may be due to a patch applied to the sources, a modification to the spec file, the addition of an icon, etc.
This line is a one-liner of the package description.
This line tells rpm what source file to use for building this package. Note that the filename is preceded by a complete URL (which is optional) pointing to the site where the original source is available; rpm will remove the url, keep the filename only, and search in the SOURCES directory. Although we say that the complete URL is optional, it is highly recommended as people will know where to find new sources should they take a liking to upgrading the source and do a recompilation. When there are more than one source file, use other lines with Source1: ..., then Source2: ..., etc.
Two reasons for this optional tag:
Note that the patch file must be placed into the SOURCES directory; as for the sources, there can be several patches, they will be named Patch1, Patch2, etc.
This line (optional but highly recommended) points to the home page of the program.
This is to tell rpm in which part of the general package tree to place this package. This feature is used with package managers front-end such as rpmdrake or kpackage. The complete group structure to use, which is different from the one RedHat uses, is shown in Appendix C. It is mandatory to follow it, otherwise your package will mess with the other ones, in the package tree selection of Mandrake Linux installer, or in package manager front-ends.
This line is very important and cannot be omitted. It tells rpm that to install the program, it will have to use a special root directory (a fake "/") onto the compiling machine. There are two reasons for that:
This tag (superseding Copyright) defines the license chosen by the copyright holder that will apply to the software being packed. In most cases it is GPL. See Appendix E for complete valid licenses list. Here is a list of other licenses.at FSF. If you find that a package has a very similar license to a particlar license listed, but is not *quite* that license, you can put a suffix -like (see above.) for example, BSD-like.
This line was added because one of the programs included in the package is a python script. It then needs python to be executed. You can put optional minimum (or equal) version, for example: Requires: python >= 1.5.1
This is a quite special tag inside the header of the spec file, because it is of a whole text made of various lines and paragraphs if needed. It contains the full description of the software being installed in order to help the user to decide whether he wants to install the package or not.
4.4.2. Prep section
Into this section, is written the first script being executed by rpm. Its role is to:
It may be then followed by any command wanted by the packager to get the sources into a ready-to-build state.
This is the first of the commands being executed into the %prep section, it cleans up a possible previous install directory.
This is a buit-in script macro which
It defaultly extracts the first source; you have to use parameters for any other sources, in our example -a 1 tells that we want also the extraction of the source number 1.
The macro responsible for applying the patch to the sources; its parameter "-p<num>" is passed to the patch program. Imagine if you had another patch declared Patch1: .. in the header section, you would add another line: %patch1 -p1. Adding a -b .your_suffix would also be nice, as you can let others know what your patch does, or who did the patch. For example, if Fred did the patch, then he could do %patch -p1 -b .fred, or if Barney did the patch then it could be %patch -p1 -b .barney 4.4.3. Build section
This section will contain the script responsible for the actual build of the software. It consists of the commands being issued when building a package from an untarred source tree.
This is the line used for configuring autoconf'ed sources. %configure issues a ./configure with many add-ons such as export CFLAGS="$RPM_OPT_FLAGS" before the configure, and options such as i586-mandrake-linux --prefix=/usr --datadir=/usr/share etc. Sometimes these arguments are not supported by the configure script. In such case, you have to discover the reason, and issue the ./configure with appropriate parameters. Give the target platform to the configure call, if supported, with %{_target_platform}; of course, specification of an architecture must be avoided in specfiles; on ix86, this will expand to i586-mandrake-linux, as shown in the example above. Note that you will need the libtool package to use %configure with packages building shared libraries.
This is a simple macro that basically performs a make with appropriate multiprocessor parameter -j<num>. For sources using xmkmf, you should replace the next make with:
For other packages, in many (but not all) cases a simple make will do. 4.4.4. Install section
This section will contain the script responsible for actually install the package into the simulation installation dir.: $RPM_BUILD_ROOT. It'll contain all commands necessaries to have the software ready to run on the user's system.
This line finally installs the software into the simulation installation directory for autoconf'ed sources. This macro will expand to "make install" with many options in order to install in the simulation directory $RPM_BUILD_ROOT, e.g. prefix=$RPM_BUILD_ROOT/usr bindir=$RPM_BUILD_ROOT/usr/bin etc. In some cases the configure script will be partially broken and you may need to lurk in the Makefiles to guess the additional parameters to have it install correctly. One of the most common ones is that sometimes you have to use make DESTDIR=$RPM_BUILD_ROOT install. To save both disk space and download time, Mandrake uses bzip2 to compress man- and info-pages. However, this aspect is handled directly by the Mandrake custom rpm program. At this point of the spec file, older packages contained some lines like find $RPM_BUILD_ROOT/usr/man -type f -exec bzip2 -9f {} \; It is the same for old strip $RPM_BUILD_ROOT/usr/bin/* || : lines: they have to be removed All this stuff is to prepare the files to be ready to be packed.
This section is meant to clean the build directory tree, $RPM_BUILD_ROOT.
This is where the job is done. 4.4.5. Files section
This section consists of a list of files that will be picked from our simulation directory tree to be packed into the package. See the fine manual for the different options not being used in that simple example. The file list must be written by hand in the spec file. It may be constructed by listing all files created by rpm in the build directory tree. In order to do that, issue a rpm -bi mypackage.spec in order to stop the building process just after the simulated install. Then, look in the simulated installation directory, ~/rpm/tmp/gif2png-buildroot in our case, to see which files you want to put in your package (most of the time, you will put them all). Note that you should never use find to build a list of files to include but explicitely list all files (this'll show up bugs in new versions). The only exceptions is for locales for which you should use %find_lang %{name} in %install section and replace %files by %files -f %{name}.lang (see Appendix B). Note about directory structure: The files being installed by your package "should" follow the FHS recommendations at http://www.pathname.com/fhs
This tag defines the attributes to be applied to each file being copied to the user's system. The four arguments given means:
The special tag %doc designates files being part of the documentation of the package. The files so-called will be placed in /usr/doc/gif2png-2.0.1/. This directory will be also automatically created. Files specified by %doc are relative to your untarred source directory in BUILD.
Here also it is recommended to list each man or info file separately.
As you can see, you have macros for every kind of path you need. Here are the most useful ones (look at /usr/lib/rpm/macros for everything) : %{_prefix}, %{_bindir}, %{_sbindir}, %{_datadir}, %{_libdir}, %{_sysconfdir}, %{_mandir}, %{_infodir}. For games, use %{_gamesbindir} and %{_gamesdatadir}. 4.4.6. Changelog section
This section is to keep track of different changes made to the package. Every new release build of the package must correspond to a paragraph in this section as well as an increase in the release number (if not in the version number). The structure of these paragraphs have to be respected as following:
Then follow one line per modification applied to the package beginning by a -. These are examples:
4.5. The buildOur spec file is finally complete. Take a long breathe, sit down and type rpm -ba mypackage.spec
There are then two possibilities for the last line of your process:
You are in the second case? Congratulation you passed the test, you are not an alien. Good luck so long, have a look to rpm building options (man rpm) to debug your work, look at other persons' specfiles, etc.. There is a very clean way to build package: use rpm -bs --rmspec --rmsource (in order to remove anything from the original build) and then do a rpm --rebuild. 5. Testing a RPMYou should also check the BugZilla pages for information about this subject. 5.1. Basic testsThe first steps to perform are:
5.2. Linting the packageThen, you have to use the "rpmlint" program, which will test various things on the package. (it comes from the rpmlint package) Type rpmlint mypackage.<archtype>.rpm and a report on the specified package will be issued. 5.3. Install testOn a machine - different from the compilation one if possible - have an upgrade or an install, and then check:
Perfectionists should try various different installs and uninstalls to check whether all expected features are well implemented, for example without required packages. If all of these tests passed successfully, you are almost done, and should go to the last step of the process: submitting packages. 6. Send your workQuite an easy step! Just upload your source rpm (mypackage.src.rpm) to ftp://ftp.linux-mandrake.com/incoming/ Then send an e-mail to lenny in order to warn him. Additionally, you may want to CC it to the "Cooker" list. If it is just a small change to an existing spec file, or if you have just added a patch, usually sending in the spec difference file and any additional patch file will do. 7. Something's going wrong?Well, seems that you've been reading this HowTo, this is a good beginning. If you couldn't find your answer right here, you should try in order: 7.1. For general RPM matters:
7.2. For specific Mandrake RPM matters:Drop a line to Mandrake's Quality Assurance, <qa@mandrakesoft.com>. If you feel that the information you found may be useful for others, in the scope of that document, feel free to submit your proposal to the maintainer of this document. 8. AdvancedHere are several things not necessary to build a first RPM. You should become familiar with the preceding stuff, then come back here and read this section. 8.1. Menu systemAs of the 7.1 version of Mandrake Linux, we now use the Menu System written by Debian. This excellent software provides a Window-Manager independant way to register an application to the system. Most of the time, this registration will become effective in the Start button or alike of your favourite Window Manager. It works like this: each package includes a file in directory /usr/lib/menu/. Most of the time the filename will be the name of the package. In this file, it will have one line per menu-entry, like this:
It is suggested that you put the menu file within the spec, instead of creating a separate source for it. To do that you can :
Whenever root runs update-menus, it will check all new or changed menufiles in /etc/menu and /usr/lib/menu, and run the installation scripts Window Managers should provide in /etc/menu-methods on them. Use our special macros for that:
You will have to provide the three icons described earlier. One popular way of doing it is to declare the three icons, bzipped, with Source: tags, and install them in appropriate directories in the %install section:
8.2. Library policyIn order to enjoy better upgrades, it is important to keep old major library versions in the system so that programs which use them still work. Libraries in /usr/lib, /lib and /usr/X11R6/lib must be separately packaged, in library-only package, named with the name of the main library concatenated with the major of the library. These packages should not contain any binaries, they should be separately packaged. The goal is to be able to install libfoo1 and libfoo2 on the same system. In the first time it is fundamental that the sources rpm keep the same name without any major number, so that the CVS repository only contains one branch for each package. When the distribution must contain two versions of the same library, for example qt1 and qt2, sources rpms will be separated so that we can include the two of them in the distribution. And since then the two branches will be independently maintained. Here's a generic example; the following case happens when the library comes with binaries, config files, or anything else that won't fit in the main library package (where only libraries go) nor in the devel package (where headers and devel libraries go (e.g. *.so and *.a)).
In the opposite case to this example, when replacing an existing package, for example foobar, with a new one called libfoobar3, in the case foobar will not exist any more because there are no binaries, and no config files, libfoobar3 must have an obsolete tag on foobar. This is often the case for "simpler" libraries.
Ok we described the default policy for library packages, however some special cases can happen and must be handled using the brain. Remember to always check the soname of the libraries ("objdump -x libfoo.so.1 | grep SONAME"), because some sonames include library version number, for example libfoo-1.2.so.4, in this case the package should be named libfoo1.2_4-1.2.4-3mdk. Packages ending with a number should be handle with a "_" before the major, for example libfoo23_4-1.2-3mdk (in this case the soname would be libfoo23.so.4). It is not necessary to split each library in separate packages, if a package contains several library, the name would be build with the main library of the package. If there are problems keeping libraries in the same package, the package should be splitted. It is important to supply some Provides. First reason: concerning the devel package, most of the time the client app will only want to put libfoo-devel in the BuildRequires, without any version information. Second reason, for compatibility with other RPM-based systems, it's important to provide also original names, qualifying versions. Please refer to following skeleton examples. It's important to understand that putting a Provides without the version information, makes it impossible for later client RPM's to put a version information on dependencies, e.g. "Provides: foo-devel" is NOT enough, please use "Provides: foo-devel = 1.2.4-3mdk". Here's an example of specfile for a package with no binary and config files, so only lib* binary packages are needed.
8.3. Deeper inside the specfiles...Here are some more tags that you might see, some that you will see often, some not.
There is also some interesting macros to note. Say you wanted to do something, but not on every platform. You can do this within RPM with the conditional macros:
The explanation: only apply the patch if the architecture is alpha, sparc, or ppc. It is not limited to using here, for example you can include this in your %files section if you so wish. Ok. So you know that you can use rpm -ba to build a package. But you have more to play around with:
8.4. Releasing pre-versionsSometimes, program naming schemes are good, but rpm is lost. For example, with Proftpd, Pre-releases are named with the version followed by the suffix pre and then the pre version number, like so: 1.2.0pre5. Because of string comparisons, rpm thinks that 1.2.0pre5 is newer than 1.2.0 (we know that this is not true). To permit upgrades to newer packages, we must help rpm to know which packages are newer than others. We could use the Epoch: tag (superseding the Serial: tag) but this is dirty. You have to use another naming convention, putting the "pre" stuff in the release tag; in our example you will call the package "1.2.0-0.pre5.1mdk". Then, when 1.2.0 comes out, you'll release "1.2.0-1mdk", and this package will be able to upgrade the pre5. 8.5. update-alternativesThe program update-alternatives, originally written by Debian, is here to provide default system-wide commands through the use of symbolic links. An example will help to understand the point:
When a new program wants to provide the same functionality (say, vim-minimal) it would register to the update-alternatives system, and potentially become the real program called under vim. The choice is either made automatically (under that scenario, the program with highest 'priority' will be used, see below) or manually. Here's how emacs-nox and emacs-X11 register and unregister themselves to the update-alternatives system:
The syntax with the --install command is pretty self-explanatory: you need to provide the link, the name, the full path of the real binary, and the priority. Default behaviour of the resulting system is to follow the priority (e.g. the 'automatic' mode). 8.6. Signing your packagesParanoid people sign their packages. This is not really necessary, but signing makes it more secure. Before Mandrake 7.2, you needed to download the crypto packages from a FTP site because of laws prohibiting the distribution of crypto packages. This is no longer true. The GNU Privacy Guard (GPG) is already included in the standard distribution. We recommend that if you wish to sign you use GPG to sign but RPM supports PGP as well. First you will need to install PGP/GPG (depending on your liking). Now read the documentation. As with most *nix applications these come with good documentation. Generate a key, and then extract the ASCII key to a plain text file. To sign your RPM packages while building, you can use the --sign argument. To add one to an existing RPM, do rpm --addsign file.rpm. To resign an existing one, use the --resign option. But alas, when you type this you get nothing, because you still haven't set up your ~/.rpmmacros yet. Now, add 2 lines to your ~/.rpmmacros. Add %signature pgp and %_pgp_name Your_Signature_Name. Replace pgp with gpg, if you choose to use that one instead. 8.7. More on the files sectionSometimes setting the permissions of the installed files for RPM is not always %defattr(-,root,root). You can set individual permissions for files, with the %attr() macro. %attr follows a similar format to %defattr, except that %attr is put in front of the filename. To tell RPM that the file specified is a configuration file, place a %config at the front of the file. That way, RPM will upgrade the file, but save a copy of the old one (with the extension .rpmsave). Most of the time, it is NOT the desired behaviour, because you shall lose (temporarily) your precious configuration in exchange of the default one which is obviously far poorer than what you need. To address this issue, use %config(noreplace): it indicates that the file in the package should be installed with extension .rpmnew if there is already a modified file with the same name on the installed machine. The %config(missingok) indicates that the file need not exist on the installed machine. The %config(missingok) is frequently used for files like /etc/rc.d/rc2.d/S55named where the (non-)existence of the symlink is part of the configuration in %post, and the file may need to be removed when this package is removed. This file is not required to exist at either install or uninstall time. The %ghost tag on a file indicates that this file is not to be included in the package. It is typically used when the attributes of the file are important while the contents is not (e.g. a log file). 8.8. SubpackagesTo split off into a subpackage you can specify %package foo where foo is the suffix that will be added to the main package name. For example, if your main package name is fred, and you have a %package alice line , then your subpackage will be called fred-alice. You will need to add in the corresponding name in the %description and %files, for example, %description alice, %files alice. If you don't wish to have RPM inherit the name of your main package as the prefix of the subpackage, you can specify the -n argument to %package, like so: %package -n mysubpackage. You will need to add -n for all other relevant RPM entries as well such as %description, %files and the RPM scripts. One such application of this would be the library policy mentioned earlier. 8.9. What to avoidThis subsection is for experienced RPM builders -- to be sure that they do not miss the point.
8.10. Locale specific packagesSome packages are only meant to be used together with special localization(s). For example, cttex, a Thai word separator program, will be useless when you don't use your system in Thai. For such packages, you need to put an explicit Requires: on the corresponding locale package (here, locales-th). With these information, the installer will be able to change the rates of the packages according to selected internalization configuration, so that the necessary packages get installed. 8.11. Easy handling of differences between two RPM'sHere is how Chmouel handles finely the differences between two RPM's.
example :
8.12. To become a Jedi, use Emacs you have toIn a nutshell, Emacs can automate much of the work, with appropriate configuration file. A good start is Chmouel's, which is too big even to fit in appendices (> 1000 lines). You can find it on the web here: ftp://ftp.mandrakesoft.com/chmou/pub/rpm-spec-mode.el Once installed, in addition to nice syntax highlighting, you'll increase the release tag with C-c r, add a new changelog entry (with your name, email address, correct version and release tag) with C-c e; you will even visit the bzipped patches (granted you have jka-compr and ffap) with minimal pain! And much more... To use ffap/jka-compr in spec-file you can tell to the user to set this in ~/.emacs:
A. Of Pre- and Post-installation scriptsA.1. BasicsThe RPM package is in fact a bit more than a simple archive containing files to be expanded in specific directories of the host client system. The system offers to the programmer a great feature: pre- and post-installation scripts. They allow the packager to write a piece of code which will be executed on the client machine while installing or erasing the package. These scripts are made of any sh valid command. There are four of them: There are certain caveats about these scripts which you should take into account. Number one, each must fit inside a 8192 buffer, and number two, they should be non-interactive. Anything which requires manual input from the user is wrong, as this will break non-interactive RPM installation procedures.
The scope of such scripts may be very large, and they have to be designed with much care not to harm the host system. One have to remember that these scripts will be run as root... They correspond to the tasks a system administrator would have to accomplish when installing a new program on a system. For example:
A.2. Dealing with upgradesThe fact that a package may be upgraded, and not simply installed or removed, makes the think a little bit tougher... The problem is that the %postun script of the update is run after the %post of the old version. So all %post stuff is lost... The solution is brought by a parameter passed to each of the four scripts. That parameter is the number of packages with the same name that will normaly be present after total installation/upgrade. Table A-1. Value of the parameter passed to pre and post scripts
This will allow the programmer to distinguish different attitudes of his scripts depending on the operation: install or upgrade.
A single test is therefore enough, to call the right action at the right time. B. More macrosWhen building RPM's for Mandrake Linux, you have more macros to simplify the specfile.
C. Mandrake Linux GroupsHere is the list of the groups to use for building a RPM package for Mandrake Linux. It is now different from the old one invented and used by RedHat, because it appeared (to our side) that it was no more suitable for today's distribution. To give some examples, the list indicates that following are correct groups: System/Libraries, System/Fonts/Console, ..
D. Mandrake Linux Menu StructureHere's the menu structure. It is mandatory to use it.
E. Mandrake Linux Valid Licensesrpmlint will complain if you use a License: different from one or many of the following licenses:
F. Cool programs to check outrpmbuilder is an application that can help you generate a generic spec file from a .tar.gz source. There is an official Mandrake Linux patch available. Although it generates good specs, it is recommended that you re-check before uploading, as after all, the spec is generated automatically. rpmlint is really mandatory in order to avoid the common errors in building rpm's. It is mainly designed to work with Mandrake Linux -mdk packages, but it should work for any generic RPM package. rpmstats will print out statistics about installed packages, helping you locating packages very often used, and packages rarely used. rpm-rebuilder is meant to assist you if you're willing to rebuild a whole distro. Last updated: Tue, 12 Nov 2002 23:12:03 -0500 |