1
Fork 0
mirror of https://https.git.savannah.gnu.org/git/guix.git/ synced 2025-07-13 02:20:53 +02:00

gnu: Add msbuild.

* gnu/packages/patches/mono-msbuild-15.7.179-fix-build.patch: New file.
* gnu/packages/patches/mono-msbuild-15.7.179-fix-resources.patch: New file.
* gnu/local.mk (dist_patch_DATA): Register them.
* gnu/packages/dotnet.scm (mono-msbuild): New variable.
[source]: Use patches.

Change-Id: I02cdd6b43368c07d8afad1ee1c80159d91ec7e16
This commit is contained in:
Danny Milosavljevic 2025-06-15 22:01:58 +02:00
parent 15a43c7431
commit 5239ec21fd
No known key found for this signature in database
GPG key ID: E71A35542C30BAA5
4 changed files with 839 additions and 99 deletions

View file

@ -1857,6 +1857,8 @@ dist_patch_DATA = \
%D%/packages/patches/mcrypt-CVE-2012-4409.patch \
%D%/packages/patches/mcrypt-CVE-2012-4426.patch \
%D%/packages/patches/mcrypt-CVE-2012-4527.patch \
%D%/packages/patches/mono-msbuild-15.7.179-fix-build.patch \
%D%/packages/patches/mono-msbuild-15.7.179-fix-resources.patch \
%D%/packages/patches/libmemcached-build-with-gcc7.patch \
%D%/packages/patches/libmhash-hmac-fix-uaf.patch \
%D%/packages/patches/libmodbus-disable-networking-test.patch \

View file

