[PATCH] Adding a fully-bootstrapped mono

  • Open
  • quality assurance status badge
Details
5 participants
  • Aaron Covrig
  • Janneke Nieuwenhuizen
  • Ludovic Courtès
  • Richard Sent
  • unmush
Owner
unassigned
Submitted by
unmush
Severity
normal
U
U
unmush wrote on 29 Nov 16:05 +0100
(name . guix-patches@gnu.org)(address . guix-patches@gnu.org)
iMoekcfwEfCp2uLTWzr-P2_OVyzTF-420AoXae5W6GK2kP5NvueOXBRzAIJBRN2U0c7Sl0HUzUy8eKWNuTs2uaiapCUkJUo5Ng9ahfsfGZ8=@proton.me
We used to have a mono package, but it was removed due to includingbootstrap binaries (among others).  This patch series introduces a full,
17-mono-package sequence that takes us from a mono-1.2.6 built fully
from source to mono-6.12.0 built fully from source, using only packages
that already have full bootstrap paths.  I make no promise that this is
the shortest or most optimal path, but it exists and I have verified it
works.

As I've spent what is probably an unreasonable amount of time working
toward this, I thought I'd share some of my thoughts, experiences, and
commentary.  Sorry in advance if it gets a bit rambly or lecture-ish.

* Prologue

I started down this road because someone I'm working on a project with
decided to depend on a C# package that requires C# 12.0 features, and my
personal mono package based on the tarball releases (which include
bootstrap binaries) only went up to C# 7.0.  This meant that the C#
package in question de facto required strictly Microsoft's (er, I mean,
"the .NET foundation"'s) .NET implementation - hereafter referred to as
"dotnet" - and a very recent version no less.  The bootstrapping story
with dotnet is very bad:
untangle it would probably require a relatively modern C# compiler, and
something that at least sort of understands msbuild.  And there's not
much point to "bootstrapping" dotnet from something that isn't
bootstrapped itself.  So I figured I may as well start with mono.

* History

While mono is today probably the most well-known alternative to
Microsoft's .NET offerings, it is not the only one.  Indeed, in the
early 2000s there were at least 2 competing free software
implementations: Mono, and DotGNU's Portable.NET (abbreviated pnet).
They differed in goals, licenses, and methods: Portable.NET was a GNU
project concerned with, among other things, limiting the ability of
Microsoft to impose vendor lock-in via its proprietary .NET
implementation and software patents.  As a GNU project, it used the GPL
for its runtime and compiler, and the GPL with a linking exception for
its standard library, pnetlib.  Mono, on the other hand, used a mix of
many copyleft and permissive licenses: X11 for the standard library, GPL
for the compiler (later dual-licensed to add an X11 option), and LGPL
for the runtime, with GPL and LGPL code also offered "under commercial
terms for when the GPL and the LGPL are not suitable".  In 2016 after
its acquisition by Microsoft, the runtime was relicensed to use the
Expat (MIT) license.

But perhaps most importantly to us, while Mono opted to write its C#
compiler, mcs, in... C#, Portable.NET's runtime and C# compiler were
both written in C.  Portable.NET along with the entire DotGNU project
was decommissioned in 2012, but the source is still available, and it
still works fine (with a few modifications for compatibility with newer
versions of its dependencies).  In https://issues.guix.gnu.org/57625
Adam Faiz submitted patches to package pnet and pnetlib, along with one
of their dependencies named treecc.  These packages were based on the
last release of Portable.NET, version 0.8.0, released in 2007.  I
initially used these packages as the basis for my bootstrap efforts, and
even managed to get mono-1.2.6 built using them, but later discovered
that using a more recent version from git made it much easier.  For
example, while pnet-0.8.0 can do pointer arithmetic inside unsafe code
blocks, it doesn't support the += or -= operators specifically, which
requires lots of patching (after all, who would use x = x + y when you
could do x+= y?).  There are many other similar improvements in the git
version, so for this patch series I've decided to go with pnet-git.

* The start

After building mono-1.2.6, I tried a few later versions, and the third
or fourth one would always fail with errors about missing methods.  It
turns out that the reason for this is that, contrary to what their
marketing suggests, C# and Java are not "write once, run everywhere".
This is because their compilers rely on the details of the libraries
that the program will be run with at compile-time.  This is used, for
example, to do overload resolution.  Suppose, for example, that a
certain implementation of the "==" operator is present in version 1.0 of
a library, and then in version 2.0 of a library a more specific
implementation is introduced.  Now code that is compiled against version
2.0 may instead automatically reference the more-specific
implementation, as is in accordance with the rules of C#.  But when it
is run with version 1.0, it will fail because that implementation
doesn't exist.  In my case, for some reason the initial mcs and core
libraries being built to compile the rest of mono were being compiled
against a 2.0 library and then run with a 1.0 library.  It turns out
that this was because mcs uses mono's code for producing assemblies
(.NET dlls and exes), and mono decides which version to put in an
assembly it writes based on "which runtime version" is being used, and
that version is decided at startup based on... the version that was put
in the assembly it is running.  So for example, mono-1.9.1 would produce
2.0 assemblies because mono-1.2.6 produced 2.0 assemblies because pnet
produced 2.0 assemblies.  So I modified mono's runtime in mono-1.9.1 to
allow for this version to be overridden via environment variable, and
set it to "v1.1.4322", and things went a lot more smoothly after that.

From there on it was mostly the usual trial-and-error process of
identifying where things had bitrotted.  I made sure to unvendor libgc
wherever possible, though eventually by mono-4.9.0 they explicitly
dropped support in their configure script for using any libgc other than
what was bundled, so at that point I switched to using their homebrewed
sgen garbage collector.

* A concerning development

