[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ next ]
This section describes the additions to the Debian Policy
that
are required for CLI packages.
For packages that consist of 100% managed code, "Architecture: all" must be chosen in debian/control.
Packages containing a mix of managed and native code must be "Architecure: any" or depending on the specific package a more restricted set of architectures is valid.
The package's applications, libraries and meta-data must be installed
into /usr/lib/upstream_package_name
.
Libraries that will be installed into the GAC must be installed into
/usr/lib/cli/assembly_name-X.Y
(for more details about the X.Y version see GAC versioning). assembly_name
is the assembly name without the file extension (.dll). The commonly seen
/usr/lib/mono/upstream_package_name
path should only be used for Mono project packages.
Example path for the log4net
package:
/usr/lib/cli/log4net-1.2
Never install native "glue" libraries into /usr/lib
,
instead install them at /usr/lib/cli/assembly_name-X.Y
.
When moving libraries update the references to the new location using a DLL
Map. See the Mono DLL maps section
for an example.
The only exception here is for native libraries that are of wider use; can be
used other packages. Native libraries should be packaged according to the
Library
Packaging Guide
in a Debian Policy conformant way.
You must not install application files (.exe
) directly
into /usr/bin
. Instead create a wrapper script into
/usr/bin
to allow them to be run without path and the
.exe
suffix.
Source code files (*.cs
, *.vb
, *.boo
,
etc.) should be non-executable.
Library files (*.dll
) should be non-executable.
Debug symbol files (*.mdb
) should be non-executable.
Assembly config files (*.config
) should be non-executable.
Application files (*.exe
) must have the executable flag
(+x) set to enable compatiblity with direct invokation as
./foo.exe
using Linux's BINFMT support.
To ensure that all files have correct permissions, you should use
Debhelper's /usr/bin/dh
combined with cli.make
.
Otherwise you should add dh_clifixperms
after
dh_fixperms
in the binary-* targets of debian/rules
.
At a minimum, CLI packages should Build-Depends on
cli-common-dev
(>= 0.7) and the appropriate CLI compiler or CLI
SDK package.
Current CLI compilers in Debian:
C#: mono-mcs
(>= 1.0) | c-sharp-compiler
C# 2.0: mono-gmcs
(>= 1.1.8) | c-sharp-2.0-compiler
C# 3.0: mono-gmcs
(>= 1.2.5) | c-sharp-3.0-compiler
Nemerle: nemerle
(>= 0.9)
Boo: boo
(>= 0.5.6)
Current CLI SDKs in Debian:
Mono: mono-devel
(>= 2.4.2.3)
Software that uses Mono via the C interface library (libmono.so
)
or requires the /usr/lib/pkgconfig/mono.pc
file must
Build-Depends on libmono-dev (>= 1.0)
Note that there are architectures for which no CLR is available and thus you may have to restrict the Build-Depends for your package to the architectures available.
If your package is Architecture: all
, you should specify this as
Build-Depends-Indep. Never put debhelper
, cdbs
,
dpatch
and quilt
into Build-Depends-Indep. See the
Debian
Policy Manual
for more information on this.
Libraries that are installed into the GAC should provide decent ABI stability and be useful for other packages. Otherwise, they should remain private to the package.
Libraries that are installed into the GAC must be strong-named, i.e. signed.
Libraries must to be installed into the GAC at package install time
(postinst) which is provided by the dh_installcligac tool of the
cli-common-dev
package.
Each of the libraries in the GAC has an assembly version number that consists of 4 parts (major, minor, build and revision number). When loading libraries from the GAC all 4 parts and the public signing key fingerprint must match.
It is general practice and recommended
by Microsoft
that a library is ABI compatible when only the build
and revision number change and the major and minor number stay the same.
The library package name must be prefixed with lib
.
To reflect the ABI stability and prevent breakages when a ABI-incompatible
version is released, a similar solution for native
library packages
is used. The major and minor number must
mirror the SONAME version and the resulting package name should be
libfooX.Y-cil
, where X is the major and Y the minor number of the
assembly version.
One notable exception for this naming are assemblies that end on a number
(Mono.C5 for example). In this case the package should be named
libfoo123-X.Y-cil
(i.e. libmono-c5-0.5-cil
) to
improve the readability.
The -cil
suffix is chosen to prevent confusion with native library
package names. Never use "sharp" in the package name as it does not
represent the language, and a CLI library can
be used with all CLI implemented / enabled
languages such as C#, IronPython, IronRuby, Boo, Nemerle, J#, VB.NET (full list
).
Unnecessary package renames should be avoided. Existing package names that do not follow this policy should not be renamed until the next incompatible ABI change, at which point the new naming scheme should be used.
If the upstream software does not use major and minor number to reflect ABI
stability or breaks ABI with a change in build or revision, the package
must be renamed to either libfooA.B.C-cil
or
libfooA.B.C.D-cil
(where A, B, C, D are the complete assembly
version numbers), depending at which point (major or minor) the breakage
occurred. All Policy Files must be
dropped at this stage until a new major or minor version is released.
The upstream software may use wildcards in the assembly versions (1.2.* for example) which are filled by the compiler with a random value. You must replace these wildcards with 0 (1.2.0.0 in the example) to make it possible to use Policy Files and make predictable version numbers.
More than one library can be installed in one package but it is required that they must all have the same assembly version and belong together.
As explained above a exact match of the version number is required to load a
library from the GAC. To override this
behaviour and make different versions of ABI-compatible library packages really
ABI-compatible you have to use Policy
Files
. These files have to be named policy.X.Y.foo.dll
(where X and Y are the major and minor number of the assembly it should be
compatible with), it must be signed with the same signing key as the
original assembly and it must be installed into the GAC. For information on how to create policy
files look at the previous Policy Files link or at the example below.
Overriding the GAC policy should only be done
when the different library versions are really ABI-compatible. This can be
checked using mono-api-check of the
mono-devel
package. You must also raise the version in
the clilibs control file to the minimum
version when new interfaces/classes/methods were added.
The clilibs
control file MUST be present in all GAC library packages. It can be created with
the dh_makeclilibs helper
script and has a format similar to the shlibs
file created by
dh_makeshlibs(1)
and also has a similar use: it is used by dh_clideps helper script to find the
correct dependencies.
You should always set the minimum required version of the library in
the clilibs
file.
Many libraries deliver a .pc
file for use by the
pkg-config
helper utility, which aids other libraries and
applications to link against libraries.
All GAC library packages should have a pkg-config .pc
file located
in /usr/lib/pkgconfig
. The filename must be identical to
that shipped by upstream.
When installing libraries into the GAC
signing is required. The signing key should be supplied by upstream. If
upstream is not supplying the key then you must use the
mono.snk
key from the cli-common-dev
package. This
key must be used for all following versions of the library to maintain
ABI compatbility.
Unnecessary ABI breakages should be avoided. Existing keys shipped by the source package should not be replaced (with mono.snk) until the next incompatible ABI change.
This includes libraries that are not ABI-stable, may be not strong-named and are usually in an early stage of development. They must not include a clilibs control file.
The package should be named libfoo-cil
(without a version in the
package name) and libraries should not be installed into the GAC but only into
/usr/lib/upstream_package_name
.
Applications using non-GAC libraries must copy the libraries they need into their own application directory. You can compare this with static linking of native libraries.
[ previous ] [ Contents ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ next ]
Debian CLI Policy
Version 0.7mailto:meebey@debian.org
mailto:brandon@smarterits.com
mailto:slomo@debian.org
mailto:debian@mfgames.com