| |
| Information to packagers of XZ Utils |
| ==================================== |
| |
| 0. Preface |
| 1. Package naming |
| 2. Package description |
| 3. License |
| 4. configure options |
| 4.1. Static vs. dynamic linking of liblzma |
| 4.2. Optimizing xzdec and lzmadec |
| 5. Additional documentation |
| 6. Extra files |
| 7. Installing XZ Utils and LZMA Utils in parallel |
| 8. Example |
| |
| |
| 0. Preface |
| ---------- |
| |
| This document is meant for people who create and maintain XZ Utils |
| packages for operating system distributions. The focus is on GNU/Linux |
| systems, but most things apply to other systems too. |
| |
| While the standard "configure && make DESTDIR=$PKG install" should |
| give a pretty good package, there are some details which packagers |
| may want to tweak. |
| |
| Packagers should also read the INSTALL file. |
| |
| |
| 1. Package naming |
| ----------------- |
| |
| The preferred name for the XZ Utils package is "xz", because that's |
| the name of the upstream tarball. Naturally you may have good reasons |
| to use some other name; I won't get angry about it. ;-) It's just nice |
| to be able to point people to the correct package name without asking |
| what distro they have. |
| |
| If your distro policy is to split things into small pieces, here is |
| one suggestion: |
| |
| xz xz, xzdec, scripts (xzdiff, xzgrep, etc.), docs |
| xz-lzma lzma, unlzma, lzcat, lzgrep etc. symlinks and |
| lzmadec binary for compatibility with LZMA Utils |
| liblzma liblzma.so.* |
| liblzma-devel liblzma.so, liblzma.a, API headers |
| |
| |
| 2. Package description |
| ---------------------- |
| |
| Here is a suggestion which you may use as the package description. |
| If you can use only one-line description, pick only the first line. |
| Naturally, feel free to use some other description if you find it |
| better, and maybe send it to me too. |
| |
| Library and command line tools for XZ and LZMA compressed files |
| |
| XZ Utils provide a general purpose data compression library |
| and command line tools. The native file format is the .xz |
| format, but also the legacy .lzma format is supported. The .xz |
| format supports multiple compression algorithms, of which LZMA2 |
| is currently the primary algorithm. With typical files, XZ Utils |
| create about 30 % smaller files than gzip. |
| |
| If you are splitting XZ Utils into multiple packages, here are some |
| suggestions for package descriptions: |
| |
| xz: |
| |
| Command line tools for XZ and LZMA compressed files |
| |
| This package includes the xz compression tool and other command |
| line tools from XZ Utils. xz has command line syntax similar to |
| that of gzip. The native file format is the .xz format, but also |
| the legacy .lzma format is supported. The .xz format supports |
| multiple compression algorithms, of which LZMA2 is currently the |
| primary algorithm. With typical files, XZ Utils create about 30 % |
| smaller files than gzip. |
| |
| Note that this package doesn't include the files needed for |
| LZMA Utils 4.32.x compatibility. Install also the xz-lzma |
| package to make XZ Utils emulate LZMA Utils 4.32.x. |
| |
| xz-lzma: |
| |
| LZMA Utils emulation with XZ Utils |
| |
| This package includes executables and symlinks to make |
| XZ Utils emulate lzma, unlzma, lzcat, and other command |
| line tools found from the legacy LZMA Utils 4.32.x package. |
| |
| liblzma: |
| |
| Library for XZ and LZMA compressed files |
| |
| liblzma is a general purpose data compression library with |
| an API similar to that of zlib. liblzma supports multiple |
| algorithms, of which LZMA2 is currently the primary algorithm. |
| The native file format is .xz, but also the legacy .lzma |
| format and raw streams (no headers at all) are supported. |
| |
| This package includes the shared library. |
| |
| liblzma-devel: |
| |
| Library for XZ and LZMA compressed files |
| |
| This package includes the API headers, static library, and |
| other development files related to liblzma. |
| |
| |
| 3. License |
| ---------- |
| |
| If the package manager supports a license field, you probably should |
| put GPLv2+ there (GNU GPL v2 or later). The interesting parts of |
| XZ Utils are in the public domain, but some less important files |
| ending up into the binary package are under GPLv2+. So it is simplest |
| to just say GPLv2+ if you cannot specify "public domain and GPLv2+". |
| |
| If you split XZ Utils into multiple packages as described earlier |
| in this file, liblzma and liblzma-dev packages will contain only |
| public domain code (from XZ Utils at least; compiler or linker may |
| add some third-party code, which may be copyrighted). |
| |
| |
| 4. configure options |
| -------------------- |
| |
| Unless you are building a package for a distribution that is meant |
| only for embedded systems, don't use the following configure options: |
| |
| --enable-debug |
| --enable-encoders (*) |
| --enable-decoders |
| --enable-match-finders |
| --enable-checks |
| --enable-small (*) |
| --disable-threads (*) |
| |
| (*) These are OK when building xzdec and lzmadec as explained later. |
| |
| You may use --enable-werror but be careful with it since it may break |
| the build due to some useless warning when the build environment |
| changes (like CPU architecture or compiler version). |
| |
| |
| 4.1. Static vs. dynamic linking of liblzma |
| |
| The default is to link the most important command line tools against |
| static liblzma, and the less important tools against shared liblzma. |
| This can be changed by passing --enable-dynamic to configure, or by |
| not building static libraries at all by passing --disable-static |
| to configure. It is mildly recommended that you use the default, but |
| the configure options make it easy to do otherwise if the distro policy |
| so requires. |
| |
| On 32-bit x86, linking against static liblzma can give a minor |
| speed improvement. Static libraries on x86 are usually compiled as |
| position-dependent code (non-PIC) and shared libraries are built as |
| position-independent code (PIC). PIC wastes one register, which can |
| make the code slightly slower compared to a non-PIC version. (Note |
| that this doesn't apply to x86-64.) |
| |
| Linking against static liblzma avoids a dependency on liblzma shared |
| library, and makes it slightly easier to copy the command line tools |
| between systems (e.g. quick 'n' dirty emergency recovery of some |
| files). It also allows putting the command line tools to /bin while |
| leaving liblzma to /usr/lib (assuming that your distribution uses |
| such a file system hierarchy), if no other file in /bin would require |
| liblzma. |
| |
| If you don't want to distribute static libraries but you still |
| want to link the command line tools against static liblzma, it is |
| probably easiest to build both static and shared liblzma, but after |
| "make DESTDIR=$PKG install" remove liblzma.a and modify liblzma.la |
| to not contain a reference to liblzma.a. |
| |
| |
| 4.2. Optimizing xzdec and lzmadec |
| |
| xzdec and lzmadec are intended to be relatively small instead of |
| optimizing for the best speed. Thus, it is a good idea to build |
| xzdec and lzmadec separately: |
| |
| - Only decoder code is needed, so you can speed up the build |
| slightly by passing --disable-encoders to configure. This |
| shouldn't affect the final size of the executables though, |
| because the linker is able to omit the encoder code anyway. |
| |
| - xzdec and lzmadec will never use multithreading capabilities of |
| liblzma. You can avoid dependency on libpthread by passing |
| --disable-threads to configure. |
| |
| - There are and will be no translated messages for xzdec and |
| lzmadec, so it is fine to pass also --disable-nls to configure. |
| |
| - To select somewhat size-optimized variant of some things in |
| liblzma, pass --enable-small to configure. |
| |
| - Tell the compiler to optimize for size instead of speed. |
| E.g. with GCC, put -Os into CFLAGS. |
| |
| |
| 5. Additional documentation |
| --------------------------- |
| |
| "make install" copies some additional documentation to $docdir |
| (--docdir in configure). These a copy of the GNU GPL v2, which can |
| be replaced with a symlink if your distro ships with shared copies |
| of the common license texts. |
| |
| |
| 6. Extra files |
| -------------- |
| |
| The "extra" directory contains some small extra tools or other files. |
| The exact set of extra files can vary between XZ Utils releases. The |
| extra files have only limited use or they are too dangerous to be |
| put directly to $bindir (7z2lzma.sh is a good example, since it can |
| silently create corrupt output if certain conditions are not met). |
| |
| If you feel like it, you may copy the extra directory under the doc |
| directory (e.g. /usr/share/doc/xz/extra). Maybe some people will find |
| them useful. However, most people needing these tools probably are |
| able to find them from the source package too. |
| |
| The "debug" directory contains some tools that are useful only when |
| hacking on XZ Utils. Don't package these tools. |
| |
| |
| 7. Installing XZ Utils and LZMA Utils in parallel |
| ------------------------------------------------- |
| |
| XZ Utils and LZMA Utils 4.32.x can be installed in parallel by |
| omitting the compatibility symlinks (lzma, unlzma, lzcat, lzgrep etc.) |
| from the XZ Utils package. It's probably a good idea to still package |
| the symlinks into a separate package so that users may choose if they |
| want to use XZ Utils or LZMA Utils for handling .lzma files. |
| |
| |
| 8. Example |
| ---------- |
| |
| Here is an example for i686 GNU/Linux that |
| - links xz against static liblzma; |
| - includes only shared liblzma in the final package; |
| - links xzdec and lzmadec against static liblzma while |
| avoiding libpthread dependency. |
| |
| PKG=/tmp/xz-pkg |
| tar xf xz-x.y.z.tar.gz |
| cd xz-x.y.z |
| ./configure \ |
| --prefix=/usr \ |
| --sysconfdir=/etc \ |
| CFLAGS='-march=i686 -O2' |
| make |
| make DESTDIR=$PKG install-strip |
| rm -f $PKG/usr/lib/lib*.a |
| sed -i "s/^old_library=.*$/old_library=''/" $PKG/usr/lib/lib*.la |
| make clean |
| ./configure \ |
| --prefix=/usr \ |
| --sysconfdir=/etc \ |
| --disable-shared \ |
| --disable-nls \ |
| --disable-encoders \ |
| --enable-small \ |
| --disable-threads \ |
| CFLAGS='-march=i686 -Os' |
| make -C src/liblzma |
| make -C src/xzdec |
| make -C src/xzdec DESTDIR=$PKG install-strip |
| cp -a extra $PKG/usr/share/doc/xz |
| |