bandwhich: 0.23.0 -> 0.23.1; move to by-name; nixfmt; useFetchCargoVendor (#356934)
[NixPkgs.git] / pkgs / development / compilers / mono / generic.nix
blobd9e34223771c358c86002ff3004506da29be3245
2   lib,
3   stdenv,
4   fetchurl,
5   bison,
6   pkg-config,
7   glib,
8   gettext,
9   perl,
10   libgdiplus,
11   libX11,
12   callPackage,
13   ncurses,
14   zlib,
15   bash,
16   withLLVM ? false,
17   cacert,
18   Foundation,
19   libobjc,
20   python3,
21   version,
22   sha256,
23   autoconf,
24   libtool,
25   automake,
26   cmake,
27   which,
28   gnumake42,
29   enableParallelBuilding ? true,
30   srcArchiveSuffix ? "tar.bz2",
31   extraPatches ? [ ],
34 let
35   llvm = callPackage ./llvm.nix { };
37 stdenv.mkDerivation rec {
38   pname = "mono";
39   inherit version;
41   src = fetchurl {
42     inherit sha256;
43     url = "https://download.mono-project.com/sources/mono/${pname}-${version}.${srcArchiveSuffix}";
44   };
46   strictDeps = true;
47   nativeBuildInputs = [
48     autoconf
49     automake
50     bison
51     cmake
52     libtool
53     perl
54     pkg-config
55     python3
56     which
57     gnumake42
58   ];
59   buildInputs =
60     [
61       glib
62       gettext
63       libgdiplus
64       libX11
65       ncurses
66       zlib
67       bash
68     ]
69     ++ lib.optionals stdenv.hostPlatform.isDarwin [
70       Foundation
71       libobjc
72     ];
74   configureFlags =
75     [
76       "--x-includes=${libX11.dev}/include"
77       "--x-libraries=${libX11.out}/lib"
78       "--with-libgdiplus=${libgdiplus}/lib/libgdiplus.so"
79     ]
80     ++ lib.optionals withLLVM [
81       "--enable-llvm"
82       "--with-llvm=${llvm}"
83     ];
85   configurePhase = ''
86     patchShebangs autogen.sh mcs/build/start-compiler-server.sh
87     ./autogen.sh --prefix $out $configureFlags
88   '';
90   # We want pkg-config to take priority over the dlls in the Mono framework and the GAC
91   # because we control pkg-config
92   patches = [ ./pkgconfig-before-gac.patch ] ++ extraPatches;
94   # Patch all the necessary scripts. Also, if we're using LLVM, we fix the default
95   # LLVM path to point into the Mono LLVM build, since it's private anyway.
96   preBuild =
97     ''
98       makeFlagsArray=(INSTALL=`type -tp install`)
99       substituteInPlace mcs/class/corlib/System/Environment.cs --replace /usr/share "$out/share"
100     ''
101     + lib.optionalString withLLVM ''
102       substituteInPlace mono/mini/aot-compiler.c --replace "llvm_path = g_strdup (\"\")" "llvm_path = g_strdup (\"${llvm}/bin/\")"
103     '';
105   # Fix mono DLLMap so it can find libX11 to run winforms apps
106   # libgdiplus is correctly handled by the --with-libgdiplus configure flag
107   # Other items in the DLLMap may need to be pointed to their store locations, I don't think this is exhaustive
108   # https://www.mono-project.com/Config_DllMap
109   postBuild = ''
110     find . -name 'config' -type f | xargs \
111     sed -i -e "s@libX11.so.6@${libX11.out}/lib/libX11.so.6@g"
112   '';
114   # Without this, any Mono application attempting to open an SSL connection will throw with
115   # The authentication or decryption has failed.
116   # ---> Mono.Security.Protocol.Tls.TlsException: Invalid certificate received from server.
117   postInstall =
118     ''
119       echo "Updating Mono key store"
120       $out/bin/cert-sync ${cacert}/etc/ssl/certs/ca-bundle.crt
121     ''
122     # According to [1], gmcs is just mcs
123     # [1] https://github.com/mono/mono/blob/master/scripts/gmcs.in
124     + ''
125       ln -s $out/bin/mcs $out/bin/gmcs
126     '';
128   inherit enableParallelBuilding;
130   meta = with lib; {
131     # Per nixpkgs#151720 the build failures for aarch64-darwin are fixed since 6.12.0.129
132     broken =
133       stdenv.hostPlatform.isDarwin
134       && stdenv.hostPlatform.isAarch64
135       && lib.versionOlder version "6.12.0.129";
136     homepage = "https://mono-project.com/";
137     description = "Cross platform, open source .NET development framework";
138     platforms = with platforms; darwin ++ linux;
139     maintainers = with maintainers; [
140       thoughtpolice
141       obadz
142     ];
143     license = with licenses; [
144       # runtime, compilers, tools and most class libraries licensed
145       mit
146       # runtime includes some code licensed
147       bsd3
148       # mcs/class/I18N/mklist.sh marked GPLv2 and others just GPL
149       gpl2Only
150       # RabbitMQ.Client class libraries dual licensed
151       mpl20
152       asl20
153       # mcs/class/System.Core/System/TimeZoneInfo.Android.cs
154       asl20
155       # some documentation
156       mspl
157       # https://www.mono-project.com/docs/faq/licensing/
158       # https://github.com/mono/mono/blob/main/LICENSE
159     ];
160     mainProgram = "mono";
161   };