diff options
author | Danny Milosavljevic <dannym@friendly-machines.com> | 2025-06-15 22:01:58 +0200 |
---|---|---|
committer | Danny Milosavljevic <dannym@friendly-machines.com> | 2025-06-22 10:05:55 +0200 |
commit | 5239ec21fda51687671c6667a3bffbcd32bbc9d5 (patch) | |
tree | 0cce38ef53ebfa4fef67c9b2b0f56690bb6968f4 | |
parent | 15a43c743102b5026eccb82be94af30de799f79f (diff) |
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
-rw-r--r-- | gnu/local.mk | 2 | ||||
-rw-r--r-- | gnu/packages/dotnet.scm | 858 | ||||
-rw-r--r-- | gnu/packages/patches/mono-msbuild-15.7.179-fix-build.patch | 24 | ||||
-rw-r--r-- | gnu/packages/patches/mono-msbuild-15.7.179-fix-resources.patch | 54 |
4 files changed, 839 insertions, 99 deletions
diff --git a/gnu/local.mk b/gnu/local.mk index 57355b0001..ae3b9c9b68 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -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 \ diff --git a/gnu/packages/dotnet.scm b/gnu/packages/dotnet.scm index 778045f201..2ad9a17b45 100644 --- a/gnu/packages/dotnet.scm +++ b/gnu/packages/dotnet.scm @@ -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,113 +1936,771 @@ most of the heavy lifting.") (define-public mono mono-6.12.0) -(define mono-system-collections-immutable-bootstrap - (package - (name "mono-system-collections-immutable-bootstrap") - (version - (package-version mono)) - (source - (package-source mono)) - (build-system gnu-build-system) - (native-inputs - (list mono)) - (arguments - (list #:phases - #~(modify-phases %standard-phases - (delete 'bootstrap) - (add-after 'unpack 'prepare - (lambda _ - (chdir "external/corefx/src/System.Collections.Immutable/src") - (substitute* "../../Common/src/System/SR.cs" - ;; 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) - (replace 'build - (lambda* (#:key inputs #:allow-other-keys) - (invoke "resx2sr" "-o" "SR.cs" "-n" "System.SR" - "--warn-mismatch" - "Resources/Strings.resx") - (apply invoke "mcs" - "-target:library" - "-langversion:7.2" +(define-public mono-system-collections-immutable-bootstrap + (hidden-package + (package + (name "mono-system-collections-immutable-bootstrap") + (version + (package-version mono)) + (source + (package-source mono)) + (build-system gnu-build-system) + (native-inputs + (list mono)) + (arguments + (list #:tests? #f ; tests would require xunit which is not in the bootstrap path. + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'prepare + (lambda _ + (chdir "external/corefx/src/System.Collections.Immutable/src") + (substitute* "../../Common/src/System/SR.cs" + ;; 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) ; no "configure" script exists + (replace 'build + (lambda* (#:key inputs #:allow-other-keys) + (invoke "resx2sr" "-o" "SR.cs" "-n" "System.SR" + "--warn-mismatch" + "Resources/Strings.resx") + (apply invoke "mcs" + "-target:library" + "-langversion:7.2" ;;; mono can't do it: "-d:FEATURE_ITEMREFAPI" - "-out:System.Collections.Immutable.dll" - "../../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"))) - (mkdir-p lib-dir) - (install-file "System.Collections.Immutable.dll" - lib-dir))))))) - (synopsis "System.Collections.Immutable library for bootstrapping") - (description "This package builds the System.Collections.Immutable library from + "-out:System.Collections.Immutable.dll" + "../../Common/src/System/Runtime/Versioning/NonVersionableAttribute.cs" + "../../Common/src/System/SR.cs" + (find-files "." "\\.cs$")))) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((lib-dir (string-append #$output "/lib/mono/4.5"))) + (mkdir-p lib-dir) + (install-file "System.Collections.Immutable.dll" + lib-dir))))))) + (synopsis "System.Collections.Immutable library for bootstrapping") + (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))) + (home-page "https://dot.net/") + (license license:expat)))) + +(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. + (version + (package-version mono)) + (source + (package-source mono)) + (build-system gnu-build-system) + (inputs + (list mono-system-collections-immutable-bootstrap)) ; not required: mono-system-buffers-bootstrap + (native-inputs + (list mono)) + (arguments + (list #:tests? #f ; would require xunit which is not in the bootstrap path + #:phases + #~(modify-phases %standard-phases + (add-after 'unpack 'chdir + (lambda _ + (chdir "external/corefx/src/System.Reflection.Metadata/src") + (substitute* "../../Common/src/System/SR.cs" + ;; I don't want to drag System.Security.AccessControl into the bootstrap path. + (("new ResourceManager[(]ResourceType[)]") + "new ResourceManager(\"System.Collections.Immutable\", typeof(SR).Assembly)")))) + (add-after 'chdir 'prepare + (lambda* (#:key inputs #:allow-other-keys) + (for-each + (lambda (name) + (if (file-exists? name) + (delete-file name) + (format #t "Warning: File ~s doesn't exist~%" name))) + ;; We don't need those since they would be for different .NET standards. + '("./System/Reflection/Internal/Utilities/CriticalDisposableObject.netstandard1.1.cs" + "./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) ; no "configure" script exists + (replace 'build + (lambda* (#:key inputs outputs #:allow-other-keys) + (invoke "resx2sr" "-o" "SR.cs" "-n" "System.SR" "--warn-mismatch" + "Resources/Strings.resx") + (apply invoke "mcs" + "-target:library" + "-langversion:7.2" + "-unsafe" + "-out:System.Reflection.Metadata.dll" + (string-append "-r:" + (search-input-file inputs + "/lib/mono/4.5/System.Collections.Immutable.dll")) + "../../Common/src/System/SR.cs" + (find-files "." "\\.cs$")))) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((lib-dir (string-append #$output "/lib/mono/4.5"))) + (install-file "System.Reflection.Metadata.dll" lib-dir))))))) + (synopsis "System.Reflection.Metadata library for bootstrapping") + (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)))) -(define mono-system-reflection-metadata-bootstrap +;; too new version: 15.9.21.664 +;; too old (no support for mono) version: 14.0 +(define-public msbuild (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. - (version - (package-version mono)) + (name "msbuild") + (version "15.7.179") (source - (package-source mono)) + (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 mono-system-collections-immutable-bootstrap)) ; not required: mono-system-buffers-bootstrap - (native-inputs - (list mono)) + (list bash-minimal + mono mono-system-reflection-metadata-bootstrap + mono-system-collections-immutable-bootstrap)) (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 + (replace 'configure (lambda _ - (chdir "external/corefx/src/System.Reflection.Metadata/src") - (substitute* "../../Common/src/System/SR.cs" - ;; I don't want to drag System.Security.AccessControl into the bootstrap path. - (("new ResourceManager[(]ResourceType[)]") - "new ResourceManager(\"System.Collections.Immutable\", typeof(SR).Assembly)")))) - (add-after 'chdir 'prepare - (lambda* (#:key inputs #:allow-other-keys) - (for-each - (lambda (name) - (if (file-exists? name) - (delete-file name) - (format #t "Warning: File ~s doesn't exist~%" name))) - ;; We don't need those since they would be for different .NET standards. - '("./System/Reflection/Internal/Utilities/CriticalDisposableObject.netstandard1.1.cs" - "./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) + (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 outputs #:allow-other-keys) - (invoke "resx2sr" "-o" "SR.cs" "-n" "System.SR" "--warn-mismatch" - "Resources/Strings.resx") - (apply invoke "mcs" - "-target:library" - "-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) + (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 outputs #:allow-other-keys) - (let* ((lib-dir (string-append #$output "/lib/mono/4.5"))) - (install-file "System.Reflection.Metadata.dll" lib-dir))))))) - (synopsis "System.Reflection.Metadata library for bootstrapping") - (description "This package builds the System.Reflection.Metadata library from -the source code included within the Mono source tree.") - (home-page "https://dot.net/") + (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))) diff --git a/gnu/packages/patches/mono-msbuild-15.7.179-fix-build.patch b/gnu/packages/patches/mono-msbuild-15.7.179-fix-build.patch new file mode 100644 index 0000000000..e36d5f9253 --- /dev/null +++ b/gnu/packages/patches/mono-msbuild-15.7.179-fix-build.patch @@ -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); + } diff --git a/gnu/packages/patches/mono-msbuild-15.7.179-fix-resources.patch b/gnu/packages/patches/mono-msbuild-15.7.179-fix-resources.patch new file mode 100644 index 0000000000..32a95c99c6 --- /dev/null +++ b/gnu/packages/patches/mono-msbuild-15.7.179-fix-resources.patch @@ -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 */); |