Once I got to mono-2.11.4, though, things took a turn for the
interesting: mono started using git submodules, and the (recursive? #t)
clones were all failing.  It turns out that this is because their
submodules reference github.com using the git:// protocol.

This is notable for a few reasons.

First, github dropped support for the git:// protocol in 2021, so
recursive clones won't work now.  This means I have to explicitly list
out every submodule, its commit, and its sha256 hash, for every mono
version until they switched to using http or https.  mono-2.11.4 has
only 4 submodules, but that doesn't last for long: by mono-4.9.0 it has
14 submodules.  A significant portion of these patches is just listing
these submodules and their hashes.  It's a bit annoying.

The more concerning reason, though, is *why* github dropped support for
the git:// protocol: it is unencrypted and unauthenticated.  This is
mitigated somewhat by the use of sha-1 hashes to identify commits in the
referenced submodules, putting a significant computational burden on
anyone who would try to alter what was fetched corresponding to a given
submodule.  Significantly more risky, though, is the process of
*updating* submodules that use git:// URLs.  It is quite unlikely that a
developer is going to independently clone one of the submodules over
https, navigate to a desirable commit, copy the sha-1 hash, and manually
update the submodule reference's commit.  They're far more likely to run
'cd submodule; git pull; cd ..; git add submodule; git commit ...' or an
equivalent.

Of course, any changes a network man-in-the-middle might try to make
here would still be reflected in the commit history, so even if a
developer did that, they or any of their fellow committers could spot
anything strange or malicious and point it out.  Also, the changes
couldn't be propagated to others trying to pull them who weren't on a
path containing the MITM because the potentially-malicious commit
wouldn't be present in the real submodule's repository.  So the
transparency of git clearly showing changes to text files, combined with
the fact that surely no git hosting platform would just allow arbitrary
entities to make whatever commits they want accessible under any
arbitrary repository URL, rather mitigate this security issue.

This usage of git:// URLs lasted all the way until September 28, 2021,
when github's removal of support for it forced the developers to change
them to https.

* Meanwhile, in reality

On November 28, 2016, mono added a submodule named roslyn-binaries.
Unsurprisingly, it included binary blobs for Microsoft's Roslyn compiler
(which I believe had been open-sourced shortly prior).  From here on,
mono's build system would default to using these binaries for building
on little-endian systems (though another compiler could be specified
with the --with-csc configure flag).  I happen to know that it is
extremely unlikely that many mono developers used this configure flag.
I know this because the 5.0 series is an absolute pain in the neck to
build from source, because they consistently depend on new C# features
*before* they implement them.

To go on a brief tangent: does anyone remember back when youtube-dl was
temporarily taken down from github due to the RIAA's DMCA request?  Many
were unhappy about that.  One such unhappy person made news when they
made the full contents of youtube-dl's repository available to access
through the DMCA request repository:
turns out that there are many actions that one can take on github that
will make arbitrary commits available under arbitrary repository URLs.

So, in reality, for the span of time from November 28, 2016 to
September 28, 2021, anybody sitting on the network path between github
and any mono developer updating the roslyn-binaries submodule could
decide on any arbitrary new commit to be used.  Of course, merely
inspecting the diff for the commit will reveal nothing of use, because
the contents are binary blobs.  And not only are these blobs those of a
compiler, they are the blobs of a compiler that is sure to be used to
compile another compiler, which will then be redistributed as an opaque,
non-bootstrappable binary blob to be used for compiling other compilers.

You would be hard-pressed to find a more fertile breeding ground for Ken
Thompson / Trusting Trust attacks.  If every agent of the NSA (and
whatever other agencies, including those of other countries, had access
to the appropriate network traffic) somehow failed to capitalize on 6
years of opportunity to compromise an entire software ecosystem using
only a basic MITM of unencrypted traffic, they deserve to be sacked.
Whether such an attack actually occurred or not, this is a case study in
carelessness and why bootstrappability is so important; discovering all
this made me quite worried about having used a mono version built from
blobs previously, and has convinced me that, as time-wasting and tedious
as this project has been, it is nevertheless probably an important one.

* Another note on roslyn-binaries

If you're going to write a self-hosting compiler, the least you can do
is keep it self-hosting.  Deciding to write a self-hosting compiler is a
valid choice, of course, with its own merits and demerits, but there is
something bitterly poetic about mono starting out requiring specifically
Microsoft's C# compiler in order to build (mono did its initial
bootstrapping using Microsoft's proprietary csc), achieving independence
through self-hosting, being acquired by Microsoft, and thereafter coming
crawling back to Microsoft's C# compiler once more before eventually
dying.

The funny thing is that it's not even necessary.  The dependencies on
new C# features are all in mono's standard library (which increasingly
borrowed code from Microsoft's corefx library), not in mono's compiler.

* More binary submodules?

Even before roslyn-binaries, there was binary-reference-assemblies,
which contained prebuilt "reference" blobs for the various versions of
the standard libraries.  These exist, I assume, precisely because of the
library incompatibility problems regarding overloading that I mentioned
earlier.  While later versions of mono included sources and a build
system for producing these reference binaries, mono-4.9.0 and earlier
did not.  Mono's build system still demanded /something/ to install,
though, so I told it to use the real standard library of the input mono
version.  When I did get to a mono version that at least claimed to
support regenerating the reference binaries, I found that it didn't work
with mcs due to differences in which libraries had to be referenced, so
I had to patch it to add a bunch of references determined through trial
and error.

The xunit-binaries submodule was also added sometime before mono-5.1.0.
This dependency makes it impossible to run the full test suite without
binary blobs.  Presumably for this reason, Debian elects to only run
tests within the mono/mini/ and mono/tests/ subdirectories.  For my
part, I've disabled all tests except for those of mono-6.12.0, the final
version, limited to the two aforementioned subdirectories.  This is
because it would take extra time for the builds, because several of the
tests depend on binary blobs bundled into the mono repository itself
(which my thorough cleaning of all dlls and exes from the sources
removes), because a large chunk of the tests depend on binary blobs in
xunit-binaries in later versions, and because "expect some test
failures" is part of the mono documentation and I don't have the
time to figure out for the mono developers every reason why each of 17
versions of their test suite is broken.

* The long march through the 5.0s

The 5.0 series was when Microsoft acquired Mono, and it shows.  You'll
notice I needed to introduce "pre-" packages for various versions
because in several cases a tagged release could not build the following
tagged release.  For that matter, they couldn't build the pre- package
either, but it at least took fewer patches to get them working.  The
reason for this is that Mono added a dependency on Microsoft's corefx
library source code, and it usually started using C# features well
before mcs was able to compile them.  Because of this, despite taking 8
versions to get from 1.2.6 to 4.9.0, it took another 8 versions to get
through the 5.0 series, and 5 of them required nontrivial patching to
massage the source into a form compilable by mcs.

* The final stretch

Eventually I realized that the dependencies on new features were all
coming from corefx, not from mono's compiler.  Consequently, the only
reason for this particular bootstrap-hostile ordering of builds is that
it happened to be the order the mono devs committed things.  So I just
cherry-picked every commit I could find touching mcs/mcs (magit was
quite useful for this) and applied it to 5.10.0 to produce what is
essentially the 6.12.0 compiler, then used it to jump straight to
building 6.12.0.

Use of this technique earlier on in the bootstrap process may be
of interest to anyone looking to shorten the chain of packages.

* The finishing touches

My initial goal was to package dotnet, and I had tried to progress
toward that from mono-4.9.0 for a period, but with no success.  During
that time, though, I did encounter a bug in mono's xbuild condition
parser, which I wrote a patch for, and included in mono-6.12.0.

I also discovered that xbuild would wrongly complain about missing
references even when the proper assemblies were in MONO_PATH or
MONO_GAC_PREFIX, because xbuild would erroneously only consider the path
/gnu/store/...mono-6.12.0/lib/mono/gac when looking for global assembly
caches, completely ignoring MONO_GAC_PREFIX.  So I wrote a patch to fix
that, and included it in mono-6.12.0.

Having witnessed how much nicer it is to package things that use rpath /
runpath than things that use environment variables (like python) and
therefore require constant wrapping of executables and use of
propagated-inputs, I devised a patch that would extend mono's
per-assembly config files to support a <runpath> element.  For example,
if you have a file /tmp/dir2/test2.exe, and there is also a file
/tmp/dir2/test2.exe.config, and its contents are

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runpath path="/tmp/dir1"/>
</configuration>

and it references test1.dll, it will first look for it at
/tmp/dir1/test1.dll.  Note that, of course, test1.dll still needs to be
accessible to the compiler at compile-time through MONO_PATH or an
explicitly-specified path passed on the mcs command line.

It is my hope that this feature will be of use to anybody interested in
developing a build system.

* Future work

Mono had several difficult points in bootstrapping and packaging, but at
the end of the day it still met the basic description of a software
package: well-defined environment-supplied inputs and sources, a
user-supplied install prefix, and files installed under that prefix.

The dotnet world is an entirely different beast.  The first step of most
build systems I have encountered from that realm is downloading an
entire toolchain, among other dependencies, as a binary blob.  They
heavily depend on the exact packages they specify being available
exactly where they say to install them.  There is no "install", there
are no "install directories" to my knowledge.  A build that doesn't
contact nuget.org is an abberation.  I am at a loss how to build these
things, much less package them.  I badly need help.

* Closing thoughts

"You wish now that our places had been exchanged.  That I had died, and
DotGNU had lived?"

"... Yes.  I wish that."

Maintenance of Mono was recently transferred over to WineHQ.  With that
announcement this statement was placed at https://www.mono-project.com:

"We want to recognize that the Mono Project was the first .NET
implementation on Android, iOS, Linux, and other operating systems. The
Mono Project was a trailblazer for the .NET platform across many
operating systems. It helped make cross-platform .NET a reality and
enabled .NET in many new places and we appreciate the work of those who
came before us."

I would like to clarify that, according to Miguel de Icaza himself
"started working on the system about the same time".  According to
https://lwn.net/2002/0103/a/dotgnu.php3Portable.NET began "in January
2001".  While it's unclear exactly when Portable.NET reached various
milestones, and the significance of the various milestones varies
somewhat (for example, mono probably does not care that Portable.NET
also includes a Java and C compiler), I think that there is cause to
dispute the claim that Mono was "the first" .NET implementation on
Linux.

On a related note, if we haven't looked at the possibility of using
Portable.NET in the Java bootstrap process, it may be worth visiting at
some point.

Thank you for your time, I think I need to get some rest now.

- unmush
From 3f8af65f72871d61fa85e6939f46cb8dac185c70 Mon Sep 17 00:00:00 2001
Message-ID: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
From: unmush <unmush@hashbang.sh>
Date: Tue, 26 Nov 2024 12:13:32
Subject: [PATCH 01/21] gnu: add treecc.

* gnu/packages/dotnet.scm: new module.
(treecc): new package.
* gnu/local.mk (GNU_SYSTEM_MODULES): add new module.

Change-Id: If3f36615774c872f3015510eb08ec53657e4edfb
---
gnu/local.mk | 1 +
gnu/packages/dotnet.scm | 62 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+)
create mode 100644 gnu/packages/dotnet.scm

