dwww Home | Show directory contents | Find package

                             Debian CLI Policy
                             -----------------

                      Mirco Bauer <meebey@debian.org>

                   Brandon Hale <brandon@smarterits.com>

                    Sebastian Dro"ge <slomo@debian.org>

                 Dylan R. E. Moonfire <debian@mfgames.com>

                                Version 0.7


-------------------------------------------------------------------------------


Abstract
--------

     This document lays out basic policies regarding packaging Mono, other
     CLRs and CLI based applications/libraries on Debian GNU/Linux.


Copyright Notice
----------------

     Copyright (C) 2005-2009 Mirco Bauer Copyright (C) 2005 Brandon Hale
     Copyright (C) 2006 Sebastian Dro"ge Copyright (C) 2006 Dylan R. E.
     Moonfire.

     This manual is free software; you may redistribute it and/or modify it
     under the terms of the GNU General Public License as published by the
     Free Software Foundation; either version 2, or (at your option) any
     later version.

     This is distributed in the hope that it will be useful, but without
     any warranty; without even the implied warranty of merchantability or
     fitness for a particular purpose.  See the GNU General Public License
     for more details.

     A copy of the GNU General Public License is available as
     /usr/share/common-licenses/GPL in the Debian GNU/Linux distribution or
     on the World Wide Web at the GNU General Public Licence.  You can also
     obtain it by writing to the Free Software Foundation, Inc., 59 Temple
     Place - Suite 330, Boston, MA 02111-1307, USA.


-------------------------------------------------------------------------------


Contents
--------

     1.        Policy History

     2.        Used Terms
     2.1.      CLI - Common Language Infrastructure
     2.2.      CLR - Common Language Runtime
     2.3.      CIL - Common Intermediate Language
     2.4.      ".NET" or long "Microsoft .NET Framework"
     2.5.      GAC - Global Assembly Cache
     2.6.      Package Names

     3.        Packaging Policy
     3.1.      General Packaging
     3.1.1.         Architecture
     3.1.2.         File Locations
     3.1.3.         File Permissions
     3.1.4.         Build Dependencies
     3.2.      GAC Library Packaging
     3.2.1.         Naming & Versioning
     3.2.2.         Policy Files
     3.2.3.         clilibs Control File
     3.2.4.         pkg-config File
     3.2.5.         Signing
     3.3.      non-GAC Library Packaging
     3.3.1.         Naming

     4.        Mono Specific Packaging help
     4.1.      Naming
     4.2.      DLL Maps
     4.2.1.         Introduction
     4.2.2.         Solution: DLL map config file
     4.3.      MONO_DISABLE_SHM

     5.        DotGNU Portable.NET Packaging help
     5.1.      Naming

     6.        Appendix
     6.1.      Helper Scripts: cli-common-dev
     6.1.1.         dh_makeclilibs
     6.1.2.         dh_clideps
     6.1.3.         dh_installcligac
     6.2.      Examples
     6.2.1.         debhelper 5/6 Example
     6.2.2.         debhelper 7 Example
     6.2.3.         cdbs Example
     6.2.4.         Executable Wrapper Script Example
     6.2.5.         API Compatibility Check Example
     6.2.6.         GAC Policy File Example
     6.3.      Migrating Existing Packages


-------------------------------------------------------------------------------


1. Policy History
-----------------

     Here are the changes to the Debian CLI Policy document.

     Changes from 0.5.1 to 0.7:

        * Section 3.1.2, `File Locations': GAC libraries must now go in
          /usr/lib/cli/assembly_name-X.Y instead of
          /usr/lib/cli/upstream_package_name-X.Y, as one source package
          might ship many assemblies with different ABI versions.  This
          would produce very confusing directory names.

        * Section 3.2.1, `Naming & Versioning': Late-GAC install is now
          mandatory.

        * Section 3.1.4, `Build Dependencies': Added CLI SDKs as
          alternative to the compiler.

        * Section 3.2.5, `Signing': Using the mono.snk key of
          cli-common-dev is now mandatory if upstream doesn't ship one.

        * Section 4.3, `MONO_DISABLE_SHM': Replaced MONO_SHARED_DIR
          workaround with cli.make and MONO_DISABLE_SHM.

        * Section 6.2.2, `debhelper 7 Example': Added debhelper 7 example.

        * Section 3.2.2, `Policy Files': Added reference to the
          mono-api-check tool and made raising clilibs version mandatory.

        * Section 2.4, `".NET" or long "Microsoft .NET Framework"': Updated
          URL to Microsoft .NET Guidelines.

        * Section 2.6, `Package Names': Made upstream tarball names
          clearer.

        * Section 3.1.3, `File Permissions': Replaced find commands with dh
          + cli.make.

        * Section 3.2.1, `Naming & Versioning': Removed ASP.NET as it's not
          a programming language and added IronPython and IronRuby.

     Changes from 0.5.0 to 0.5.1:

        * Section 2.6, `Package Names': Added examples for the different
          meanings of package name.

        * Section 3.2.1, `Naming & Versioning': Explicitly name the "lib"
          prefix requirement for library packages.

     Changes from 0.4.4 to 0.5.0:

        * Removed DRAFT tag, the policy is now official.

        * Section 3.1.4, `Build Dependencies': Added C# 3.0 to the compiler
          list.

        * Section 3.1.3, `File Permissions': Added dh_clifixperms as
          alternative to the find command.

     Changes from 0.4.2 to 0.4.3:

        * Section 6.1.3, `dh_installcligac': Fixed order of
          dh_installcligac calls.

        * Section 6.2.1, `debhelper 5/6 Example': Fixed debhelper example
          (order).

        * Section 6.2.3, `cdbs Example': Fixed cdbs example (order).

     Changes from 0.4.1 to 0.4.2:

        * Section 6.2.6, `GAC Policy File Example': Fixed naming of the
          policy files.

     Changes from 0.4.0 to 0.4.1:

        * Section 6.2.1, `debhelper 5/6 Example': Fixed typo.

     Changes from 0.3.0 to 0.4.0:

        * Section 3.1.4, `Build Dependencies': Added nemerle to the
          compilers.

        * Chapter 3, `Packaging Policy': Added a packaging chapter that
          includes some of the old chapter and some new.

        * Section 3.2, `GAC Library Packaging': Added informations about
          signing and policy files.

        * Section 6.1.3, `dh_installcligac': Added and consolidated the
          information on `dh_installcligac'.

        * Section 3.1.2, `File Locations': Require that files are installed
          into `/usr/lib/package' or `/usr/lib/cli/package-X.Y' now.

     Changes from 0.2.1 to 0.3.0:

        * Section 2.4, `".NET" or long "Microsoft .NET Framework"': Added
          URL for the ".NET" term.

        * Section 2.5, `GAC - Global Assembly Cache': Added explanation of
          GAC.

        * Section 3.2, `GAC Library Packaging': Added section for naming of
          GAC packages.

     Changes from 0.2.0 to 0.2.1:

        * Section 6.1, `Helper Scripts: cli-common-dev': Added examples for
          debhelper and CDBS.

     Changes from 0.1.1 to 0.2.0:

        * Chapter 1, `Policy History': Added chapter "Policy History"

        * Section 3.1.4, `Build Dependencies': Compiler dependency is no
          longer strict on mono-mcs

        * Section 6.1, `Helper Scripts: cli-common-dev': Note that
          dh_makeclilibs must be called before dh_clideps

        * Section 3.1.4, `Build Dependencies': Moved dh_clideps and
          dh_makeclilibs into their own subsections

        * Section 3.1.3, `File Permissions': Added chapter "File
          Permissions"

        * Section 6.3, `Migrating Existing Packages': cli-wrapper is now
          deprecated

        * Section 4.2.1, `Introduction': Added an external link for
          DllNotFoundException


-------------------------------------------------------------------------------


2. Used Terms
-------------

     The ".NET" area uses its own set of abbreviations, which can look
     confusing to other people.  This chapter lists some of the terms along
     with their explanations:


2.1. CLI - Common Language Infrastructure
-----------------------------------------

     This is what most people mean when they say ".NET".  The CLI defines
     mainly the virtual machine, the bytecode and how everything works
     together.  It is both an ISO
     (http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=36769)
     and ECMA
     (http://www.ecma-international.org/publications/standards/Ecma-335.htm)
     standard.


2.2. CLR - Common Language Runtime
----------------------------------

     The CLR is an implementation of the CLI (often with a lot of add-ons
     or tools for developers).  Mono and Microsoft .NET Framework are CLRs.


2.3. CIL - Common Intermediate Language
---------------------------------------

     The CIL is the format of the bytecode for binaries and libraries used
     by the CLI.


2.4. ".NET" or long "Microsoft .NET Framework"
----------------------------------------------

     The ".NET" word is a Microsoft marketing phrase and mostly is a CLR
     with added Microsoft technologies like: ASP.NET, VB.NET,
     System.Windows.Forms, Passport plus a lot of other things.

     _We highly discourage from using any form of the word ".NET", it is
     burdened by copyright and marketing._ We advice to use the correct
     term instead, which is usually CLI.

     If you really want to use the ".NET" term in a correct form please
     refer to the Microsoft .NET Guidelines
     (http://www.microsoft.com/about/legal/trademarks/usage/net.mspx).


2.5. GAC - Global Assembly Cache
--------------------------------

     The GAC contains and manages the libraries for the CLR.  It allows
     users to install multiple versions of the same library and enables
     loading of the right version when an application is executed.

     Mono stores the GAC at `/usr/lib/mono/gac'

     DotGNU Portable.NET stores the GAC at `/usr/lib/cscc/lib'


2.6. Package Names
------------------

     There are different set of package names we refer in this policy to.
     Here a list of examples for the different names:

        * assembly (file) names:

               gtk-sharp.dll

               log4net.dll

               FlickrNet.dll

        * (debian) source package names:

               gtk-sharp2

               log4net

               libflickrnet

        * (debian) binary package names:

               libgtk2.0-cil

               libgnome2.0-cil

               liblog4net1.2-cil

               libflickrnet2.1.5-cil

        * upstream package names (a good indicator is the pkg-config file
          name):

               gtk-sharp-2.0

               log4net

               flickrnet

        * upstream tarball names (without version and file extension):

               gtk-sharp-2.12.9.tar.gz -> gtk-sharp

               log4net-1.2.0-beta8.zip -> log4net

               FlickrNet-25207.zip -> FlickrNet


-------------------------------------------------------------------------------


3. Packaging Policy
-------------------

     This section describes the additions to the Debian Policy
     (http://www.debian.org/doc/debian-policy/) that are required for CLI
     packages.


3.1. General Packaging
----------------------

3.1.1. Architecture
-------------------

     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.

3.1.2. File Locations
---------------------

     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
     (http://www.netfort.gr.jp/~dancer/column/libpkg-guide/libpkg-guide.html)
     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.

3.1.3. File Permissions
-----------------------

     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'.

3.1.4. Build Dependencies
-------------------------

     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
     (http://www.debian.org/doc/debian-policy/ch-relationships.html#s-sourcebinarydeps)
     for more information on this.


3.2. GAC Library Packaging
--------------------------

     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.

3.2.1. Naming & Versioning
--------------------------

     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
     (http://msdn.microsoft.com/netframework/programming/deployment/default.aspx?pull=/library/en-us/dndotnet/html/dplywithnet.asp#dplywithnet_version)
     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
     (http://www.netfort.gr.jp/~dancer/column/libpkg-guide/libpkg-guide.html#naminglibpkg)
     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
     (http://www.mono-project.com/Languages)).

     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.

3.2.2. Policy Files
-------------------

     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
     (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcreatingpublisherpolicyfile.asp).
     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.

3.2.3. clilibs Control File
---------------------------

     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.

3.2.4. pkg-config 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.

3.2.5. Signing
--------------

     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.


3.3. non-GAC Library Packaging
------------------------------

     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.

3.3.1. Naming
-------------

     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.


-------------------------------------------------------------------------------


4. Mono Specific Packaging help
-------------------------------

     This section offers help with common problems encountered when
     packaging Mono-specific applications for Debian.


4.1. Naming
-----------

     The official name of the Mono Project is: Mono, mono:: or mono.  To
     keep this consistent for users, it should _always_ be called "Mono"
     (not MONO, mono, mono:: or mixed with the .NET name).  The explanation
     of what Mono is, should be in the package _long_ description.


4.2. DLL Maps
-------------

     Often times, upstream software developers are not packagers, and vice
     versa.  Developers do not necessarily test their software with
     packaging issues in mind.  The most common problem we see from this
     are missing DLL exceptions.

4.2.1. Introduction
-------------------

     When Mono code invokes an external library, it usually calls something
     like [DllImport("foo")] which expands "foo" to a shared library name
     such as "libfoo.so" which is then searched for in the library search
     path.

     In Debian and some other binary Linux distributions, packages are
     split into runtime and developer (-dev) packages.  Since the versioned
     library libfoo.so.X is usually used at runtime, and libfoo.so is a
     symlink only used when building against the library, the libfoo.so
     symlink is in the libfoo-dev package.

     When packaging an application which uses libfoo.so normal users should
     not need the -dev packages installed just to run the application.
     However, Mono defaults to looking for the unversioned libfoo.so, which
     is unavailable in the runtime package.

     When the DLL map is missing or upstream forgets to install the DLL
     map, it will result in a DllNotFoundException
     (http://www.mono-project.com/DllNotFoundException) which will stop the
     execution of the program.

4.2.2. Solution: DLL map config file
------------------------------------

     This can be fixed by creating a DLL map for the application exe or for
     the library DLL that is trying to invoke libfoo.so.  If libfoo.so is
     invoked by the DLL bar.dll, create an xml file, bar.dll.config to tell
     Mono which .so should be loaded at runtime.  bar.dll.config should be
     installed to the same directory as bar.dll.

                    <configuration>
                    <dllmap dll="foo" target="libfoo.so.0"/>
                    </configuration>

     A config file can contain as many dllmap directives as are needed.  If
     the upstream developer already ships a config file, but it is
     incomplete, you should create a patch against it in your package.

     Most Mono software developers are very helpful people, and will
     readily accept patches to solve this type of bug if you bring it to
     their attention.  Please be sure to inform them of all these changes.


4.3. MONO_DISABLE_SHM
---------------------

     The Mono runtime uses a shared directory, by default `~/.wapi'.  This
     directory will be created/used when any CLI application is executed
     (like the C# compiler mcs).

     There are 2 problems with this:

        * In an autobuilder environment often the running user has no home
          directory.

        * Mono uses the wrong home directory when running within fakeroot
          (it tries `/root/.wapi' instead of `$HOME/.wapi').

     In these cases, the package building will fail, applications will
     hang, die with strange Mono runtime errors or segfault.  This includes
     dh_clideps or dh_makeclilibs, since they run monodis.

     The solution is to include `cli.make' from `cli-common-dev' in
     `debian/rules' or to manually set the MONO_DISABLE_SHM environment
     variable.

                  export MONO_DISABLE_SHM = 1


-------------------------------------------------------------------------------


5. DotGNU Portable.NET Packaging help
-------------------------------------

     This section offers help to common problems encountered when packaging
     DotGNU Portable.NET-specific applications for Debian.


5.1. Naming
-----------

     The official name of the DotGNU Portable.NET project is exactly that.
     To keep this consistent for users, it should be _always_ called
     "DotGNU Portable.NET" (not pnet or Portable.NET).  The explanation of
     what DotGNU Portable.NET is, should be in the package _long_
     description.


-------------------------------------------------------------------------------


6. Appendix
-----------


6.1. Helper Scripts: cli-common-dev
-----------------------------------

     When using cli-common-dev and the included dh_* scripts packages
     _must_ Build-Depends on `cli-common-dev' (>= 0.7) (this version may
     change later, when cli-common-dev has changes which are required to be
     used by all CLI packages, the CLI Policy version will represent such
     changes).

6.1.1. dh_makeclilibs
---------------------

     dh_makeclilibs is used to create the clilibs control files which are
     used later by `dh_clideps' for this or other packages.  It _must_ only
     be used when your package contains libraries that other packages may
     link against.

     It has the same use (and very similar parameters) to `dh_makeshlibs'.
     You should always use the most minimal version necessary.

     _This program _must_ be called before `dh_clideps'._

     See dh_makeclilibs(1) for details.

6.1.2. dh_clideps
-----------------

     `dh_clideps' is used to discover the native and managed dependencies
     of the packages.  It uses the clilibs control files, the `.config' of
     assemblies and the `shlibs' files created by `dh_makeshlibs'.  The
     discovered dependencies are written into the ${cli:Depends} variable.

     _`dh_shlibdeps' must be run before `dh_clideps'.  `dh_makeshlibs' and
     `dh_makeclilibs' must be run before `dh_clideps'_.  If not, when two
     binary packages from the same source package depend on one another,
     `dh_clideps' will not be able to determine the dependencies.

     `dh_clideps' can remove duplicate dependencies created by running
     `dh_clideps' and `dh_shlibsdeps' when run given the -d parameter.

     See dh_clideps(1) for details.

6.1.3. dh_installcligac
-----------------------

     `dh_installcligac' is used to facilitate the installation of
     strong-named assemblies into the various caches installed on the
     user's machine.  Its primary purpose is to install the assemblies at
     the point of installation instead of pre-packing them inside the
     Debian package; this is also known as late-GAC install.

     To identify which assemblies need to be installed into the GAC,
     `dh_installcligac' uses the `debian/installcligac' or the
     `debian/packagename.installcligac' to list the assemblies to install
     or uninstall at installation or removal respectivly.

     The file format of the `installcligac' is simple: the full installed
     path of every assembly to install into the GAC.  For example, the
     liblog4net1.2-cil package would have this in the
     `debian/installcligac' file:

          /usr/lib/cli/log4net-1.2/log4net.dll

     `dh_installcligac' needs to be called after `dh_install' and before
     `dh_clideps'.  See dh_installcligac(1) for details.


6.2. Examples
-------------

6.2.1. debhelper 5/6 Example
----------------------------

     For binary-arch packages:

          binary-arch: build install
                ...
                dh_shlibdeps -a
                dh_makeclilibs -a -V
                dh_installcligac -a
                dh_clideps -a
                ...

     For binary-indep packages:

          binary-indep: build install
                ...
                dh_makeclilibs -i -V
                dh_installcligac -i
                dh_clideps -i
                ...

6.2.2. debhelper 7 Example
--------------------------

     With debhelper's 7 `/usr/bin/dh' you don't need to add any extra
     commands to `debian/rules' yourself as debhelper has an API that
     allows to extend it.  `cli-common-dev' as of version 0.5.7 can extend
     debhelper 7 with all commands that are needed.  You can enable this by
     passing "cli" to dh in `debian/rules' like this:

          %:
              dh $@ --with cli

     That's it, you are done!  :-)

6.2.3. cdbs Example
-------------------

          common-binary-predeb-arch common-binary-predeb-indep::
                dh_shlibdeps
                dh_makeclilibs -V
                dh_installcligac
                dh_clideps

6.2.4. Executable Wrapper Script Example
----------------------------------------

          #!/bin/sh
          exec /usr/bin/cli /usr/lib/package/package.exe "$@"

6.2.5. API Compatibility Check Example
--------------------------------------

     You need to install following packages for this example: mono-devel
     libmono-sharpzip0.6-cil libmono-sharpzip0.84-cil

mono-api-check /usr/lib/mono/gac/ICSharpCode.SharpZipLib/0.6.0.0__1b03e6acf1164f73/ICSharpCode.SharpZipLib.dll \
   /usr/lib/mono/gac/ICSharpCode.SharpZipLib/0.84.0.0__1b03e6acf1164f73/ICSharpCode.SharpZipLib.dll
CLI API Check
Assembly Name:          ICSharpCode.SharpZipLib
Missing Interfaces:     44
Additional Interfaces:  79

The two assemblies you compared are not API compatible!
You must use a new package name!

The new assembly has additional interfaces. You must raise
the minimal version in clilibs!

     The mono-api-check wrapper script checks whether there are new
     public/protected interfaces (where interface in this context means
     namespace, class, method, interface, delegate, etc) or any missing
     ones.  When an interface is changed it will show up as missing and
     additional.  You should follow the instructions, in this case you must
     create a new versioned package for the library and raise the minimal
     version number for the dh_makeclilibs call.

6.2.6. GAC Policy File Example
------------------------------

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
         <assemblyIdentity name="foo" publicKeyToken="35e10195dab3c99f" />
         <bindingRedirect oldVersion="1.2.0.0-1.2.10.0" newVersion="1.3.0.0"/>
       </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

     The above example would be used for a policy file for the "foo"
     assembly and would tell the GAC that version 1.3.0.0 is compatible
     with versions 1.2.0.0 to 1.2.10.0.  You have to compile and install it
     with

al -link:policy.1.2.foo.config -out:policy.1.2.foo.dll -keyfile:path/to/keyfile
gacutil /i policy.1.2.foo.dll

     Keep in mind that the filenames _must_ be policy.X.Y.foo.config and
     policy.X.Y.foo.dll where foo is the assembly name and X.Y is the major
     and minor version number you want to be compatible with.


6.3. Migrating Existing Packages
--------------------------------

     Many CLI packages already exist in Debian, or are in ITP, and conform
     to the deprecated Mono Conventions
     (http://wiki.debian.org/?MonoConventions).

     Any `debian/rules' hacks or patches that exist to redirect files to
     `/usr/share/dotnet' should be removed, and adjusted according to
     upstream file locations (`/usr/lib').  See Mono Debian Plan
     (http://wiki.debian.org/?MonoDebianPlan) for the rationale behind this
     change.

     Also, be sure to replace references to dh_netdepends, dh_makenetlibs,
     and ${net:Depends} with the newer names described in the policy above.

     Please remove any build-deps on `mono-jit', `mono-mint', `mono-utils'
     (this one had the dh_* helper scripts which are now in
     `cli-common-dev') and `libmono-dev' (use this one only if the package
     really links against `mono' or requires the mono.pc file).


-------------------------------------------------------------------------------


     Debian CLI Policy

     Mirco Bauer <meebey@debian.org>
     Brandon Hale <brandon@smarterits.com>
     Sebastian Dro"ge <slomo@debian.org>
     Dylan R. E. Moonfire <debian@mfgames.com>


     Version 0.7

Generated by dwww version 1.15 on Thu May 23 21:03:26 CEST 2024.