@ -1,6 +1,7 @@
(define-module (gnu packages dotnet)
#:use-module ((guix licenses) #:prefix license:)
#:use-module (gnu packages assembly)
#:use-module (gnu packages bash)
#:use-module (gnu packages bison)
#:use-module (gnu packages check)
#:use-module (gnu packages cmake)
@ -1074,16 +1075,17 @@ unused0:")))))
(lambda* (#:key make-flags #:allow-other-keys)
(apply invoke "make" "-C" "mcs/tools/resx2sr" make-flags)))
(add-after 'install 'install-resx2sr
(lambda* (#:key make-flags #:allow-other-keys)
(lambda* (#:key inputs make-flags #:allow-other-keys)
(apply invoke "make" "-C" "mcs/tools/resx2sr" "install" make-flags)
;; They don't install a wrapper script--but we need it for
;; bootstrapping MSBuild.
(let ((resx2sr (string-append #$output "/bin/resx2sr")))
(call-with-output-file resx2sr
(lambda (port)
(format port "#!/bin/sh
(format port "#!~a
exec ~s ~s \"$@\"
"
(search-input-file inputs "/bin/bash")
(string-append #$output "/bin/mono")
(string-append #$output "/lib/mono/4.5/resx2sr.exe"))))
(chmod resx2sr #o755))))))))
@ -1934,7 +1936,8 @@ most of the heavy lifting.")
(define-public mono mono-6.12.0)
(define mono-system-collections-immutable-bootstrap
(define-public mono-system-collections-immutable-bootstrap
(hidden-package
(package
(name "mono-system-collections-immutable-bootstrap")
(version
@ -1945,9 +1948,9 @@ most of the heavy lifting.")
(native-inputs
(list mono))
(arguments
(list #:phases
(list #:tests? #f ; tests would require xunit which is not in the bootstrap path.
#:phases
#~(modify-phases %standard-phases
(delete 'bootstrap)
(add-after 'unpack 'prepare
(lambda _
(chdir "external/corefx/src/System.Collections.Immutable/src")
@ -1955,7 +1958,7 @@ most of the heavy lifting.")
;; I don't want to drag System.Security.AccessControl into the bootstrap path.
(("new ResourceManager[(]ResourceType[)]")
"new ResourceManager(\"System.Collections.Immutable\", typeof(SR).Assembly)"))))
(delete 'configure)
(delete 'configure) ; no "configure" script exists
(replace 'build
(lambda* (#:key inputs #:allow-other-keys)
(invoke "resx2sr" "-o" "SR.cs" "-n" "System.SR"
@ -1969,7 +1972,6 @@ most of the heavy lifting.")
"../../Common/src/System/Runtime/Versioning/NonVersionableAttribute.cs"
"../../Common/src/System/SR.cs"
(find-files "." "\\.cs$"))))
(delete 'check)
(replace 'install
(lambda* (#:key outputs #:allow-other-keys)
(let* ((lib-dir (string-append #$output "/lib/mono/4.5")))
@ -1980,9 +1982,10 @@ most of the heavy lifting.")
(description "This package builds the System.Collections.Immutable library from
the source code included within the Mono source tree.")
(home-page "https://dot.net/")
(license license:expat)))
(license license:expat))))
(define mono-system-reflection-metadata-bootstrap
(define-public mono-system-reflection-metadata-bootstrap
(hidden-package
(package
(name "mono-system-reflection-metadata-bootstrap")
;; Upstream version 1.4.2; but for bootstrap packages it's more useful to have the mono version here.
@ -1996,9 +1999,9 @@ the source code included within the Mono source tree.")
(native-inputs
(list mono))
(arguments
(list #:phases
(list #:tests? #f ; would require xunit which is not in the bootstrap path
#:phases
#~(modify-phases %standard-phases
(delete 'bootstrap)
(add-after 'unpack 'chdir
(lambda _
(chdir "external/corefx/src/System.Reflection.Metadata/src")
@ -2018,7 +2021,7 @@ the source code included within the Mono source tree.")
"./System/Reflection/Internal/Utilities/EncodingHelper.netcoreapp.cs"
"./System/Reflection/Internal/Utilities/FileStreamReadLightUp.netstandard1.1.cs"
"./System/Reflection/Internal/Utilities/MemoryMapLightUp.netstandard1.1.cs"))))
(delete 'configure)
(delete 'configure) ; no "configure" script exists
(replace 'build
(lambda* (#:key inputs outputs #:allow-other-keys)
(invoke "resx2sr" "-o" "SR.cs" "-n" "System.SR" "--warn-mismatch"
@ -2028,13 +2031,11 @@ the source code included within the Mono source tree.")
"-langversion:7.2"
"-unsafe"
"-out:System.Reflection.Metadata.dll"
; ,(string-append "-r:" buffers-dll)
(string-append "-r:"
(search-input-file inputs
"/lib/mono/4.5/System.Collections.Immutable.dll"))
"../../Common/src/System/SR.cs"
(find-files "." "\\.cs$"))))
(delete 'check)
(replace 'install
(lambda* (#:key outputs #:allow-other-keys)
(let* ((lib-dir (string-append #$output "/lib/mono/4.5")))
@ -2043,4 +2044,663 @@ the source code included within the Mono source tree.")
(description "This package builds the System.Reflection.Metadata library from
the source code included within the Mono source tree.")
(home-page "https://dot.net/")
(license license:expat))))
;; too new version: 15.9.21.664
;; too old (no support for mono) version: 14.0
(define-public msbuild
(package
(name "msbuild")
(version "15.7.179")
(source
(origin
(method git-fetch)
(uri (git-reference
(url "https://github.com/dotnet/msbuild")
(commit (string-append "v" version))))
(file-name (git-file-name name version))
(sha256
(base32
"1fhd4z9575lwgy6l3wisih7g6qd6j3wb99kz246028dzm0rh3cfh"))
(patches
(search-patches
"mono-msbuild-15.7.179-fix-build.patch"
"mono-msbuild-15.7.179-fix-resources.patch"))))
(build-system gnu-build-system)
(inputs
(list bash-minimal
mono mono-system-reflection-metadata-bootstrap
mono-system-collections-immutable-bootstrap))
(arguments
(list #:tests? #f ; would require xunit which is not in the bootstrap path
#:phases
#~(modify-phases %standard-phases
(replace 'configure
(lambda _
(define (generate-version-file filename version-str internals-list)
(call-with-output-file filename
(lambda (port)
(format port
"[assembly: System.Reflection.AssemblyVersion(\"~a\")]~%"
version-str)
(format port
"[assembly: System.Reflection.AssemblyFileVersion(\"~a\")]~%"
version-str)
;; TODO: and commit id, if any.
(format port
"[assembly: System.Reflection.AssemblyInformationalVersion(\"~a\")]~%"
version-str)
(for-each
(lambda (internal-name)
(format port
"[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(\"~a\")]~%"
internal-name))
internals-list))))
(let ((version #$(package-version this-package)))
(substitute* "src/Build/Resources/AssemblyResources.cs"
;; There's a caller that has a caller that checks for null.
;;
;; But if this check is here, the high-level fallback will
;; not work since it only falls back on null, not on
;; exception.
;;
;; So what's this about?! Remove it.
(("ErrorUtilities.VerifyThrow[(]resource != null, .*")
"\n"))
(substitute* "src/Shared/AssemblyNameExtension.cs"
(("\\<ISerializable\\>")
"System.Runtime.Serialization.ISerializable")
(("\\<StreamingContext\\>")
"System.Runtime.Serialization.StreamingContext")
(("\\<SerializationInfo\\>")
"System.Runtime.Serialization.SerializationInfo"))
;; ThisAssembly would have been generated by MSBuild--which we don't have yet.
(substitute* '("src/Shared/CommunicationsUtilities.cs"
"src/Tasks/StronglyTypedResourceBuilder.cs")
(("ThisAssembly[.]AssemblyInformationalVersion")
(string-append "\"" version "\""))
(("ThisAssembly[.]Version")
(string-append "\"" version "\"")))
(substitute* "src/Shared/FrameworkLocationHelper.cs"
;; That is unused anyway.
(("^using Microsoft.Build.Evaluation;")
""))
(substitute* '("src/Tasks/AspNetCompiler.cs"
"src/Tasks/AxTlbBaseTask.cs"
"src/Tasks/AxImp.cs"
"src/Tasks/TlbImp.cs"
"src/Tasks/Exec.cs"
"src/Tasks/ResGen.cs"
"src/Tasks/LC.cs"
"src/Tasks/SGen.cs"
"src/Tasks/WinMDExp.cs")
(("protected override bool ValidateParameters")
"protected internal override bool ValidateParameters")
(("override protected bool ValidateParameters") ; SGen.cs
"protected internal override bool ValidateParameters"))
(substitute* "src/Shared/Modifiers.cs"
(("^using Microsoft.Build.Internal;")
""))
(substitute* "src/MSBuild/OutOfProcTaskHostNode.cs"
(("^using Microsoft.Build.BackEnd;")
"using Microsoft.Build.BackEnd;
using Microsoft.Build.BackEnd.Components.Caching;"))
(generate-version-file "Version-Framework.cs" version
'("Microsoft.Build.Utilities.Core"
"Microsoft.Build.Tasks.Core"
"Microsoft.Build.Tasks"
"Microsoft.Build"))
(generate-version-file "Version-Utilities.cs" version
'("Microsoft.Build"
"Microsoft.Build.Tasks.Core"
"Microsoft.Build.Tasks"
"MSBuild"))
(generate-version-file "Version.cs" version
'("MSBuild"))
(generate-version-file "Version-exe.cs" version
'()))))
(replace 'build
(lambda* (#:key inputs #:allow-other-keys)
(let* ((mcs-flags '("-langversion:7.2" "-unsafe" "-d:NET472" "-d:STRONG_NAME"
"-d:MONO" "-d:STANDALONEBUILD"
;; Otherwise the build would fail.
"-d:FEATURE_COM_INTEROP"
;; Otherwise it would try to load shell32.
"-d:FEATURE_SPECIAL_FOLDERS"
;"-d:FEATURE_BINARY_SERIALIZATION"
;"-d:FEATURE_ASSEMBLY_LOADFROM"
;"-d:FEATURE_RESX_RESOURCE_READER"
"-d:FEATURE_RESGENCACHE"
"-d:FEATURE_CODEDOM"
;"-d:FEATURE_SYSTEM_CONFIGURATION"
"-d:FEATURE_APPDOMAIN"
;"-d:FEATURE_APM" ; ?
"-d:FEATURE_TYPE_INVOKEMEMBER"
"-d:FEATURE_APPDOMAIN_UNHANDLED_EXCEPTION")))
(mkdir "artifacts")
;;; --- 1. Build Microsoft.Build.Framework.dll
;;; Note: No generating SR.cs for now.
(invoke "resgen" "src/Shared/Resources/Strings.shared.resx"
"artifacts/Microsoft.Build.Framework.Strings.shared.resources")
(apply invoke "mcs"
(append mcs-flags
'("-target:library" "-out:artifacts/Microsoft.Build.Framework.dll"
"-resource:artifacts/Microsoft.Build.Framework.Strings.shared.resources"
"-r:System.Xaml.dll"
"Version-Framework.cs")
(find-files "src/Framework" "\\.cs$")
(list "src/Shared/Constants.cs"
"src/Shared/BinaryWriterExtensions.cs")))
;;; --- 2. Build Microsoft.Build.Utilities.Core.dll
;; No resx2sr since src/Utilities/AssemblyResources.cs is hand-written.
(invoke "resgen" "src/Shared/Resources/Strings.shared.resx"
"artifacts/Microsoft.Build.Utilities.Core.Strings.shared.resources")
(invoke "resgen" "src/Utilities/Resources/Strings.resx"
"artifacts/Microsoft.Build.Utilities.Core.Strings.resources")
(apply invoke "mcs"
(append mcs-flags
'("-target:library" "-out:artifacts/Microsoft.Build.Utilities.Core.dll"
"-resource:artifacts/Microsoft.Build.Utilities.Core.Strings.shared.resources"
"-resource:artifacts/Microsoft.Build.Utilities.Core.Strings.resources"
"-r:System.Runtime.Serialization.dll"
"-r:artifacts/Microsoft.Build.Framework.dll"
"src/Utilities/AssemblyResources.cs"
"Version-Utilities.cs")
(map (lambda (f) (string-append "src/Utilities/" f))
'("SDKManifest.cs"
"ApiContract.cs"
"SDKType.cs"
"Logger.cs"
"TrackedDependencies/FlatTrackingData.cs"
"TrackedDependencies/CanonicalTrackedOutputFiles.cs"
"TrackedDependencies/CanonicalTrackedInputFiles.cs"
"TrackedDependencies/CanonicalTrackedFilesHelper.cs"
"TrackedDependencies/FileTracker.cs"
"TrackedDependencies/DependencyTableCache.cs"
"AssemblyFolders/AssemblyFoldersExInfo.cs"
"AssemblyFolders/AssemblyFoldersFromConfigInfo.cs"
"AssemblyInfo.cs"
"ProcessorArchitecture.cs"
"FxCopExclusions/Microsoft.Build.Utilities.Suppressions.cs"
"PlatformManifest.cs"
"ExtensionSDK.cs"
"CommandLineBuilder.cs"
"TaskItem.cs"
"ToolTask.cs"
"TargetPlatformSDK.cs"
"AppDomainIsolatedTask.cs"
"Task.cs"
"ProcessExtensions.cs"
"MuxLogger.cs"))
(map (lambda (f) (string-append "src/Shared/" f))
'("FxCopExclusions/Microsoft.Build.Shared.Suppressions.cs"
"EncodingStringWriter.cs"
"EncodingUtilities.cs"
"CopyOnWriteDictionary.cs"
"Tracing.cs"
"TaskLoggingHelper.cs"
"TaskLoggingHelperExtension.cs"
"EventArgsFormatting.cs"
"FileDelegates.cs" ; req by tasks
"NativeMethodsShared.cs" ; again ???
"MSBuildNameIgnoreCaseComparer.cs"
"BuildEventFileInfo.cs"
"ErrorUtilities.cs"
"EscapingUtilities.cs"
"FileUtilities.cs"
"FileUtilities.GetFolderPath.cs"
"TempFileUtilities.cs"
"Modifiers.cs"
"FileUtilitiesRegex.cs"
"HybridDictionary.cs"
"IConstrainedEqualityComparer.cs"
"ResourceUtilities.cs"
"StringBuilderCache.cs"
"Traits.cs"
"IElementLocation.cs"
"INodePacket.cs"
"INodePacketFactory.cs"
"INodePacketHandler.cs"
"INodePacketTranslatable.cs"
"INodePacketTranslator.cs"
"ExceptionHandling.cs"
"ReadOnlyEmptyCollection.cs"
"OpportunisticIntern.cs"
"AssemblyUtilities.cs"
"ReadOnlyEmptyDictionary.cs"
"CanonicalError.cs"
"VisualStudioLocationHelper.cs"
"AssemblyFolders/Serialization/AssemblyFolderItem.cs"
"AssemblyFolders/Serialization/AssemblyFolderCollection.cs"
"BuildEnvironmentHelper.cs"
"EnvironmentUtilities.cs"
"VersionUtilities.cs"
"InternalErrorException.cs"))))
;;; --- 3. Build Microsoft.Build.Tasks.Core.dll
;; No resx2sr since src/Tasks/AssemblyResources.cs is
;; hand-written.
(invoke "resgen" "src/Tasks/Resources/Strings.resx"
"artifacts/Microsoft.Build.Tasks.Core.Strings.resources")
(apply invoke "mcs"
(append mcs-flags
`("-d:MICROSOFT_BUILD_TASKS"
"-target:library"
"-out:artifacts/Microsoft.Build.Tasks.Core.dll"
"-resource:artifacts/Microsoft.Build.Tasks.Core.Strings.resources,Microsoft.Build.Tasks.Core.Strings"
"-r:System.Xml.Linq.dll"
"-r:artifacts/Microsoft.Build.Framework.dll"
;; This should contain ToolLocationHelper--but it's impossible.
"-r:artifacts/Microsoft.Build.Utilities.Core.dll"
"-r:System.Windows.Forms.dll" ; ResXDataNode
,(string-append "-r:"
(search-input-file inputs
"/lib/mono/4.5/System.Reflection.Metadata.dll"))
,(string-append "-r:"
(search-input-file inputs
"lib/mono/4.5/System.Collections.Immutable.dll"))
"Version.cs")
(map (lambda (f) (string-append "src/Tasks/" f))
'(;; Otherwise impossible to use since it requires weird things.
"../Utilities/ToolLocationHelper.cs"
"Delegate.cs"
"StrongNameUtils.cs"
"AssemblyRegistrationCache.cs"
"StateFileBase.cs"
"AppDomainIsolatedTaskExtension.cs"
"SdkToolsPathUtility.cs"
"StronglyTypedResourceBuilder.cs"
"Al.cs" "AppConfig/AppConfig.cs"
"AppConfig/AppConfigException.cs"
"AppConfig/BindingRedirect.cs"
"AppConfig/DependentAssembly.cs"
"AppConfig/RuntimeSection.cs"
"AspNetCompiler.cs"
"AssignCulture.cs"
"AssignLinkMetadata.cs"
"AssignProjectConfiguration.cs"
"AssignTargetPath.cs"
"AssemblyDependency/AssemblyFoldersExResolver.cs"
"AssemblyDependency/AssemblyFoldersFromConfig/AssemblyFoldersFromConfigCache.cs"
"AssemblyDependency/AssemblyFoldersFromConfig/AssemblyFoldersFromConfigResolver.cs"
"AssemblyDependency/AssemblyFoldersResolver.cs"
"AssemblyDependency/AssemblyInformation.cs"
"AssemblyDependency/AssemblyNameReference.cs"
"AssemblyDependency/AssemblyNameReferenceAscendingVersionComparer.cs"
"AssemblyDependency/AssemblyResolution.cs"
"AssemblyDependency/AssemblyResolutionConstants.cs"
"AssemblyDependency/BadImageReferenceException.cs"
"AssemblyDependency/CandidateAssemblyFilesResolver.cs"
"AssemblyDependency/ConflictLossReason.cs"
"AssemblyDependency/CopyLocalState.cs"
"AssemblyDependency/DependencyResolutionException.cs"
"AssemblyDependency/DirectoryResolver.cs"
"AssemblyDependency/DisposableBase.cs"
"AssemblyDependency/FrameworkPathResolver.cs"
"AssemblyDependency/GacResolver.cs"
"AssemblyDependency/GlobalAssemblyCache.cs"
"AssemblyDependency/HintPathResolver.cs"
"AssemblyDependency/InstalledAssemblies.cs"
"AssemblyDependency/InvalidReferenceAssemblyNameException.cs"
"AssemblyDependency/NoMatchReason.cs"
"AssemblyDependency/RawFilenameResolver.cs"
"AssemblyDependency/Reference.cs"
"AssemblyDependency/ReferenceResolutionException.cs"
"AssemblyDependency/ReferenceTable.cs"
"AssemblyDependency/ResolutionSearchLocation.cs"
"AssemblyDependency/Resolver.cs"
"AssemblyDependency/ResolveAssemblyReference.cs"
"AssemblyDependency/TaskItemSpecFilenameComparer.cs"
"AssemblyDependency/UnificationReason.cs"
"AssemblyDependency/UnificationVersion.cs"
"AssemblyDependency/UnifiedAssemblyName.cs"
"AssemblyDependency/WarnOrErrorOnTargetArchitectureMismatchBehavior.cs"
"AssemblyDependency/GenerateBindingRedirects.cs"
"AssemblyFolder.cs" "AssemblyInfo.cs" "AssemblyRemapping.cs"
"AxImp.cs"
"AxTlbBaseTask.cs"
"BuildCacheDisposeWrapper.cs"
"CallTarget.cs"
"CodeTaskFactory.cs"
"CombinePath.cs"
"CommandLineBuilderExtension.cs"
"ComReferenceResolutionException.cs"
"ComReferenceTypes.cs"
"ComReferenceWrapperInfo.cs"
"ConvertToAbsolutePath.cs"
"Copy.cs"
"CreateCSharpManifestResourceName.cs"
"CreateItem.cs"
"CreateManifestResourceName.cs"
"CreateProperty.cs"
"CreateVisualBasicManifestResourceName.cs"
"CSharpParserUtilities.cs"
"Culture.cs"
"CultureInfoCache.cs"
"Delete.cs"
"Dependencies.cs"
"DependencyFile.cs"
"Error.cs"
"ErrorFromResources.cs"
"Exec.cs"
"ExtractedClassName.cs"
"FileIO/ReadLinesFromFile.cs"
"FileIO/WriteLinesToFile.cs"
"FileState.cs"
"FindAppConfigFile.cs"
"FindInList.cs"
"FindInvalidProjectReferences.cs"
"FormatUrl.cs"
"FormatVersion.cs"
"FxCopExclusions/Microsoft.Build.Tasks.Suppressions.cs"
"GenerateResource.cs"
"GetAssemblyIdentity.cs"
"GetFrameworkPath.cs"
"GetFrameworkSDKPath.cs"
"GetInstalledSDKLocations.cs"
"GetReferenceAssemblyPaths.cs"
"GetSDKReferenceFiles.cs"
"Hash.cs"
"IAnalyzerHostObject.cs"
"ICscHostObject.cs"
"ICscHostObject2.cs"
"ICscHostObject3.cs"
"ICscHostObject4.cs"
"IComReferenceResolver.cs"
"IVbcHostObject.cs"
"IVbcHostObject2.cs"
"IVbcHostObject3.cs"
"IVbcHostObject4.cs"
"IVbcHostObject5.cs"
"IVbcHostObjectFreeThreaded.cs"
"InstalledSDKResolver.cs"
"InvalidParameterValueException.cs"
"LC.cs"
"ListOperators/FindUnderPath.cs"
"ListOperators/RemoveDuplicates.cs"
"LockCheck.cs" "MakeDir.cs"
"ManifestUtil/ApplicationIdentity.cs"
"ManifestUtil/AssemblyIdentity.cs"
"ManifestUtil/AssemblyReference.cs"
"ManifestUtil/AssemblyReferenceCollection.cs"
"ManifestUtil/BaseReference.cs"
"ManifestUtil/CngLightup.cs"
"ManifestUtil/ComImporter.cs"
"ManifestUtil/CompatibleFramework.cs"
"ManifestUtil/CompatibleFrameworkCollection.cs"
"ManifestUtil/Constants.cs"
"ManifestUtil/ConvertUtil.cs"
"ManifestUtil/EmbeddedManifestReader.cs"
"ManifestUtil/FileAssociation.cs"
"ManifestUtil/FileAssociationCollection.cs"
"ManifestUtil/FileReference.cs"
"ManifestUtil/FileReferenceCollection.cs"
"ManifestUtil/ManifestFormatter.cs"
"ManifestUtil/MetadataReader.cs"
"ManifestUtil/NativeMethods.cs"
"ManifestUtil/OutputMessage.cs"
"ManifestUtil/PathUtil.cs"
"ManifestUtil/RSAPKCS1SHA256SignatureDescription.cs"
"ManifestUtil/Util.cs"
"ManifestUtil/XmlNamespaces.cs"
"ManifestUtil/XmlUtil.cs"
"ManifestUtil/XPaths.cs"
"Message.cs"
"Move.cs"
"MSBuild.cs"
"NativeMethods.cs"
"ParserState.cs"
"RCWForCurrentContext.cs"
"RedistList.cs"
"RegisterAssembly.cs"
"RemoveDir.cs"
"RequiresFramework35SP1Assembly.cs"
"ResGen.cs"
"ResGenDependencies.cs"
"ResolveCodeAnalysisRuleSet.cs"
"ResolveKeySource.cs"
"ResolveManifestFiles.cs"
"ResolveNonMSBuildProjectOutput.cs"
"ResolveProjectBase.cs"
"ResolveSDKReference.cs"
"SGen.cs"
"StrongNameException.cs"
"System.Design.cs"
"TaskExtension.cs"
"Telemetry.cs"
"TlbImp.cs"
"ToolTaskExtension.cs"
"Touch.cs"
"UnregisterAssembly.cs"
"VisualBasicParserUtilities.cs"
"Warning.cs"
"WinMDExp.cs"
"WriteCodeFragment.cs"
"XmlPeek.cs"
"XmlPoke.cs"
"XslTransformation.cs"
"AssemblyDependency/AssemblyMetadata.cs"))
(append
(map (lambda (f) (string-append "src/Shared/LanguageParser/" f))
'("CSharptokenCharReader.cs"
"CSharptokenizer.cs"
"tokenChar.cs"
"token.cs"
"VisualBasictokenCharReader.cs"
"VisualBasictokenizer.cs"
"CSharptokenEnumerator.cs"
"StreamMappedString.cs"
"tokenCharReader.cs"
"tokenEnumerator.cs"
"VisualBasictokenEnumerator.cs"))
'("src/Shared/AssemblyNameExtension.cs"
"src/Shared/Constants.cs"
"src/Shared/NGen.cs"
"src/Shared/PropertyParser.cs"
"src/Shared/ConversionUtilities.cs"
"src/Shared/MetadataConversionUtilities.cs"
"src/Shared/AssemblyNameComparer.cs"
"src/Shared/AssemblyNameReverseVersionComparer.cs"
"src/Shared/FileMatcher.cs"
"src/Shared/RegistryHelper.cs"
"src/Shared/StrongNameHelpers.cs"
"src/Shared/AssemblyFolders/AssemblyFoldersFromConfig.cs" ; class
;; Requires Evaluation.
"src/Shared/FrameworkLocationHelper.cs"))))
;;; --- 4. Build Microsoft.Build.dll (The Main Engine)
;; src/Build/Resources/AssemblyResources.cs was
;; hand-written to fall-back to EXE resources,
;; so no resx2sr here.
(invoke "resgen" "src/Shared/Resources/Strings.shared.resx"
"artifacts/Microsoft.Build.Strings.shared.resources")
(invoke "resgen" "src/Build/Resources/Strings.resx"
"artifacts/Microsoft.Build.Strings.resources")
(invoke "resgen" "src/MSBuild/Resources/Strings.resx"
"artifacts/Microsoft.Build.Strings.commandline.resources")
(apply invoke "mcs"
(append mcs-flags
`("-d:BUILD_ENGINE"
"-d:FEATURE_ASSEMBLY_LOADFROM"
"-d:FEATURE_SYSTEM_CONFIGURATION"
"-target:library"
"-out:artifacts/Microsoft.Build.dll"
"-resource:artifacts/Microsoft.Build.Strings.shared.resources,Microsoft.Build.Strings.shared.resources"
"-resource:artifacts/Microsoft.Build.Strings.resources,Microsoft.Build.Strings.resources"
"-resource:artifacts/Microsoft.Build.Strings.commandline.resources,Microsoft.Build.Strings.commandline.resources"
"-r:System.Configuration.dll"
"-r:System.Threading.Tasks.Dataflow.dll"
"-r:System.IO.Compression.dll"
"-r:artifacts/Microsoft.Build.Framework.dll"
,(string-append "-r:"
(search-input-file inputs
"/lib/mono/4.5/System.Collections.Immutable.dll"))
"Version.cs")
(filter (lambda (name)
(not (string-contains name "/Originals/")))
(find-files "src/Build" "\\.cs$"))
(map (lambda (f) (string-append "src/Shared/" f))
'("CollectionHelpers.cs"
"Constants.cs"
"EscapingUtilities.cs"
"FileUtilities.cs"
"FileUtilitiesRegex.cs"
"TempFileUtilities.cs"
"FileUtilities.GetFolderPath.cs"
"InterningBinaryReader.cs"
"MSBuildNameIgnoreCaseComparer.cs"
"NativeMethodsShared.cs"
"ResourceUtilities.cs"
"StringBuilderCache.cs"
"Traits.cs"
"IKeyed.cs"
"Pair.cs"
"EscapingStringExtensions/EscapingStringExtensions.cs"
"NodeShutdown.cs"
"NodeEngineShutdownReason.cs"
"NodePacketFactory.cs"
"INodeEndpoint.cs"
"NodeBuildComplete.cs"
"LogMessagePacketBase.cs"
"NodeEndpointOutOfProcBase.cs"
"ProjectFileErrorUtilities.cs"
"TaskHostConfiguration.cs"
"TaskHostTaskCancelled.cs"
"TaskHostTaskComplete.cs"
"ToolsetElement.cs"
"TaskEngineAssemblyResolver.cs"
"RegisteredTaskObjectCacheBase.cs"
"TypeLoader.cs"
"LoadedType.cs"
"AssemblyLoadInfo.cs"
"ReuseableStringBuilder.cs"
"TaskParameter.cs"
"TaskParameterTypeVerifier.cs"
"OutOfProcTaskHostTaskResult.cs"
"VisualStudioConstants.cs"
"CommunicationsUtilities.cs"
"XMakeAttributes.cs"
"XMakeElements.cs"
;; Yes, again. It has a feature flag check.
"TaskLoggingHelper.cs"
"TaskLoggingHelperExtension.cs"
"AssemblyNameComparer.cs"
"EncodingUtilities.cs"
"BuildEventFileInfo.cs"
"CopyOnWriteDictionary.cs"
"FileDelegates.cs"
"HybridDictionary.cs"
"IConstrainedEqualityComparer.cs"
"IElementLocation.cs"
"INodePacket.cs"
"INodePacketFactory.cs"
"INodePacketHandler.cs"
"INodePacketTranslatable.cs"
"INodePacketTranslator.cs"
"NGen.cs"
"OpportunisticIntern.cs"
"ErrorUtilities.cs"
"ExceptionHandling.cs"
"AssemblyUtilities.cs"
"AwaitExtensions.cs"
"BuildEnvironmentHelper.cs"
"ConversionUtilities.cs"
"EnvironmentUtilities.cs"
"EventArgsFormatting.cs"
"FileMatcher.cs"
"FrameworkLocationHelper.cs"
"NodePacketTranslator.cs"
"ProjectErrorUtilities.cs"
"ProjectWriter.cs"
"PropertyParser.cs"
"ReadOnlyEmptyCollection.cs"
"ReadOnlyEmptyDictionary.cs"
"TaskLoader.cs"
"ThreadPoolExtensions.cs"
"Tracing.cs"
"VersionUtilities.cs"
"XmlUtilities.cs"
"VisualStudioLocationHelper.cs"
"Modifiers.cs"
"ReadOnlyCollection.cs"
"AssemblyNameExtension.cs"
"BufferedReadStream.cs"
"CanonicalError.cs"
"EncodingStringWriter.cs"
"InternalErrorException.cs"))))
;;; --- 5. Build MSBuild.exe (the executable)
;; no resx2sr since src/MSBuild/AssemblyResources.cs is hand-written.
(invoke "resgen" "src/MSBuild/Resources/Strings.resx"
"artifacts/MSBuild.Strings.resources")
(invoke "resgen" "src/Shared/Resources/Strings.shared.resx"
"artifacts/MSBuild.Strings.shared.resources")
(apply invoke "mcs"
(append mcs-flags
'("-target:exe"
"-out:artifacts/MSBuild.exe"
;; Add the correct logical names (RHS) for BOTH resource files.
"-resource:artifacts/MSBuild.Strings.resources,MSBuild.Strings.resources"
"-resource:artifacts/MSBuild.Strings.shared.resources,MSBuild.Strings.shared.resources"
"-r:artifacts/Microsoft.Build.dll"
"-r:artifacts/Microsoft.Build.Framework.dll"
"-r:artifacts/Microsoft.Build.Tasks.Core.dll"
"Version-exe.cs")
(find-files "src/MSBuild" "\\.cs$")
'("src/Shared/QuotingUtilities.cs"
"src/Shared/ExceptionHandling.cs"))))))
(replace 'install
(lambda* (#:key inputs outputs #:allow-other-keys)
(let* ((lib-dir (string-append #$output "/lib/mono/msbuild"))
(bin-dir (string-append #$output "/bin")))
(mkdir-p lib-dir)
(mkdir-p bin-dir)
(for-each (lambda (file)
(install-file file lib-dir))
(find-files "artifacts" "(\\.dll|\\.exe)$"))
(for-each (lambda (file)
(install-file file lib-dir))
(find-files "src/Tasks" "\\.(targets|props|tasks)$"))
(substitute* '("src/MSBuild/app.amd64.config"
"src/MSBuild/app.config")
(("</configuration>")
(string-append "<runpath path=\""
(dirname
(search-input-file inputs
"/lib/mono/4.5/System.Reflection.Metadata.dll"))
":"
(dirname
(search-input-file inputs
"/lib/mono/4.5/System.Collections.Immutable.dll"))
"\"/></configuration>")))
(copy-file #$(if (target-x86-64? (or (%current-target-system)
(%current-system)))
"src/MSBuild/app.amd64.config"
"src/MSBuild/app.config")
(string-append lib-dir "/MSBuild.exe.config"))
(let* ((msbuild-exe (string-append lib-dir "/MSBuild.exe"))
(wrapper (string-append bin-dir "/msbuild")))
(call-with-output-file wrapper
(lambda (port)
(format port "#!~a
exec ~s ~s \"$@\"~%"
(search-input-file inputs "/bin/bash")
(search-input-file inputs "/bin/mono")
msbuild-exe)))
(chmod wrapper #o755))))))))
(synopsis "Microsoft Build Engine (MSBuild) for mono")
(description "This package provides MSBuild, the build tool for .NET.")
(home-page "https://github.com/dotnet/msbuild")
(license license:expat)))

View file

@ -0,0 +1,24 @@
Date: 2025-06-13
Author: Danny Milosavljevic <dannym@friendly-machines.com>
Subject: Mono 6.12.0.206 can do closures but no local functions. Use closures then :P
--- mono-msbuild-15.7.179-checkout/src/Build/BackEnd/BuildManager/BuildManager.cs.orig 2025-06-13 14:13:15.637777100 +0200
+++ mono-msbuild-15.7.179-checkout/src/Build/BackEnd/BuildManager/BuildManager.cs 2025-06-13 14:14:01.888115956 +0200
@@ -443,7 +443,7 @@
CultureInfo parentThreadCulture = _buildParameters != null ? _buildParameters.Culture : CultureInfo.CurrentCulture;
CultureInfo parentThreadUICulture = _buildParameters != null ? _buildParameters.UICulture : CultureInfo.CurrentUICulture;
- void Callback(object state)
+ System.Threading.WaitCallback Callback = (object state) =>
{
lock (_syncLock)
{
@@ -475,7 +475,7 @@
ShutdownConnectedNodesAsync(true /* abort */);
CheckForActiveNodesAndCleanUpSubmissions();
}
- }
+ };
ThreadPoolExtensions.QueueThreadPoolWorkItemWithCulture(Callback, parentThreadCulture, parentThreadUICulture);
}

View file

@ -0,0 +1,54 @@
Date: 2025-06-15
Author: Danny Milosavljevic <dannym@friendly-machines.com>
Subject: Register the resources from the EXE in the engine DLL as well.
--- mono-msbuild-15.7.179-checkout/src/MSBuild/AssemblyResources.cs.orig 2025-06-15 20:05:31.372348854 +0200
+++ mono-msbuild-15.7.179-checkout/src/MSBuild/AssemblyResources.cs 2025-06-15 20:43:07.563094173 +0200
@@ -10,9 +10,24 @@
/// <summary>
/// This class provides access to the assembly's resources.
/// </summary>
- internal static class AssemblyResources
+ internal static class ExeAssemblyResources
{
/// <summary>
+ /// Manual function here. Constructor wouldn't work because that would be
+ /// called lazily--i.e. never. No idea how the original mechanism was
+ /// supposed to work (probably didn't :P)--but I like explicit better anyway.
+ /// </summary>
+ internal static void RegisterExe()
+ {
+ // This is the call that bridges the two assemblies.
+ // It calls the static RegisterMSBuildExeResources method that exists on the
+ // AssemblyResources class inside the referenced Microsoft.Build.dll.
+ // We pass it our own main resource manager.
+ Microsoft.Build.Shared.AssemblyResources.RegisterMSBuildExeResources(s_resources);
+
+ }
+
+ /// <summary>
/// Loads the specified resource string, either from the assembly's primary resources, or its shared resources.
/// </summary>
/// <remarks>This method is thread-safe.</remarks>
@@ -34,8 +49,8 @@
}
// assembly resources
- private static readonly ResourceManager s_resources = new ResourceManager("MSBuild.Strings", typeof(AssemblyResources).GetTypeInfo().Assembly);
+ private static readonly ResourceManager s_resources = new ResourceManager("MSBuild.Strings", typeof(ExeAssemblyResources).GetTypeInfo().Assembly);
// shared resources
- private static readonly ResourceManager s_sharedResources = new ResourceManager("MSBuild.Strings.shared", typeof(AssemblyResources).GetTypeInfo().Assembly);
+ private static readonly ResourceManager s_sharedResources = new ResourceManager("MSBuild.Strings.shared", typeof(ExeAssemblyResources).GetTypeInfo().Assembly);
}
}
--- mono-msbuild-15.7.179-checkout/src/MSBuild/XMake.cs.orig 2025-06-15 20:01:35.729388083 +0200
+++ mono-msbuild-15.7.179-checkout/src/MSBuild/XMake.cs 2025-06-15 20:47:55.337071631 +0200
@@ -207,6 +207,8 @@
#endif
)
{
+ Microsoft.Build.Shared.ExeAssemblyResources.RegisterExe();
+
if (Environment.GetEnvironmentVariable("MSBUILDDUMPPROCESSCOUNTERS") == "1")
{
DumpCounters(true /* initialize only */);