Toggle diff (82 lines)
diff --git a/gnu/local.mk b/gnu/local.mk
index bd0f850d53..0a1617448c 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -249,6 +249,7 @@ GNU_SYSTEM_MODULES = \
%D%/packages/docbook.scm \
%D%/packages/docker.scm \
%D%/packages/documentation.scm \
+ %D%/packages/dotnet.scm \
%D%/packages/dvtm.scm \
%D%/packages/easyrpg.scm \
%D%/packages/ebook.scm \
diff --git a/gnu/packages/dotnet.scm b/gnu/packages/dotnet.scm
new file mode 100644
index 0000000000..3084e1cf3a
--- /dev/null
+++ b/gnu/packages/dotnet.scm
@@ -0,0 +1,62 @@
+(define-module (gnu packages dotnet)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (gnu packages assembly)
+ #:use-module (gnu packages bison)
+ #:use-module (gnu packages check)
+ #:use-module (gnu packages cmake)
+ #:use-module (gnu packages compression)
+ #:use-module (gnu packages curl)
+ #:use-module (gnu packages flex)
+ #:use-module (gnu packages gettext)
+ #:use-module (gnu packages pkg-config)
+ #:use-module (gnu packages base)
+ #:use-module (gnu packages autotools)
+ #:use-module (gnu packages bdw-gc)
+ #:use-module (gnu packages fontutils)
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages icu4c)
+ #:use-module (gnu packages instrumentation)
+ #:use-module (gnu packages kerberos)
+ #:use-module (gnu packages libffi)
+ #:use-module (gnu packages linux)
+ #:use-module (gnu packages llvm)
+ #:use-module (gnu packages perl)
+ #:use-module (gnu packages photo)
+ #:use-module (gnu packages texinfo)
+ #:use-module (gnu packages tls)
+ #:use-module (gnu packages image)
+ #:use-module (gnu packages gtk)
+ #:use-module (gnu packages python)
+ #:use-module (gnu packages xml)
+ #:use-module (gnu packages xorg)
+ #:use-module (gnu packages version-control)
+ #:use-module (gnu packages)
+ #:use-module (guix modules)
+ #:use-module (guix packages)
+ #:use-module (guix download)
+ #:use-module (guix git-download)
+ #:use-module (guix gexp)
+ #:use-module (guix utils)
+ #:use-module (guix build-system gnu)
+ #:use-module (guix build-system python)
+ #:use-module (ice-9 match))
+
+(define-public treecc
+ (package
+ (name "treecc")
+ (version "0.3.10")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append
+ "https://download.savannah.gnu.org/releases/dotgnu-pnet/treecc-"
+ version ".tar.gz"))
+ (sha256
+ (base32
+ "1rzgnspg2xccdq3qsx0vi3j28h4qkrzbrjnhzvnny34fjfk217ay"))))
+ (build-system gnu-build-system)
+ (home-page "https://www.gnu.org/software/dotgnu")
+ (synopsis "Tree Compiler-Compiler.")
+ (description "The treecc program is designed to assist in the development
+of compilers and other language-based tools. It manages the generation of
+code to handle abstract syntax trees and operations upon the trees.")
+ (license license:gpl2+)))
--
2.45.2
From a3e96eea7693a554bd4cab2f531bd9f63eee850b Mon Sep 17 00:00:00 2001
Message-ID: <a3e96eea7693a554bd4cab2f531bd9f63eee850b.1732707288.git.unmush@hashbang.sh>
In-Reply-To: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
References: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
From: unmush <unmush@hashbang.sh>
Date: Tue, 26 Nov 2024 12:53:23
Subject: [PATCH 03/21] gnu: Add pnetlib-git.

* gnu/packages/dotnet.scm (pnetlib-git): New variable.

Change-Id: I3a041de181d96bfe9e447d72ddd9578e12db8014
---
gnu/packages/dotnet.scm | 57 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 57 insertions(+)

