From Fedora Project Wiki

< User:Chkr

Revision as of 20:49, 27 March 2011 by Chkr (talk | contribs)

Mono Multiarch Changes


Remove the multiarch support for mono on x86-64 systems.


  • Email:

Current status

  • Targeted release: Fedora 16
  • Last updated: (DATE)
  • Percentage of completion: 00%

Detailed Description

The way how mono is packaged in Fedora with respect to support multiarch is uncommon with respect to mono's default search paths. This causes lots of unnecessary work by the maintainers and quite a couple of bug reports due to uncaught uses of these default paths within the mono packages. Solving this issue would include to loose the ability to use 32bit parts of the mono stack in x86-64 - a feature which never worked correctly and is not available for other perl or python either.

Benefit to Fedora

This requires the maintainers to add lots of patches or "sed" constructs into the spec file in order to make all mono-based packages aware of this. All of these changes can't be upstreamed because they are contrary to the idea how mono should be located in the file system.


All mono-based packages most be re-compiled.

repoquery --whatrequires mono(System)

reports 114 packages which may be 50 separate source packages.

How To Test

  1. install any mono-based package you like to use (preferably for x86 and x86-64)
  2. try whether it still works correctly

User Experience

  1. Most user won't recognize it.
  2. There may be some users who used the 32-bit mono core packagesin x86-64. These packages will not be available anymore.


  • the "mash" tool to generate the x86-64 repositories must blacklist all -devel RPMS of the mono-based packages

Contingency Plan

  1. do the recompilation of all packages using a special build-target to check whether it works correctly
  2. don't remove the patches for the packages from the CVS yet
  3. in case it turns out that the migration can't be done, the spec files of the modified mono-based packages must be reverted
  4. since no builds where done for dist-rawhide, no rebuilds are necessary


Existing issue

  • example from monodevelop.spec:

sed -i -e 's!$(prefix)/lib/!%{_libdir}/!' \
    -e 's!${exec_prefix}/lib!%{_libdir}!' configure
sed -i -e 's!/lib/monodevelop!/%{_lib}/monodevelop!' monodevelop
sed -i -e 's!$PREFIX/lib/!%{_libdir}/!'
sed -i -e 's!monodevelop}/lib/!monodevelop}/%{_lib}/!'

find . -name '*.cs' -and \
     ! \( -name 'GNUCompiler.cs' -or -name 'CProjectConfiguration.cs' \) \
      | while read f ;
        sed -i -e 's!"lib"!"%{_lib}"!' "$f" 1>/dev/null

find . -name -or -name \* \
       -or -name \*.in -or -name \*.xml \
       | while read f ;
           sed -i -e 's!$(prefix)/lib/!%{_libdir}/!' \
               -e 's!@prefix@/lib/!%{_libdir}/!' \
               -e 's!/usr/lib/!%{_libdir}/!' \
               -e 's!${exec_prefix}/lib/!%{_libdir}/!' "$f" 1>/dev/null
  • another example from mono-basic.spec
%setup -q
sed -i -e 's!@libdir@!%{_libdir}!' %{PATCH0}
%patch0 -p1 -b .original
sed -i -e 's!%{_libdir}!@libdir@!' %{PATCH0}
sed -i -e 's!$(prefix)/lib/!%{_libdir}/!' build/config-default.make
sed -i -e 's!${exec_prefix}/lib!%{_libdir}!' configure


  • mono-based packages may contain mono assemblies ("nearly arch-independent") and ELF binaries (e.g. glue code etc., arch-dependent)
  • the assemblies are usually put in the GAC, mono's "global assembly cache"
  • the arch-dependent files are correctly copied into %{_libdir}
  • upstream places the gac into /usr/lib (/usr/lib/mono/gac)
    • Fedora moves the GAC into /usr/lib64
    • this is the source of all the packaging pain - most mono packages have this path hard-coded
    • move the GAC back to /usr/lib
    • ability to install 32-bit mono runtime and 64-bit mono runtime gets lost (most likely no use case)

Necessary Changes

  • general rule: remove all patches in the mono-based packages which deals with altering the lib path
    • ensure, that mono assemblies are either
      • correctly installed into the gac in /usr/lib or
      • installed into %{_libdir}/progam (packages which contain ELF libraries) or
      • installed into /usr/lib/program (packages which contain only mono assemblies)
    • ensure, that ELF binaries are correctly installed into %{_libdir}
  • blacklist all mono packages from mash's "multi-arch" selection rule which pulls in 32bit packages into x86-64
  • these rules follow the same ideas as used by the python packages (in Fedora) and the mono packages in OpenSUSE

Release Notes

  • no necessary

Comments and Discussion