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