Toggle diff (67 lines)
diff --git a/gnu/packages/dotnet.scm b/gnu/packages/dotnet.scm
index e11daff48c..90ccfd2d54 100644
--- a/gnu/packages/dotnet.scm
+++ b/gnu/packages/dotnet.scm
@@ -160,3 +160,60 @@ (define-public pnet-git
to build and execute .NET applications, including a C# compiler,
assembler, disassembler, and runtime engine.")
(license license:gpl2+))))
+
+(define-public pnetlib-git
+ (let ((version "0.8.0")
+ (commit "c3c12b8b0c65f5482d03d6a4865f7670e98baf4c")
+ (revision "0"))
+ (package
+ (name "pnetlib-git")
+ (version (git-version version revision commit))
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url
+ "https://git.savannah.gnu.org/git/dotgnu-pnet/pnetlib.git")
+ (commit commit)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "04dikki3lr3m1cacirld90rpi95656b2y2mc5rkycb7s0yfdz1nk"))
+ (modules '((guix build utils)))
+ (snippet
+ #~(begin
+ (for-each delete-file (filter file-exists?
+ '("configure"
+ "config.guess"
+ "config.sub"
+ "install-sh"
+ "ltmain.sh")))
+ (for-each delete-file (find-files "." "Makefile(\\.in)?$"))
+ (substitute* (find-files "tests" "^Makefile\\.am$")
+ (("TESTS_ENVIRONMENT.*")
+ (string-append
+ "LOG_COMPILER = $(SHELL)\n"
+ "AM_LOG_FLAGS = $(top_builddir)/tools/run_test.sh"
+ " $(top_builddir)")))
+ (substitute* "tools/run_test.sh.in"
+ (("en_US") "en_US.utf8"))
+ (substitute* "tools/wrapper.sh.in"
+ (("exec .LN_S clrwrap ..1." all)
+ (string-append
+ "echo '#!@SHELL@' >> $1\n"
+ "echo exec $CLRWRAP"
+ " $(dirname $(dirname $1))"
+ "/lib/cscc/lib/$(basename $1).exe >> $1\n"
+ "chmod +x $1")))))))
+ (build-system gnu-build-system)
+ (arguments
+ (list #:make-flags #~(list "CFLAGS+=-Wno-pointer-to-int-cast")))
+ (native-inputs
+ (list autoconf automake libtool treecc))
+ (inputs
+ (list pnet-git))
+ (home-page "http://www.gnu.org/software/dotgnu/html2.0/pnet.html")
+ (synopsis "Libraries for the C# programming language")
+ (description
+ "DotGNU Portable.NET Library contains an implementation of the C# library,
+for use with .NET-capable runtime engines and applications.")
+ (license license:gpl2+))))
--
2.45.2
From fad6fc35e76caad5a729c7e21afd4af337b47d8f Mon Sep 17 00:00:00 2001
Message-ID: <fad6fc35e76caad5a729c7e21afd4af337b47d8f.1732707288.git.unmush@hashbang.sh>
In-Reply-To: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
References: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
From: unmush <unmush@hashbang.sh>
Date: Tue, 26 Nov 2024 13:13:40
Subject: [PATCH 09/21] gnu: Add mono-3.0.

* gnu/packages/dotnet.scm
(mono-3.0.12-external-repo-specs, mono-3.0): New variables.

Change-Id: I1f30041187c7d0cf6e45d56f6da9bb4a705202cf
---
gnu/packages/dotnet.scm | 63 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 63 insertions(+)

