ncurses packages

Brian Dessent
Sun Feb 24 22:08:00 GMT 2008

NightStrike wrote:

> There are various libncurses packages, as well as a package named just
> "ncurses".  What is the difference between these?

Linux package management systems work in the same way.  It's not really
Cygwin or ncurses specific.

A package is split into multiple parts for a number of reasons.  Lets
say you have a package 'foo', that is comprised of some executables as
well as some library component, 'libfoo'.  This then leads to the
following division of packages:

foo - executables, documentation, manpages, readme, etc.
libfoo<n> - libfoo runtime components (DLL) of ABI version <n>
libfoo-devel - files needed by developers that wish to link with libfoo
(headers, static library, import library)

The reason for putting the DLL alone in its own libfoo<n> package is
that other packages that are linked with libfoo can require just that
package instead of all of foo.  For example, I want to install 'bar'
which is some package that is linked to libfoo, but I don't actually
care about libfoo at all, I just want bar to work.  So bar will just
require libfoo5, the DLL of ABI version 5, which allows bar to work
without having to install any other parts of foo or libfoo that aren't

The reason for having the ABI version in the package name is so that
there can exist multiple versions at once.  Without this versioning,
upgrading a library would be hell.  Suppose you have libfoo that is
currently at ABI version 3, and the next release of libfoo adds new
features that are not binary backwards compatible.  If the libfoo
runtime component was just cygfoo.dll without version then there could
only be one instance of it in /usr/bin and in order to provide the new
libfoo ABI 4, all packages that use libfoo would have to be recompiled
and updated at exactly the same time as libfoo.  It is unrealistic to
think that these kind of flag days can happen with any reasonably large
co-operative of volunteers, so instead all the packages that were linked
to libfoo3 continue to be linked to libfoo3, and the new libfoo4 is also
added to the distro.  Any packages that are consumers of libfoo will
eventually relink to v4 (and change their package dependencies
accordingly) because the import library in libfoo-devel always links to
the latest ABI version.  Eventually when all libfoo clients have been
updated, the now unused libfoo3 package can be removed from the distro,
but for some libraries that are used widely this never really happens
and so you see all these various versions hanging around.

Finally, the reason for splitting the headers, static library, and
import library into their own -devel package is because they are not
needed by normal users of foo or libfoo, only developers that want to
compile and link code that uses libfoo.  It's a space saving


Unsubscribe info:
Problem reports:

More information about the Cygwin mailing list