1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-01 04:10:18 +02:00
guile/README-PACKAGING
2004-09-13 00:17:02 +00:00

96 lines
4.6 KiB
Text

-*-text-*-
Guile Packaging Guide
Copyright (C) 2002,2004 Free Software Foundation, Inc.
Permission is granted to anyone to make or distribute verbatim copies
of this document as received, in any medium, provided that the
copyright notice and permission notice are preserved,
and that the distributor grants the recipient permission
for further redistribution as permitted by this notice.
Permission is granted to distribute modified versions
of this document, or of portions of it,
under the above conditions, provided also that they
carry prominent notices stating who last changed them,
and that any new or changed statements about the activities
of the Free Software Foundation are approved by the Foundation.
This guide will eventually include comprehensive recommendations for
packaging Guile. Since the guide is still being developed, if you're
planning to package guile for a distribution, say via .debs, .rpms,
etc., please ask questions on the Guile development list at
guile-devel@gnu.org. Packaging Guile in a way that makes future
system upgrades go smoothly and allows multiple major versions of
Guile to coexist peacefully can be tricky. Some initial care in this
regard can save a lot of work later on.
Below is an initial set of issues that are important to consider, and
again, you're always welcome to consult guile-devel. We should be
able to help with any issues that haven't made it here yet.
Libraries:
----------
Under most packaging systems, it can be very important to package
each shared library in a separate package. However, Guile follows
some conventions that make it's requirements somewhat different. In
order to explain the situaion, we'll first give a brief explanation
of the general issue, followed by a description of how Guile
differs.
For most projects providing shared libraries, it can be important to
place each library in a separate package and to put the the
library's major version number in the name of the package. For
example, rather than libguile.deb or libguile.rpm, you might have
libguile9.deb or libguile9.rpm. This makes it possible for you or
someone else to provide a libguile10 package later that can
peacefully coexist with libguile9. This means that applications
that were compiled against libguile9 can continue to function even
when some new version of Guile providing libguile10 is installed.
If you put more than one library in a package, say libfoo.so.10 and
libbar.so.10, and then in the next release, the upstream developers
increment libfoo to libfoo.so.11, but leave libbar alone, then you
have a problem. Your next library package will conflict with the
previous one because both will contain libbar.so.10 (presuming that
your packaging system considers duplicate files an error). This
means that the old and new library packages cannot be installed
simultaneously, and of course, if the new library package is
installed, and the old one is removed, any software that was linked
against libbar.so.10 will now be broken until it is recompiled. On
the other hand, if libfoo and libbar had been in separate packages,
there would have been no problem.
However, Guile is somewhat unusual because it promises to increment
all of the major versions of all of its shared libraries with the
start of every new stable series (i.e. at release 1.6.0, 1.8.0,
etc.) and Guile also promises that there will be no backward
incompatibilities for libraries released during a stable series
(i.e. when going from 1.6.X to 1.6.Y). This means that unlike many
other projects, it is actually safe to place all of Guile's shared
libraries in one package. For example, Debian places all of the
shared libraries in a guile-1.6-libs package.
Executables:
------------
It is suggested that the executables be versioned somehow so that
more than one version of guile can be installed at the same time.
This is something that we may eventually address more fully
upstream, but for now, you may want to name the executables
according to the version and then provide some way for symlinks to
be installed from /usr/bin/guile, etc. that point to the actual
executables. i.e.:
/usr/bin/guile -> /usr/bin/guile-1.6
etc.
Debian, for example would handle these symlinks via the
update-alternatives mechanism so that the local admin would be able
to control which version of Guile was the default.
Of course for this to be a really solid approach, we should be
naming things this way upstream and should either use the versioned
names in scripts, i.e. #!/usr/bin/guile-1.6, or have some other way
to make sure the script gets the version of guile it needs.