Toggle diff (73 lines)
diff --git a/gnu/packages/dotnet.scm b/gnu/packages/dotnet.scm
index 7a6214746f..3335fc58b1 100644
--- a/gnu/packages/dotnet.scm
+++ b/gnu/packages/dotnet.scm
@@ -593,3 +593,66 @@ (define-public mono-2.11.4
license:bsd-4
;; mcs/class/System.Core/System/TimeZoneInfo.Android.cs
license:asl2.0))))
+
+(define mono-3.0.12-external-repo-specs
+ ;; format: ({reponame OR (reponame dir-name)} commit sha256) ...
+ ;; if reponame starts with https:// it is treated as the repository url,
+ ;; otherwise the name of a repository under https://github.com/mono/
+ '(("aspnetwebstack" "e77b12e6cc5ed260a98447f609e887337e44e299"
+ "0rks344qr4fmp3fs1264d2qkmm348m8d1kjd7z4l94iiirwn1fq1")
+ ("cecil" "54e0a50464edbc254b39ea3c885ee91ada730705"
+ "007szbf5a14q838695lwdp7ap6rwzz3kzllgjfnibzlqipw3x2yk")
+ ("entityframework" "a5faddeca2bee08636f1b7b3af8389bd4119f4cd"
+ "0b05pzf6qwdd92pbzym32nfmw8rq36820vdzakq1kykfmddjr9a7")
+ (("ikvm-fork" "ikvm") "10b8312c8024111780ee382688cd4c8754b1f1ac"
+ "025wf9gjgfvrq42vgw91ahy3cmzcw094vx783dsp7gjdyd8q09nm")
+ ("Lucene.Net" "88fb67b07621dfed054d8d75fd50672fb26349df"
+ "1rfxqfz7hkp9rg5anvxlv6fna0xi0bnv1y8qbhf8x48l08yjb38k")
+ ("Newtonsoft.Json" "471c3e0803a9f40a0acc8aeceb31de6ff93a52c4"
+ "0dgngd5hqk6yhlg40kabn6qdnknm32zcx9q6bm2w31csnsk5978s")
+ ("rx" "17e8477b2cb8dd018d49a567526fe99fd2897857"
+ "0fyyy4jf0mma6kff6fvbvdcs5ra1bz4s063nvjjva9xlnv7sjvh4")))
+
+(define-public mono-3.0
+ (package
+ (inherit mono-2.11.4)
+ (version "3.0.12")
+ (name "mono")
+ (source (origin
+ (method git-fetch)
+ (uri
+ (git-reference
+ (url "https://gitlab.winehq.org/mono/mono.git")
+ (commit (string-append "mono-" "3.0.12"))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "110f3hcfikk6bxbrgjas5dqldci9f24gvm3vdgn4j9j7xhlcx1lj"))
+ (modules '((guix build utils)
+ (ice-9 string-fun)))
+ (snippet #~(begin
+ #$(add-external-repos
+ mono-3.0.12-external-repo-specs)
+ #$prepare-mono-source))))
+ (native-inputs (modify-inputs (package-native-inputs mono-2.11.4)
+ (replace "mono" mono-2.11.4)))
+ (license (list
+ ;; most of mcs/tools, mono/man, most of mcs/class, tests by
+ ;; default, mono/eglib, mono/metadata/sgen*,
+ ;; mono/arch/*/XXX-codegen.h
+ ;; mcs/mcs, mcs/gmcs (dual-licensed GPL)
+ ;; samples
+ license:x11
+ ;; mcs/mcs, mcs/gmcs (dual-licensed X11)
+ ;; some of mcs/tools
+ license:gpl1+ ;; note: ./mcs/LICENSE.GPL specifies no version
+ ;; mono/mono (the mono VM, I think they meant mono/mini)
+ ;; mono/support (note: directory doesn't exist, probably meant
+ ;; ./support, but that contains a copy of zlib?)
+ license:lgpl2.0+ ;; note: ./mcs/LICENSE.LGPL specifies no version
+ ;; mcs/jay
+ license:bsd-4
+ ;; mcs/class/System.Core/System/TimeZoneInfo.Android.cs
+ license:asl2.0
+ ;; ./support, contains a copy of zlib
+ license:zlib))))
--
2.45.2
From eb73e35288f55fd7e3b91aa05ec3931ffbe6f2dc Mon Sep 17 00:00:00 2001
Message-ID: <eb73e35288f55fd7e3b91aa05ec3931ffbe6f2dc.1732707288.git.unmush@hashbang.sh>
In-Reply-To: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
References: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
From: unmush <unmush@hashbang.sh>
Date: Tue, 26 Nov 2024 13:29:31
Subject: [PATCH 13/21] gnu: Add mono-5.1.0.

* gnu/packages/dotnet.scm
(mono-5.1.0-external-repo-specs, mono-5.1.0): New variables.

Change-Id: Ie58e20f75920ee0492e977c82a2e302311793946
---
gnu/packages/dotnet.scm | 68 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)

Toggle diff (78 lines)
diff --git a/gnu/packages/dotnet.scm b/gnu/packages/dotnet.scm
index 33b717b0ed..da2961bff4 100644
--- a/gnu/packages/dotnet.scm
+++ b/gnu/packages/dotnet.scm
@@ -970,3 +970,71 @@ (define-public mono-5.0.1
" "
top "/mcs/class/lib/build/mcs.exe")
make-flags)))))))))))
+
+(define mono-5.1.0-external-repo-specs
+ '(("aspnetwebstack" "e77b12e6cc5ed260a98447f609e887337e44e299"
+ "0rks344qr4fmp3fs1264d2qkmm348m8d1kjd7z4l94iiirwn1fq1")
+ (("reference-assemblies" "binary-reference-assemblies")
+ "febc100f0313f0dc9d75dd1bcea45e87134b5b55"
+ "0lpj911m2lq23r22dpy4i02fy4ykf27dx8fvqpxsxknysj2jl6y4")
+ ("bockbuild" "fd1d6c404d763c98b6f0e64e98ab65f92e808245"
+ "0l2n9863j5y20lp3fjcpbb0a9jcfk0kqmnzlsw20qchd05rjgyb0")
+ ("boringssl" "c06ac6b33d3e7442ad878488b9d1100127eff998"
+ "187zpi1rvh9i6jfccwzqq337rxxi1rgny6mjq79r08dlrh0lydzc")
+ ("buildtools" "b5cc6e6ab5f71f6c0be7b730058b426e92528479"
+ "0ldj5l4p4q8j9dhk0nifr3m0i64csvb56wlc2xd4zy80sfgmjn06")
+ ("cecil" "44bc86223530a07fa74ab87007cf264e53d63400"
+ "0smsa8i4709y1nky3hshj7ayxhjcc17wlnfdvhfay7ly5dxml84g")
+ (("cecil" "cecil-legacy") "33d50b874fd527118bc361d83de3d494e8bb55e1"
+ "1p4hl1796ib26ykyf5snl6cj0lx0v7mjh0xqhjw6qdh753nsjyhb")
+ ("corefx" "63c51e726292149b4868db71baa883e5ad173766"
+ "1406rbra83k6gw2dnnsfqcfwiy1h89y6lq64ma5rckmb5drb0ng9")
+ ("corert" "31eda261991f9f6c1add1686b6d3799f835b2978"
+ "0s0pd4m9070xlx238fdhqf2b3iyd2vzff3f0sxlyi8s0lhsrl8zv")
+ ("ikdasm" "88b67c42ca8b7d58141c176b46749819bfcef166"
+ "0b0b1dhg80r640n81iqawwkxi1k289n4zxjfj0ldd9rkvfxvlwaw")
+ (("ikvm-fork" "ikvm") "7c1e61bec8c069b2cc9e214c3094b147d76bbf82"
+ "0vmc5r4j76hkd4zis1769ppdl1h1l7z8cld0y4p1m64n86ghkzfn")
+ ("linker" "1bdcf6b7bfbe3b03fdaa76f6124d0d7374f08615"
+ "1xx6s8dcgcz803yvqgzhcgmj16c9s8vrvvl8k4y0xma5w51kn23k")
+ ("Lucene.Net.Light" "85978b7eb94738f516824341213d5e94060f5284"
+ "0d118i52m3a0vfjhfci81a2kc4qvnj23gs02hrvdrfpd1q92fyii")
+ ("Newtonsoft.Json" "471c3e0803a9f40a0acc8aeceb31de6ff93a52c4"
+ "0dgngd5hqk6yhlg40kabn6qdnknm32zcx9q6bm2w31csnsk5978s")
+ (("NuGet.BuildTasks" "nuget-buildtasks")
+ "04bdab55d8de9edcf628694cfd2001561e8f8e60"
+ "1nklxayxkdskg5wlfl44cndzqkl18v561rz03hwx7wbn5w89q775")
+ (("NUnitLite" "nunit-lite") "690603bea98aae69fca9a65130d88591bc6cabee"
+ "1f845ysjzs3yd9gcyww66dnkx484z5fknb8l0xz74sjmxk2mngwc")
+ ;; ("roslyn-binaries" "0d4198b1299bcb019973749da4d47e90f15a1e46"
+ ;; "")
+ ("rx" "b29a4b0fda609e0af33ff54ed13652b6ccf0e05e"
+ "1n1jwhmsbkcv2d806immcpzkb72rz04xy98myw355a8w5ah25yiv")
+ ;; ("xunit-binaries" "b8e20d265b368dd6252703d5afd038d0b028e388"
+ ;; "")
+ ))
+
+(define-public mono-5.1.0
+ (package
+ (inherit mono-5.0.1)
+ (version "5.1.0")
+ (name "mono")
+ (source (origin
+ (method git-fetch)
+ (uri
+ (git-reference
+ (url "https://gitlab.winehq.org/mono/mono.git")
+ (commit
+ "6fafd08b507c56f11a2eb6570703a39e5bdc0a81")))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1sxq40nay5ghhmfbdln98iri19y0h7q36r3pqnxmxnm94livx2k5"))
+ (modules '((guix build utils)
+ (ice-9 string-fun)))
+ (snippet #~(begin
+ #$(add-external-repos
+ mono-5.1.0-external-repo-specs)
+ #$@prepare-mono-source-0))))
+ (native-inputs (modify-inputs (package-native-inputs mono-5.0.1)
+ (replace "mono" mono-5.0.1)))))
--
2.45.2
From 86df1cbc189df38bdf0617381a2cb99af99c959f Mon Sep 17 00:00:00 2001
Message-ID: <86df1cbc189df38bdf0617381a2cb99af99c959f.1732707288.git.unmush@hashbang.sh>
In-Reply-To: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
References: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
From: unmush <unmush@hashbang.sh>
Date: Tue, 26 Nov 2024 13:04:13
Subject: [PATCH 07/21] gnu: Add mono-2.6.4.

* gnu/dotnet.scm (mono-2.6.4): New variable.
* gnu/packages/patches/mono-2.6.4-fixes.patch: New patch.
* gnu/local.mk (dist_patch_DATA): Register it.

Change-Id: I66e9bb2e12ca6f47b4cd827822db5bee93b64dfe
---
gnu/local.mk | 1 +
gnu/packages/dotnet.scm | 23 ++++++++++
gnu/packages/patches/mono-2.6.4-fixes.patch | 49 +++++++++++++++++++++
3 files changed, 73 insertions(+)
create mode 100644 gnu/packages/patches/mono-2.6.4-fixes.patch

Toggle diff (100 lines)
diff --git a/gnu/local.mk b/gnu/local.mk
index d08c03a689..a4611d0016 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1764,6 +1764,7 @@ dist_patch_DATA = \
%D%/packages/patches/mono-1.9.1-add-MONO_CREATE_IMAGE_VERSION.patch \
%D%/packages/patches/mono-1.9.1-fixes.patch \
%D%/packages/patches/mono-2.4.2.3-fixes.patch \
+ %D%/packages/patches/mono-2.6.4-fixes.patch \
%D%/packages/patches/mosaicatcher-unbundle-htslib.patch \
%D%/packages/patches/mrrescue-support-love-11.patch \
%D%/packages/patches/mtools-mformat-uninitialized.patch \
diff --git a/gnu/packages/dotnet.scm b/gnu/packages/dotnet.scm
index 241157cdce..4af642b9f3 100644
--- a/gnu/packages/dotnet.scm
+++ b/gnu/packages/dotnet.scm
@@ -475,3 +475,26 @@ (define-public mono-2.4.2
license:lgpl2.0+ ;; note: ./mcs/LICENSE.LGPL specifies no version
;; mcs/jay
license:bsd-4))))
+
+(define-public mono-2.6.4
+ (package
+ (inherit mono-2.4.2)
+ (version "2.6.4")
+ (name "mono")
+ (source (origin
+ (method git-fetch)
+ (uri
+ (git-reference
+ (url "https://gitlab.winehq.org/mono/mono.git")
+ (commit (string-append "mono-" "2.6.4"))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "17977w45qh8jmfsl4bhi83si4fxd8s3x8b0pxnwdzjv3bqr54c85"))
+ (modules '((guix build utils)
+ (ice-9 string-fun)))
+ (snippet prepare-mono-source)
+ (patches
+ (search-patches "mono-2.6.4-fixes.patch"))))
+ (native-inputs (modify-inputs (package-native-inputs mono-2.4.2)
+ (replace "mono" mono-2.4.2)))))
diff --git a/gnu/packages/patches/mono-2.6.4-fixes.patch b/gnu/packages/patches/mono-2.6.4-fixes.patch
new file mode 100644
index 0000000000..e802c8bb7e
--- /dev/null
+++ b/gnu/packages/patches/mono-2.6.4-fixes.patch
@@ -0,0 +1,49 @@
+diff --git a/data/mono.pc.in b/data/mono.pc.in
+index 01e0a9e5d41..d43bb187218 100644
+--- a/data/mono.pc.in
++++ b/data/mono.pc.in
+@@ -7,8 +7,6 @@ sysconfdir=@sysconfdir@
+ Name: Mono
+ Description: Mono Runtime
+ Version: @VERSION@
+-## Commented out because SLE hides devel files in the SLE SDK,
+-## which not all customers will have.
+-#Requires: glib-2.0 gthread-2.0
++Requires: glib-2.0 gthread-2.0 bdw-gc
+ Libs: -L${libdir} @export_ldflags@ -lmono @libmono_ldflags@
+ Cflags: -I${includedir} @libmono_cflags@
+diff --git a/mono-uninstalled.pc.in b/mono-uninstalled.pc.in
+index 7fa3f12dc91..2a0734362fd 100644
+--- a/mono-uninstalled.pc.in
++++ b/mono-uninstalled.pc.in
+@@ -1,6 +1,6 @@
+ Name: Mono
+ Description: Mono Runtime
+ Version: @VERSION@
+-Requires: glib-2.0 gthread-2.0
++Requires: glib-2.0 gthread-2.0 bdw-gc
+ Libs: -L@mono_build_root@/mono/mini/.libs @export_ldflags@ -lmono @libmono_ldflags@
+ Cflags: -I@abs_top_srcdir@ -I@abs_top_srcdir@/mono @libmono_cflags@
+diff --git a/mono/mini/driver.c b/mono/mini/driver.c
+index c4e7f4ccdb3..bb705c0d1fc 100644
+--- a/mono/mini/driver.c
++++ b/mono/mini/driver.c
+@@ -1302,6 +1302,7 @@ mono_main (int argc, char* argv[])
+ #endif
+ if (!g_thread_supported ())
+ g_thread_init (NULL);
++ GC_allow_register_threads();
+
+ if (mono_running_on_valgrind () && getenv ("MONO_VALGRIND_LEAK_CHECK")) {
+ GMemVTable mem_vtable;
+diff --git a/runtime/Makefile.am b/runtime/Makefile.am
+index da0c0e8671d..9d0deaf182f 100644
+--- a/runtime/Makefile.am
++++ b/runtime/Makefile.am
+@@ -1,6 +1,3 @@
+-# hack to prevent 'check' from depending on 'all'
+-AUTOMAKE_OPTIONS = cygnus
+-
+ tmpinst = _tmpinst
+
+ noinst_SCRIPTS = mono-wrapper monodis-wrapper
--
2.45.2
From 9ddd93628a17df1db7af5fed7b2d9c7f18169c56 Mon Sep 17 00:00:00 2001
Message-ID: <9ddd93628a17df1db7af5fed7b2d9c7f18169c56.1732707288.git.unmush@hashbang.sh>
In-Reply-To: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
References: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
From: unmush <unmush@hashbang.sh>
Date: Tue, 26 Nov 2024 13:14:35
Subject: [PATCH 10/21] gnu: Add mono-3.12.1.

* gnu/packages/dotnet.scm
(mono-3.12.1-external-repo-specs, mono-3.12.1): New variables.

Change-Id: Id5d13492163aabb845c47609f52287c5565497a4
---
gnu/packages/dotnet.scm | 52 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)

Toggle diff (62 lines)
diff --git a/gnu/packages/dotnet.scm b/gnu/packages/dotnet.scm
index 3335fc58b1..e1f1272088 100644
--- a/gnu/packages/dotnet.scm
+++ b/gnu/packages/dotnet.scm
@@ -656,3 +656,55 @@ (define-public mono-3.0
license:asl2.0
;; ./support, contains a copy of zlib
license:zlib))))
+
+(define mono-3.12.1-external-repo-specs
+ ;; format: ({reponame OR (reponame dir-name)} commit sha256) ...
+ '(("aspnetwebstack" "e77b12e6cc5ed260a98447f609e887337e44e299"
+ "0rks344qr4fmp3fs1264d2qkmm348m8d1kjd7z4l94iiirwn1fq1")
+ ("cecil" "33d50b874fd527118bc361d83de3d494e8bb55e1"
+ "1p4hl1796ib26ykyf5snl6cj0lx0v7mjh0xqhjw6qdh753nsjyhb")
+ ("entityframework" "a5faddeca2bee08636f1b7b3af8389bd4119f4cd"
+ "0b05pzf6qwdd92pbzym32nfmw8rq36820vdzakq1kykfmddjr9a7")
+ ("ikdasm" "7ded4decb9c39446be634d42a575fda9bc3d945c"
+ "0f3mbfizxmvr5njj123w0wn7sz85v5q2mzwijjql8w1095i0916l")
+ (("ikvm-fork" "ikvm") "22534de2098acbcf208f6b06836d122dab799e4b"
+ "1ivywy5sc594sl3bs9xrkna1dbhkp7v1mv79n96ydgq6zcs0698l")
+ ("Lucene.Net" "88fb67b07621dfed054d8d75fd50672fb26349df"
+ "1rfxqfz7hkp9rg5anvxlv6fna0xi0bnv1y8qbhf8x48l08yjb38k")
+ ("Newtonsoft.Json" "471c3e0803a9f40a0acc8aeceb31de6ff93a52c4"
+ "0dgngd5hqk6yhlg40kabn6qdnknm32zcx9q6bm2w31csnsk5978s")
+ ("rx" "00c1aadf149334c694d2a5096983a84cf46221b8"
+ "0ndam0qrnkb4gj21lapqgcy0mqw7s18viswsjyjyaaa4fgqw8kmq")))
+
+(define-public mono-3.12.1
+ (package
+ (inherit mono-3.0)
+ (version "3.12.1")
+ (name "mono")
+ (source (origin
+ (method git-fetch)
+ (uri
+ (git-reference
+ (url "https://gitlab.winehq.org/mono/mono.git")
+ (commit (string-append "mono-" "3.12.1"))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "01sxrnfch61k8v7av7ccbmy3v37ky8yp8460j6ycnbyfa3305y0f"))
+ (modules '((guix build utils)
+ (ice-9 string-fun)))
+ (snippet #~(begin
+ #$(add-external-repos
+ mono-3.12.1-external-repo-specs)
+ #$prepare-mono-source))))
+ (native-inputs (modify-inputs (package-native-inputs mono-3.0)
+ (replace "mono" mono-3.0)))
+ (arguments
+ (substitute-keyword-arguments (package-arguments mono-3.0)
+ ((#:phases phases #~%standard-phases)
+ #~(modify-phases #$phases
+ (add-after 'unpack 'set-TZ
+ (lambda _
+ ;; for some reason a default is only used if this is empty, not
+ ;; if it is unset.
+ (setenv "TZ" "")))))))))
--
2.45.2
From 0a795aa683f41673756b46acb5ec29a528c65469 Mon Sep 17 00:00:00 2001
Message-ID: <0a795aa683f41673756b46acb5ec29a528c65469.1732707288.git.unmush@hashbang.sh>
In-Reply-To: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
References: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
From: unmush <unmush@hashbang.sh>
Date: Tue, 26 Nov 2024 13:33:38
Subject: [PATCH 14/21] gnu: Add mono-5.2.0.

* gnu/packages/dotnet.scm
(mono-5.2.0-external-repo-specs, mono-5.2.0): New variables.

Change-Id: I089850bfd50f229af5a236bbc39ee9ae4787ef9f
---
gnu/packages/dotnet.scm | 67 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)

Toggle diff (77 lines)
diff --git a/gnu/packages/dotnet.scm b/gnu/packages/dotnet.scm
index da2961bff4..fb136d09c2 100644
--- a/gnu/packages/dotnet.scm
+++ b/gnu/packages/dotnet.scm
@@ -1038,3 +1038,70 @@ (define-public mono-5.1.0
#$@prepare-mono-source-0))))
(native-inputs (modify-inputs (package-native-inputs mono-5.0.1)
(replace "mono" mono-5.0.1)))))
+
+(define mono-5.2.0-external-repo-specs
+ '(("aspnetwebstack" "e77b12e6cc5ed260a98447f609e887337e44e299"
+ "0rks344qr4fmp3fs1264d2qkmm348m8d1kjd7z4l94iiirwn1fq1")
+ (("reference-assemblies" "binary-reference-assemblies")
+ "142cbeb62ffabf1dd9c1414d8dd76f93bcbed0c2"
+ "1wkd589hgb16m5zvmp9yb57agyyryaa1jj8vhl4w20i2hp22wad9")
+ ("bockbuild" "45aa142fa322f5b41051e7f40008f03346a1e119"
+ "1sjlgzh3hq251k729a1px707c1q2gnfayghgx1z5qyddnyaxna20")
+ ("boringssl" "3e0770e18835714708860ba9fe1af04a932971ff"
+ "139a0gl91a52k2r6na6ialzkqykaj1rk88zjrkaz3sdxx7nmmg6y")
+ ("buildtools" "b5cc6e6ab5f71f6c0be7b730058b426e92528479"
+ "0ldj5l4p4q8j9dhk0nifr3m0i64csvb56wlc2xd4zy80sfgmjn06")
+ ("cecil" "362e2bb00fa693d04c2d140a4cd313eb82c78d95"
+ "0bvaavlnldrja8ixb66bg33kz05950vm5sk4pz0k0zjgspfgpcvd")
+ (("cecil" "cecil-legacy") "33d50b874fd527118bc361d83de3d494e8bb55e1"
+ "1p4hl1796ib26ykyf5snl6cj0lx0v7mjh0xqhjw6qdh753nsjyhb")
+ ("corefx" "78360b22e71b70de1d8cc9588cb4ef0040449c31"
+ "1wrszafyar7q1cdfba68xd6b4d54p3iim2czmxblms1yw19ycqm7")
+ ("corert" "ed6296dfbb88d66f08601c013caee30c88c41afa"
+ "179q1aiq44bzdckg1xqm6iwyx835cp6161w5vgsfrgbw0p3kidxr")
+ ("ikdasm" "88b67c42ca8b7d58141c176b46749819bfcef166"
+ "0b0b1dhg80r640n81iqawwkxi1k289n4zxjfj0ldd9rkvfxvlwaw")
+ (("ikvm-fork" "ikvm") "7c1e61bec8c069b2cc9e214c3094b147d76bbf82"
+ "0vmc5r4j76hkd4zis1769ppdl1h1l7z8cld0y4p1m64n86ghkzfn")
+ ("linker" "c7450ca2669becddffdea7dcdcc06692e57989e1"
+ "0vd1vw6hqm1p127m6079p9n4xrckrf4iakvj41hnqfwws94w5mv1")
+ ("Lucene.Net.Light" "85978b7eb94738f516824341213d5e94060f5284"
+ "0d118i52m3a0vfjhfci81a2kc4qvnj23gs02hrvdrfpd1q92fyii")
+ ("Newtonsoft.Json" "471c3e0803a9f40a0acc8aeceb31de6ff93a52c4"
+ "0dgngd5hqk6yhlg40kabn6qdnknm32zcx9q6bm2w31csnsk5978s")
+ (("NuGet.BuildTasks" "nuget-buildtasks")
+ "8d307472ea214f2b59636431f771894dbcba7258"
+ "1h1frnj0x8k7b29ic4jisch0vlpmsmghjw554pz277f2nxaidljj")
+ (("NUnitLite" "nunit-lite") "690603bea98aae69fca9a65130d88591bc6cabee"
+ "1f845ysjzs3yd9gcyww66dnkx484z5fknb8l0xz74sjmxk2mngwc")
+ ;; ("roslyn-binaries" "dcb0a0534d5104eaf945d3d1f319dc33044b7bbe"
+ ;; "")
+ ("rx" "b29a4b0fda609e0af33ff54ed13652b6ccf0e05e"
+ "1n1jwhmsbkcv2d806immcpzkb72rz04xy98myw355a8w5ah25yiv")
+ ;; ("xunit-binaries" "b8e20d265b368dd6252703d5afd038d0b028e388"
+ ;; "")
+ ))
+
+(define-public mono-5.2.0
+ (package
+ (inherit mono-5.1.0)
+ (version "5.2.0.224")
+ (name "mono")
+ (source (origin
+ (method git-fetch)
+ (uri
+ (git-reference
+ (url "https://gitlab.winehq.org/mono/mono.git")
+ (commit "mono-5.2.0.224")))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0zsgfqyjkpix05gvgvhqyyqcwcjp5xlvcyv471q32qf307dccbfa"))
+ (modules '((guix build utils)
+ (ice-9 string-fun)))
+ (snippet #~(begin
+ #$(add-external-repos
+ mono-5.2.0-external-repo-specs)
+ #$@prepare-mono-source-0))))
+ (native-inputs (modify-inputs (package-native-inputs mono-5.1.0)
+ (replace "mono" mono-5.1.0)))))
--
2.45.2
From 4dbd59cbcedafb401a938a37c745223d661a8d63 Mon Sep 17 00:00:00 2001
Message-ID: <4dbd59cbcedafb401a938a37c745223d661a8d63.1732707288.git.unmush@hashbang.sh>
In-Reply-To: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
References: <3f8af65f72871d61fa85e6939f46cb8dac185c70.1732707288.git.unmush@hashbang.sh>
From: unmush <unmush@hashbang.sh>
Date: Wed, 27 Nov 2024 00:56:00
Subject: [PATCH 20/21] gnu: Add libgdiplus.

* gnu/packages/dotnet.scm (libgdiplus): New variable.

Change-Id: I492254c09fd6c9c8b0bc633e1f95665bfa9fe96a
---
gnu/packages/dotnet.scm | 44 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)

Toggle diff (54 lines)
diff --git a/gnu/packages/dotnet.scm b/gnu/packages/dotnet.scm
index 3309cec3f5..3e2eca1871 100644
--- a/gnu/packages/dotnet.scm
+++ b/gnu/packages/dotnet.scm
@@ -1591,3 +1591,47 @@ (define-public mono-5.10.0
(("Facades/System\\.Data\\.Common_REFS := " all)
(string-append all "System System.Xml ")))
(apply invoke "make" "CSC=mcs" make-flags)))))))))))
+
+(define-public libgdiplus
+ (package
+ (name "libgdiplus")
+ (version "6.2")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/mono/libgdiplus.git")
+ (commit "94a49875487e296376f209fe64b921c6020f74c0")))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1gwmhrddr8kdlfprjqcd6gqiy8p5v8sl9215dbd949j1l76szl9v"))
+ (modules '((guix build utils)))
+ (snippet #~(substitute* "./Makefile.am"
+ (("\\./update_submodules\\.sh")
+ ":")))))
+ (build-system gnu-build-system)
+ (native-inputs
+ (list automake
+ autoconf
+ googletest-1.8
+ libtool
+ pkg-config
+ which))
+ (inputs (list cairo
+ freetype
+ fontconfig
+ gettext-minimal
+ giflib
+ glib
+ libexif
+ libjpeg-turbo
+ libpng
+ libtiff
+ libx11))
+ (synopsis "Open Source implementation of the GDI+ API")
+ (description "Libgdiplus is the Mono library that provides a
+GDI+-compatible API on non-Windows operating systems. It uses Cairo to do
+most of the heavy lifting.")
+ (home-page "https://github.com/mono/libgdiplus")
+ (license license:expat)))
--
2.45.2
A
A
Aaron Covrig wrote on 5 Dec 07:21 +0100
(address . 74609@debbugs.gnu.org)
CAK7qAcSawQ5-FZmi9v5aOo_Bw9Q0-XbfiU1rk3WfQetYsjMU4A@mail.gmail.com
Thank you for this unmush, that is quite the achievement. The whole C# and
dotnet tooling flabbergasts me, but this definitely could help. I was a bit
disappointed with the previous removal (but totally understand), hopefully
this can be merged in as there are a few nice programs that are written in
C# (but they also require dotnet...).

v/r,

Aaron
Attachment: file
R
R
Richard Sent wrote on 5 Dec 23:07 +0100
(name . unmush)(address . unmush@proton.me)(address . 74609@debbugs.gnu.org)
8734j1yeax.fsf@freakingpenguin.com
Congratulations on the achievement! I want to thank you for your
writeup. I found it very interesting!

--
Take it easy,
Richard Sent
Making my computer weirder one commit at a time.
L
L
Ludovic Courtès wrote 11 hours ago
(name . unmush)(address . unmush@proton.me)(address . 74609@debbugs.gnu.org)
87ttb83tzc.fsf@gnu.org
Hi,

unmush <unmush@proton.me> skribis:

Toggle quote (11 lines)
> We used to have a mono package, but it was removed due to includingbootstrap binaries (among others).  This patch series introduces a full,
> 17-mono-package sequence that takes us from a mono-1.2.6 built fully
> from source to mono-6.12.0 built fully from source, using only packages
> that already have full bootstrap paths.  I make no promise that this is
> the shortest or most optimal path, but it exists and I have verified it
> works.
>
> As I've spent what is probably an unreasonable amount of time working
> toward this, I thought I'd share some of my thoughts, experiences, and
> commentary.  Sorry in advance if it gets a bit rambly or lecture-ish.

I join others in congratulating you! This is very impressive, and a
great step forward.

I’ll make time to review and apply those patches if nobody beats me at it.

Thank you!

Ludo’.
J
J
Janneke Nieuwenhuizen wrote 6 hours ago
(name . unmush)(address . unmush@proton.me)(address . 74609@debbugs.gnu.org)
87cyhvixwq.fsf@gnu.org
Ludovic Courtès writes:

Toggle quote (18 lines)
> unmush <unmush@proton.me> skribis:
>
>> We used to have a mono package, but it was removed due to
>> includingbootstrap binaries (among others).  This patch series
>> introduces a full,
>> 17-mono-package sequence that takes us from a mono-1.2.6 built fully
>> from source to mono-6.12.0 built fully from source, using only packages
>> that already have full bootstrap paths.  I make no promise that this is
>> the shortest or most optimal path, but it exists and I have verified it
>> works.
>>
>> As I've spent what is probably an unreasonable amount of time working
>> toward this, I thought I'd share some of my thoughts, experiences, and
>> commentary.  Sorry in advance if it gets a bit rambly or lecture-ish.
>
> I join others in congratulating you! This is very impressive, and a
> great step forward.

+1

Impressive, thank you!

Greetings,
Janneke

--
Janneke Nieuwenhuizen <janneke@gnu.org> | GNU LilyPond https://LilyPond.org
Freelance IT https://www.JoyOfSource.com| Avatar® https://AvatarAcademy.com
?
Your comment

Commenting via the web interface is currently disabled.

To comment on this conversation send an email to 74609@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 74609
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch