diff --git a/.gitignore b/.gitignore index e69de29..7e4e825 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,3 @@ +/dotnet-9e8b04bbff820c93c142f99a507a46b976f5c14c-x64-bootstrap.tar.xz +/dotnet-arm64-prebuilts-2021-10-29.tar.gz +/dotnet-s390x-prebuilts-2021-10-29.tar.gz diff --git a/arcade-no-apphost.patch b/arcade-no-apphost.patch new file mode 100644 index 0000000..cec03a1 --- /dev/null +++ b/arcade-no-apphost.patch @@ -0,0 +1,36 @@ +Index: a/src/Microsoft.DotNet.GitSync.CommitManager/Microsoft.DotNet.GitSync.CommitManager.csproj +=================================================================== +--- a/src/Microsoft.DotNet.GitSync.CommitManager/Microsoft.DotNet.GitSync.CommitManager.csproj ++++ b/src/Microsoft.DotNet.GitSync.CommitManager/Microsoft.DotNet.GitSync.CommitManager.csproj +@@ -5,6 +5,7 @@ + netcoreapp3.1 + latest + true ++ false + + + +Index: a/src/Microsoft.DotNet.SwaggerGenerator/Microsoft.DotNet.SwaggerGenerator.CmdLine/Microsoft.DotNet.SwaggerGenerator.CmdLine.csproj +=================================================================== +--- a/src/Microsoft.DotNet.SwaggerGenerator/Microsoft.DotNet.SwaggerGenerator.CmdLine/Microsoft.DotNet.SwaggerGenerator.CmdLine.csproj ++++ b/src/Microsoft.DotNet.SwaggerGenerator/Microsoft.DotNet.SwaggerGenerator.CmdLine/Microsoft.DotNet.SwaggerGenerator.CmdLine.csproj +@@ -9,6 +9,7 @@ + dotnet-swaggergen + false + true ++ false + + + +Index: a/src/Microsoft.DotNet.XUnitConsoleRunner/src/Microsoft.DotNet.XUnitConsoleRunner.csproj +=================================================================== +--- a/src/Microsoft.DotNet.XUnitConsoleRunner/src/Microsoft.DotNet.XUnitConsoleRunner.csproj ++++ b/src/Microsoft.DotNet.XUnitConsoleRunner/src/Microsoft.DotNet.XUnitConsoleRunner.csproj +@@ -11,6 +11,7 @@ + 2.5.1 + true + Major ++ false + + + diff --git a/build-dotnet-tarball b/build-dotnet-tarball new file mode 100755 index 0000000..8f15c6f --- /dev/null +++ b/build-dotnet-tarball @@ -0,0 +1,206 @@ +#!/bin/bash + +# Usage: +# build-dotnet-tarball [--bootstrap] +# +# Creates a source archive from a tag (or commit) at github.com/dotnet/installer + +# installer is a little strange, we need to clone it, check out the +# tag, build it and then create a tarball from the archive directory +# it creates. Also, it is likely that the source archive is only +# buildable on the OS it was initially created in. + +set -euo pipefail +IFS=$'\n\t' + +function print_usage { + echo "Usage:" + echo "$0 [--bootstrap] " + echo + echo "Creates a source archive from a tag at https://github.com/dotnet/installer" + echo "" + echo " --bootstrap build a source tarball usable for bootstrapping .NET" +} + +function clean_dotnet_cache { + rm -rf ~/.aspnet ~/.dotnet/ ~/.nuget/ ~/.local/share/NuGet ~/.templateengine + rm -rf /tmp/NuGet /tmp/NuGetScratch /tmp/.NETCore* /tmp/.NETStandard* /tmp/.dotnet /tmp/dotnet.* /tmp/clr-debug-pipe* /tmp/Razor-Server /tmp/CoreFxPipe* /tmp/VBCSCompiler /tmp/.NETFramework* +} + +function check_bootstrap_environment { + if rpm -qa | grep dotnet ; then + echo "error: dotnet is installed. Not a good idea for bootstrapping." + exit 1 + fi + if [ -d /usr/lib/dotnet ] || [ -d /usr/lib64/dotnet ] || [ -d /usr/share/dotnet ] ; then + echo "error: one of /usr/lib/dotnet /usr/lib64/dotnet or /usr/share/dotnet/ exists. Not a good idea for bootstrapping." + exit 1 + fi + if command -v dotnet ; then + echo "error: dotnet is in $PATH. Not a good idea for bootstrapping." + exit 1 + fi +} + +function runtime_id { + + source /etc/os-release + case "${ID}" in + # Remove the RHEL minor version + rhel) rid_version=${VERSION_ID%.*} ;; + + *) rid_version=${VERSION_ID} ;; + esac + + echo "${ID}.${rid_version}-${arch}" +} + +build_bootstrap=false + +declare -A archmap +archmap=( + ["aarch64"]="arm64" + ["amd64"]="x64" + ["armv8l"]="arm" + ["i686"]="x86" + ["i386"]="x86" + ["x86_64"]="x64" +) + +arch=${archmap["$(uname -m)"]} + + +positional_args=() +while [[ "$#" -gt 0 ]]; do + arg="${1}" + case "${arg}" in + --bootstrap) + check_bootstrap_environment + build_bootstrap=true + shift + ;; + -h|--help) + print_usage + exit 0 + ;; + *) + positional_args+=("$1") + shift + ;; + esac +done + + +tag=${positional_args[0]:-} +if [[ -z ${tag} ]]; then + echo "error: missing tag to build" + exit 1 +fi + +set -x + +dir_name="dotnet-${tag}" +unmodified_tarball_name="${dir_name}-original" +tarball_name="${dir_name}" +tarball_suffix=.tar.gz + +if [[ ${build_bootstrap} == true ]]; then + unmodified_tarball_name="${unmodified_tarball_name}-${arch}-bootstrap" + tarball_name="${tarball_name}-${arch}-bootstrap" + tarball_suffix=.tar.xz +fi + +if [ -f "${tarball_name}${tarball_suffix}" ]; then + echo "error: ${tarball_name}${tarball_suffix} already exists" + exit 1 +fi + +if [ ! -f "${unmodified_tarball_name}.tar.gz" ]; then + temp_dir=$(mktemp -d -p "$(pwd)") + pushd "${temp_dir}" + git clone https://github.com/dotnet/installer + pushd installer + git checkout "${tag}" + git submodule update --init --recursive + clean_dotnet_cache + mkdir -p "../${unmodified_tarball_name}" + ./build.sh /p:ArcadeBuildTarball=true /p:TarballDir="$(readlink -f ../"${unmodified_tarball_name}")" + popd + + popd + + tar cf "${unmodified_tarball_name}.tar.gz" -C "${temp_dir}" "${unmodified_tarball_name}" + + rm -rf "${temp_dir}" +fi + +rm -rf "${tarball_name}" +tar xf "${unmodified_tarball_name}.tar.gz" +mv "${unmodified_tarball_name}" "${tarball_name}" + +pushd "${tarball_name}" + +if [[ ${build_bootstrap} == true ]]; then + if [[ "$(wc -l < packages/archive/archiveArtifacts.txt)" != 1 ]]; then + echo "error: this is not going to work! update $0 to fix this issue." + exit 1 + fi + + pushd packages/archive/ + curl -O $(cat archiveArtifacts.txt) + popd + + mkdir foo + pushd foo + + tar xf ../packages/archive/Private.SourceBuilt.Artifacts.*.tar.gz + sed -i -E 's|6.0.0-rtm.21521.16.0.0-rtm.21521.46.0.0-rtm.21521.16.0.0-rtm.21521.4 +Date: Thu, 9 Sep 2021 12:11:39 -0400 +Subject: [PATCH] [ArPow] Use --work-tree with git apply + +This makes things work better in a source-tarball build, where there may +be a .git directory but it's for a different repo than command-line-api. +--- + eng/SourceBuild.props | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/eng/SourceBuild.props b/eng/SourceBuild.props +index 6cc85018..5e223747 100644 +--- a/eng/SourceBuild.props ++++ b/eng/SourceBuild.props +@@ -15,7 +15,7 @@ + + + + +-- +2.31.1 + diff --git a/dotnet.sh.in b/dotnet.sh.in new file mode 100644 index 0000000..65b92a0 --- /dev/null +++ b/dotnet.sh.in @@ -0,0 +1,14 @@ + +# Set location for AppHost lookup +[ -z "$DOTNET_ROOT" ] && export DOTNET_ROOT=@LIBDIR@/dotnet + +# Add dotnet tools directory to PATH +DOTNET_TOOLS_PATH="$HOME/.dotnet/tools" +case "$PATH" in + *"$DOTNET_TOOLS_PATH"* ) true ;; + * ) PATH="$PATH:$DOTNET_TOOLS_PATH" ;; +esac + +# Extract self-contained executables under HOME +# to avoid multi-user issues from using the default '/var/tmp'. +[ -z "$DOTNET_BUNDLE_EXTRACT_BASE_DIR" ] && export DOTNET_BUNDLE_EXTRACT_BASE_DIR="${XDG_CACHE_HOME:-"$HOME"/.cache}/dotnet_bundle_extract" diff --git a/dotnet6.0.rpmlintrc b/dotnet6.0.rpmlintrc new file mode 100644 index 0000000..1396c43 --- /dev/null +++ b/dotnet6.0.rpmlintrc @@ -0,0 +1,35 @@ +# Tarball is generated, no upstream URL +addFilter("W:.*invalid-url Source0: dotnet-.*tar.gz") + +# macOS is the correct name +addFilter("W: spelling-error %description -l en_US macOS ->.*") +# The name of the nuget package includes NETCore +addFilter("W: spelling-error .* NETCore -> Net Core.*") + +# Upstream really has no README or documentation files. They suggest using online resources. +addFilter("W: no-documentation") + +# This is a script that we run; it's expected to have execute permissions +addFilter("W: strange-permission check-debug-symbols.py") + +# libicu is a required dependency, but it's used via a dlopen() +addFilter("E: explicit-lib-dependency libicu") + +# There's no devel package for us to place .h files +addFilter("W: devel-file-in-non-devel-package /usr/lib64/dotnet/.*\.h") +addFilter("W: devel-file-in-non-devel-package /usr/lib64/dotnet/.*\.a") + +# These paths are non-standard, so we need $ORIGIN to find these libraries +addFilter("E: binary-or-shlib-defines-rpath /usr/lib64/dotnet/.*\['\$ORIGIN/netcoredeps'\]") +addFilter("E: binary-or-shlib-defines-rpath /usr/lib64/dotnet/.*\['\$ORIGIN'\]") + +# We put dll files in /usr/lib/dotnet, but rpmlint somehow doesn't see it as a binary? +addFilter("W: only-non-binary-in-usr-lib") + +# We use a number of zero-length files, including _._ +addFilter("E: zero-length /usr/lib64/dotnet/.*/_\._") + +# Upstream uses hidden files, even though we ask them not to, as much as possible +addFilter("W: hidden-file-or-dir /usr/lib64/dotnet/.*/\.version") +addFilter("W: hidden-file-or-dir /usr/lib64/dotnet/.*/\.toolsetversion") + diff --git a/dotnet6.0.spec b/dotnet6.0.spec new file mode 100644 index 0000000..8e874cb --- /dev/null +++ b/dotnet6.0.spec @@ -0,0 +1,941 @@ +%bcond_without bootstrap + +# Avoid provides/requires from private libraries +%global privlibs libhostfxr +%global privlibs %{privlibs}|libclrjit +%global privlibs %{privlibs}|libcoreclr +%global privlibs %{privlibs}|libcoreclrtraceptprovider +%global privlibs %{privlibs}|libdbgshim +%global privlibs %{privlibs}|libhostpolicy +%global privlibs %{privlibs}|libmscordaccore +%global privlibs %{privlibs}|libmscordbi +%global privlibs %{privlibs}|libsos +%global privlibs %{privlibs}|libsosplugin +%global __provides_exclude ^(%{privlibs})\\.so +%global __requires_exclude ^(%{privlibs})\\.so + +# LTO triggers a compilation error for a source level issue. Given that LTO should not +# change the validity of any given source and the nature of the error (undefined enum), I +# suspect a generator program is mis-behaving in some way. This needs further debugging, +# until that's done, disable LTO. This has to happen before setting the flags below. +%define _lto_cflags %{nil} + +%global host_version 6.0.0 +%global runtime_version 6.0.0 +%global aspnetcore_runtime_version 6.0.0 +%global sdk_version 6.0.100 +%global templates_version 6.0.0 +#%%global templates_version %%(echo %%{runtime_version} | awk 'BEGIN { FS="."; OFS="." } {print $1, $2, $3+1 }') + +%global host_rpm_version %{host_version} +%global runtime_rpm_version %{runtime_version} +%global aspnetcore_runtime_rpm_version %{aspnetcore_runtime_version} +%global sdk_rpm_version %{sdk_version} + +# upstream can update releases without revving the SDK version so these don't always match +#%%global upstream_tag v%%{sdk_version}-SDK +%global upstream_tag 9e8b04bbff820c93c142f99a507a46b976f5c14c + +%if 0%{?fedora} || 0%{?rhel} < 8 +%global use_bundled_libunwind 0 +%else +%global use_bundled_libunwind 1 +%endif + +%ifarch aarch64 s390x +%global use_bundled_libunwind 1 +%endif + +%ifarch x86_64 +%global runtime_arch x64 +%endif +%ifarch aarch64 +%global runtime_arch arm64 +%endif +%ifarch s390x +%global runtime_arch s390x +%endif + +%{!?runtime_id:%global runtime_id %(. /etc/os-release ; echo "${ID}.${VERSION_ID%%.*}")-%{runtime_arch}} + +Name: dotnet6.0 +Version: %{sdk_rpm_version} +Release: 1%{?dist} +Summary: .NET Runtime and SDK +License: MIT and ASL 2.0 and BSD and LGPLv2+ and CC-BY and CC0 and MS-PL and EPL-1.0 and GPL+ and GPLv2 and ISC and OFL and zlib +URL: https://github.com/dotnet/ + +%if %{with bootstrap} +# The source is generated on a RHEL box via: +# ./build-dotnet-tarball --bootstrap %%{upstream_tag} +Source0: dotnet-%{upstream_tag}-x64-bootstrap.tar.xz +# Generated via ./build-arm64-bootstrap-tarball +Source1: dotnet-arm64-prebuilts-2021-10-29.tar.gz +# Generated manually, same pattern as the arm64 tarball +Source2: dotnet-s390x-prebuilts-2021-10-29.tar.gz +%else +# The source is generated on a RHEL box via: +# ./build-dotnet-tarball %%{upstream_tag} +Source0: dotnet-%{upstream_tag}.tar.gz +%endif + +Source10: check-debug-symbols.py +Source11: dotnet.sh.in + +# Fix using lld on RHEL +Patch100: runtime-arm64-lld-fix.patch +# Mono still has a dependency on (now unbuildable) ILStrip which was removed from CoreCLR: https://github.com/dotnet/runtime/pull/60315 +Patch101: runtime-mono-remove-ilstrip.patch +# https://github.com/dotnet/runtime/pull/61442 +Patch102: runtime-61442-disable-werror.patch +# https://github.com/dotnet/runtime/pull/62170 +Patch103: runtime-62170-clang13.patch + +# https://github.com/dotnet/command-line-api/pull/1401 +Patch300: command-line-api-use-work-tree-with-git-apply.patch + +# https://github.com/microsoft/vstest/pull/3046 +Patch400: vstest-use-work-tree-with-git-apply.patch + +# This is the suggestion from https://github.com/dotnet/source-build/pull/2450, applied +Patch500: fsharp-use-work-tree-with-git-apply.patch +# Disable apphost, needed for s390x +Patch501: fsharp-no-apphost.patch + +# This is the suggestion from https://github.com/dotnet/source-build/pull/2450, applied +Patch600: xliff-tasks-use-work-tree-with-git-apply.patch + +# Disable apphost, needed for s390x +Patch700: arcade-no-apphost.patch + +# Named mutex fix for mono, needed for s390x. https://github.com/dotnet/roslyn/pull/57003 +Patch800: roslyn-57003-mono-named-mutex.patch +# Disable apphost, needed for s390x +Patch801: roslyn-no-apphost.patch + +# Disable apphost, needed for s390x +Patch900: roslyn-analyzers-no-apphost.patch + +# Fix mono-specific runtime crashes running msbuild. CoreCLR does not +# load types that are not actually used/invoked at runtime, while mono +# does. System.Configuration and System.Security are missing in +# source-build builds, which breaks msbuild. +Patch1000: msbuild-no-systemsecurity.patch +Patch1001: msbuild-no-systemconfiguration.patch + +# Disable telemetry by default; make it opt-in +Patch1500: sdk-telemetry-optout.patch +# https://github.com/dotnet/sdk/pull/22373 +Patch1501: sdk-22373-portablerid.patch + +# https://github.com/dotnet/installer/pull/12516 +Patch1600: installer-12516-portablerid.patch +# https://github.com/dotnet/installer/pull/12622 +Patch1601: installer-12622-fix-runtime-symbols.patch + + +%if 0%{?fedora} || 0%{?rhel} >= 8 +ExclusiveArch: aarch64 x86_64 s390x +%else +ExclusiveArch: x86_64 +%endif + +BuildRequires: clang +BuildRequires: cmake +BuildRequires: coreutils +%if %{without bootstrap} +BuildRequires: dotnet-sdk-6.0 +BuildRequires: dotnet-sdk-6.0-source-built-artifacts +%endif +BuildRequires: findutils +BuildRequires: git +%if 0%{?fedora} || 0%{?rhel} > 7 +BuildRequires: glibc-langpack-en +%endif +BuildRequires: hostname +BuildRequires: krb5-devel +BuildRequires: libicu-devel +%if ! %{use_bundled_libunwind} +BuildRequires: libunwind-devel +%endif +%ifarch aarch64 +BuildRequires: lld +%endif +BuildRequires: llvm +BuildRequires: lttng-ust-devel +BuildRequires: make +BuildRequires: openssl-devel +BuildRequires: python3 +BuildRequires: tar +BuildRequires: util-linux +BuildRequires: zlib-devel + +%description +.NET is a fast, lightweight and modular platform for creating +cross platform applications that work on Linux, macOS and Windows. + +It particularly focuses on creating console applications, web +applications and micro-services. + +.NET contains a runtime conforming to .NET Standards a set of +framework libraries, an SDK containing compilers and a 'dotnet' +application to drive everything. + + +%package -n dotnet-host + +Version: %{host_rpm_version} +Summary: .NET command line launcher + +%description -n dotnet-host +The .NET host is a command line program that runs a standalone +.NET application or launches the SDK. + +.NET is a fast, lightweight and modular platform for creating +cross platform applications that work on Linux, Mac and Windows. + +It particularly focuses on creating console applications, web +applications and micro-services. + + +%package -n dotnet-hostfxr-6.0 + +Version: %{host_rpm_version} +Summary: .NET command line host resolver + +# Theoretically any version of the host should work. But lets aim for the one +# provided by this package, or from a newer version of .NET +Requires: dotnet-host%{?_isa} >= %{host_rpm_version}-%{release} + +%description -n dotnet-hostfxr-6.0 +The .NET host resolver contains the logic to resolve and select +the right version of the .NET SDK or runtime to use. + +.NET is a fast, lightweight and modular platform for creating +cross platform applications that work on Linux, Mac and Windows. + +It particularly focuses on creating console applications, web +applications and micro-services. + + +%package -n dotnet-runtime-6.0 + +Version: %{runtime_rpm_version} +Summary: NET 6.0 runtime + +Requires: dotnet-hostfxr-6.0%{?_isa} >= %{host_rpm_version}-%{release} + +# libicu is dlopen()ed +Requires: libicu%{?_isa} + +%if %{use_bundled_libunwind} +# See runtime.*/src/coreclr/pal/src/libunwind/libunwind-version.txt +Provides: bundled(libunwind) = 1.5.rc1.28.g9165d2a1 +%endif + +%description -n dotnet-runtime-6.0 +The .NET runtime contains everything needed to run .NET applications. +It includes a high performance Virtual Machine as well as the framework +libraries used by .NET applications. + +.NET is a fast, lightweight and modular platform for creating +cross platform applications that work on Linux, Mac and Windows. + +It particularly focuses on creating console applications, web +applications and micro-services. + + +%package -n aspnetcore-runtime-6.0 + +Version: %{aspnetcore_runtime_rpm_version} +Summary: ASP.NET Core 6.0 runtime + +Requires: dotnet-runtime-6.0%{?_isa} >= %{runtime_rpm_version}-%{release} + +%description -n aspnetcore-runtime-6.0 +The ASP.NET Core runtime contains everything needed to run .NET +web applications. It includes a high performance Virtual Machine as +well as the framework libraries used by .NET applications. + +ASP.NET Core is a fast, lightweight and modular platform for creating +cross platform web applications that work on Linux, Mac and Windows. + +It particularly focuses on creating console applications, web +applications and micro-services. + + +%package -n dotnet-templates-6.0 + +Version: %{sdk_rpm_version} +Summary: .NET 6.0 templates + +# Theoretically any version of the host should work. But lets aim for the one +# provided by this package, or from a newer version of .NET +Requires: dotnet-host%{?_isa} >= %{host_rpm_version}-%{release} + +%description -n dotnet-templates-6.0 +This package contains templates used by the .NET SDK. + +.NET is a fast, lightweight and modular platform for creating +cross platform applications that work on Linux, Mac and Windows. + +It particularly focuses on creating console applications, web +applications and micro-services. + + +%package -n dotnet-sdk-6.0 + +Version: %{sdk_rpm_version} +Summary: .NET 6.0 Software Development Kit + +Provides: bundled(js-jquery) + +Requires: dotnet-runtime-6.0%{?_isa} >= %{runtime_rpm_version}-%{release} +Requires: aspnetcore-runtime-6.0%{?_isa} >= %{aspnetcore_runtime_rpm_version}-%{release} + +Requires: dotnet-apphost-pack-6.0%{?_isa} >= %{runtime_rpm_version}-%{release} +Requires: dotnet-targeting-pack-6.0%{?_isa} >= %{runtime_rpm_version}-%{release} +Requires: aspnetcore-targeting-pack-6.0%{?_isa} >= %{aspnetcore_runtime_rpm_version}-%{release} +Requires: netstandard-targeting-pack-2.1%{?_isa} >= %{sdk_rpm_version}-%{release} + +Requires: dotnet-templates-6.0%{?_isa} >= %{sdk_rpm_version}-%{release} + +%description -n dotnet-sdk-6.0 +The .NET SDK is a collection of command line applications to +create, build, publish and run .NET applications. + +.NET is a fast, lightweight and modular platform for creating +cross platform applications that work on Linux, Mac and Windows. + +It particularly focuses on creating console applications, web +applications and micro-services. + + +%global dotnet_targeting_pack() %{expand: +%package -n %{1} + +Version: %{2} +Summary: Targeting Pack for %{3} %{4} + +Requires: dotnet-host%{?_isa} + +%description -n %{1} +This package provides a targeting pack for %{3} %{4} +that allows developers to compile against and target %{3} %{4} +applications using the .NET SDK. + +%files -n %{1} +%dir %{_libdir}/dotnet/packs +%{_libdir}/dotnet/packs/%{5} +} + +%dotnet_targeting_pack dotnet-apphost-pack-6.0 %{runtime_rpm_version} Microsoft.NETCore.App 6.0 Microsoft.NETCore.App.Host.%{runtime_id} +%dotnet_targeting_pack dotnet-targeting-pack-6.0 %{runtime_rpm_version} Microsoft.NETCore.App 6.0 Microsoft.NETCore.App.Ref +%dotnet_targeting_pack aspnetcore-targeting-pack-6.0 %{aspnetcore_runtime_rpm_version} Microsoft.AspNetCore.App 6.0 Microsoft.AspNetCore.App.Ref +%dotnet_targeting_pack netstandard-targeting-pack-2.1 %{sdk_rpm_version} NETStandard.Library 2.1 NETStandard.Library.Ref + + +%package -n dotnet-sdk-6.0-source-built-artifacts + +Version: %{sdk_rpm_version} +Summary: Internal package for building .NET 6.0 Software Development Kit + +%description -n dotnet-sdk-6.0-source-built-artifacts +The .NET source-built archive is a collection of packages needed +to build the .NET SDK itself. + +These are not meant for general use. + + +%prep +%if %{without bootstrap} +%setup -q -n dotnet-%{upstream_tag} +%else + +%setup -q -T -b 0 -n dotnet-%{upstream_tag}-x64-bootstrap + +%ifnarch x86_64 + +rm -rf .dotnet +%ifarch aarch64 +tar -x --strip-components=1 -f %{SOURCE1} -C packages/prebuilt +%endif +%ifarch s390x +tar -x --strip-components=1 -f %{SOURCE2} -C packages/prebuilt +%endif +mkdir -p .dotnet +tar xf packages/prebuilt/dotnet-sdk*.tar.gz -C .dotnet/ +rm packages/prebuilt/dotnet-sdk*.tar.gz +boot_sdk_version=$(ls -1 .dotnet/sdk/) +sed -i -E 's|"dotnet": "[^"]+"|"dotnet" : "'$boot_sdk_version'"|' global.json +%endif + +%endif + +%if %{without bootstrap} +# Remove all prebuilts +find -iname '*.dll' -type f -delete +find -iname '*.so' -type f -delete +find -iname '*.tar.gz' -type f -delete +find -iname '*.nupkg' -type f -delete +find -iname '*.zip' -type f -delete +rm -rf .dotnet/ +rm -rf packages/source-built + +mkdir -p packages/archive +ln -s %{_libdir}/dotnet/source-built-artifacts/Private.SourceBuilt.Artifacts.*.tar.gz packages/archive/ +ln -s %{_libdir}/dotnet/reference-packages/Private.SourceBuild.ReferencePackages*.tar.gz packages/archive/ +%endif + +# Fix bad hardcoded path in build +sed -i 's|/usr/share/dotnet|%{_libdir}/dotnet|' src/runtime.*/src/native/corehost/hostmisc/pal.unix.cpp + +pushd src/runtime.* +%patch100 -p1 +%patch101 -p1 +%patch102 -p1 +%patch103 -p1 +popd + +pushd src/command-line-api.* +%patch300 -p1 +popd + +pushd src/vstest.* +%patch400 -p1 +popd + +pushd src/fsharp.* +%patch500 -p1 +%patch501 -p1 +popd + +pushd src/xliff-tasks.* +%patch600 -p1 +popd + +pushd src/arcade.* +%patch700 -p1 +popd + +pushd src/roslyn.* +%patch800 -p3 +%patch801 -p1 +popd + +pushd src/roslyn-analyzers.* +%patch900 -p1 +popd + +pushd src/msbuild.* + +# These are mono-specific fixes. Mono is only used on s390x. Restrict +# patch to s390x to avoid potential risk in other architectures. +%ifarch s390x +%patch1000 -p1 +%patch1001 -p1 +%endif + +popd + +pushd src/sdk.* +%patch1500 -p1 +%patch1501 -p1 +popd + +pushd src/installer.* +%patch1600 -p1 +popd + +# We need to apply the patch to the already-built tarball's +# repos/runtime.common.targets, not to the installer's "source" copy. +%patch1601 -p5 + +# Disable package validation which breaks our build. +# There's no need to run validation in RPM packages anyway. +# See https://github.com/dotnet/runtime/pull/60881 +sed -i -E 's|( /p:BuildDebPackage=false)|\1 /p:EnablePackageValidation=false|' src/runtime.*/eng/SourceBuild.props + +%if ! %{use_bundled_libunwind} +sed -i -E 's|( /p:BuildDebPackage=false)|\1 --cmakeargs -DCLR_CMAKE_USE_SYSTEM_LIBUNWIND=TRUE|' src/runtime.*/eng/SourceBuild.props +%endif + +%build +cat /etc/os-release + +%if %{without bootstrap} +# We need to create a copy because we will mutate this +cp -a %{_libdir}/dotnet previously-built-dotnet +%endif + +%if 0%{?fedora} > 32 || 0%{?rhel} > 8 +# Setting this macro ensures that only clang supported options will be +# added to ldflags and cflags. +%global toolchain clang +%set_build_flags +%else +# Filter flags not supported by clang +%global dotnet_cflags %(echo %optflags | sed -re 's/-specs=[^ ]*//g') +%global dotnet_ldflags %(echo %{__global_ldflags} | sed -re 's/-specs=[^ ]*//g') +export CFLAGS="%{dotnet_cflags}" +export CXXFLAGS="%{dotnet_cflags}" +export LDFLAGS="%{dotnet_ldflags}" +%endif + +%ifarch aarch64 +# -mbranch-protection=standard breaks unwinding in CoreCLR through libunwind +CFLAGS=$(echo $CFLAGS | sed -e 's/-mbranch-protection=standard //') +CXXFLAGS=$(echo $CXXFLAGS | sed -e 's/-mbranch-protection=standard //') +%endif + +# -fstack-clash-protection breaks CoreCLR +CFLAGS=$(echo $CFLAGS | sed -e 's/-fstack-clash-protection//' ) +CXXFLAGS=$(echo $CXXFLAGS | sed -e 's/-fstack-clash-protection//' ) + +export EXTRA_CFLAGS="$CFLAGS" +export EXTRA_CXXFLAGS="$CXXFLAGS" +export EXTRA_LDFLAGS="$LDFLAGS" + +unset CFLAGS +unset CXXFLAGS +unset LDFLAGS + +# Disable tracing, which is incompatible with certain versions of +# lttng See https://github.com/dotnet/runtime/issues/57784. The +# suggested compile-time change doesn't work, unfrotunately. +export COMPlus_LTTng=0 + +VERBOSE=1 ./build.sh \ +%if %{without bootstrap} + --with-sdk previously-built-dotnet \ +%endif + -- \ + +echo \ + /v:n \ + /p:SkipPortableRuntimeBuild=true \ + /p:LogVerbosity=n \ + /p:MinimalConsoleLogOutput=false \ + /p:ContinueOnPrebuiltBaselineError=true \ + + +sed -e 's|[@]LIBDIR[@]|%{_libdir}|g' %{SOURCE11} > dotnet.sh + + +%install +install -dm 0755 %{buildroot}%{_libdir}/dotnet +ls artifacts/%{runtime_arch}/Release +tar xf artifacts/%{runtime_arch}/Release/dotnet-sdk-%{sdk_version}-%{runtime_id}.tar.gz -C %{buildroot}%{_libdir}/dotnet/ + +# See https://github.com/dotnet/source-build/issues/2579 +find %{buildroot}%{_libdir}/dotnet/ -type f -iname testhost.x86 -delete +find %{buildroot}%{_libdir}/dotnet/ -type f -iname vstest.console -delete + +# Install managed symbols +# Disabled until https://github.com/dotnet/source-build/issues/2623 is sorted out +#tar xf artifacts/%%{runtime_arch}/Release/runtime/dotnet-runtime-symbols-%%{runtime_id}-%%{runtime_version}.tar.gz \ +# -C %%{buildroot}/%%{_libdir}/dotnet/shared/Microsoft.NETCore.App/%%{runtime_version}/ + +# Fix executable permissions on files +find %{buildroot}%{_libdir}/dotnet/ -type f -name 'apphost' -exec chmod +x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name 'singlefilehost' -exec chmod +x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name 'lib*so' -exec chmod +x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.a' -exec chmod -x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.dll' -exec chmod -x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.h' -exec chmod 0644 {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.json' -exec chmod -x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.pdb' -exec chmod -x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.props' -exec chmod -x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.pubxml' -exec chmod -x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.targets' -exec chmod -x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.txt' -exec chmod -x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.xml' -exec chmod -x {} \; + +install -dm 0755 %{buildroot}%{_sysconfdir}/profile.d/ +install dotnet.sh %{buildroot}%{_sysconfdir}/profile.d/ + +install -dm 0755 %{buildroot}/%{_datadir}/bash-completion/completions +# dynamic completion needs the file to be named the same as the base command +install src/sdk.*/scripts/register-completions.bash %{buildroot}/%{_datadir}/bash-completion/completions/dotnet + +# TODO: the zsh completion script needs to be ported to use #compdef +#install -dm 755 %%{buildroot}/%%{_datadir}/zsh/site-functions +#install src/cli/scripts/register-completions.zsh %%{buildroot}/%%{_datadir}/zsh/site-functions/_dotnet + +install -dm 0755 %{buildroot}%{_bindir} +ln -s ../../%{_libdir}/dotnet/dotnet %{buildroot}%{_bindir}/ + +install -dm 0755 %{buildroot}%{_mandir}/man1/ +find -iname 'dotnet*.1' -type f -exec cp {} %{buildroot}%{_mandir}/man1/ \; + +install -dm 0755 %{buildroot}%{_sysconfdir}/dotnet +echo "%{_libdir}/dotnet" >> install_location +install install_location %{buildroot}%{_sysconfdir}/dotnet/ +echo "%{_libdir}/dotnet" >> install_location_%{runtime_arch} +install install_location_%{runtime_arch} %{buildroot}%{_sysconfdir}/dotnet/ + +install -dm 0755 %{buildroot}%{_libdir}/dotnet/source-built-artifacts +install -m 0644 artifacts/%{runtime_arch}/Release/Private.SourceBuilt.Artifacts.*.tar.gz %{buildroot}/%{_libdir}/dotnet/source-built-artifacts/ + + +# Check debug symbols in all elf objects. This is not in %%check +# because native binaries are stripped by rpm-build after %%install. +# So we need to do this check earlier. +# FIXME +#echo "Testing build results for debug symbols..." +#%%{SOURCE10} -v %%{buildroot}%%{_libdir}/dotnet/ + + + +%check +%if 0%{?fedora} > 35 +# lttng in Fedora > 35 is incompatible with .NET +export COMPlus_LTTng=0 +%endif + +%{buildroot}%{_libdir}/dotnet/dotnet --info + + +%files -n dotnet-host +%dir %{_libdir}/dotnet +%{_libdir}/dotnet/dotnet +%dir %{_libdir}/dotnet/host +%dir %{_libdir}/dotnet/host/fxr +%{_bindir}/dotnet +%license %{_libdir}/dotnet/LICENSE.txt +%license %{_libdir}/dotnet/ThirdPartyNotices.txt +%doc %{_mandir}/man1/dotnet*.1.gz +%config(noreplace) %{_sysconfdir}/profile.d/dotnet.sh +%config(noreplace) %{_sysconfdir}/dotnet +%dir %{_datadir}/bash-completion +%dir %{_datadir}/bash-completion/completions +%{_datadir}/bash-completion/completions/dotnet + +%files -n dotnet-hostfxr-6.0 +%dir %{_libdir}/dotnet/host/fxr +%{_libdir}/dotnet/host/fxr/%{host_version} + +%files -n dotnet-runtime-6.0 +%dir %{_libdir}/dotnet/shared +%dir %{_libdir}/dotnet/shared/Microsoft.NETCore.App +%{_libdir}/dotnet/shared/Microsoft.NETCore.App/%{runtime_version} + +%files -n aspnetcore-runtime-6.0 +%dir %{_libdir}/dotnet/shared +%dir %{_libdir}/dotnet/shared/Microsoft.AspNetCore.App +%{_libdir}/dotnet/shared/Microsoft.AspNetCore.App/%{aspnetcore_runtime_version} + +%files -n dotnet-templates-6.0 +%dir %{_libdir}/dotnet/templates +%{_libdir}/dotnet/templates/%{templates_version} + +%files -n dotnet-sdk-6.0 +%dir %{_libdir}/dotnet/sdk +%{_libdir}/dotnet/sdk/%{sdk_version} +%dir %{_libdir}/dotnet/sdk-manifests +# FIXME hardcoded version? +%{_libdir}/dotnet/sdk-manifests/6.0.100 +%{_libdir}/dotnet/metadata +%dir %{_libdir}/dotnet/packs + +%files -n dotnet-sdk-6.0-source-built-artifacts +%dir %{_libdir}/dotnet +%{_libdir}/dotnet/source-built-artifacts + + +%changelog +* Wed Nov 10 2021 Omair Majid - 6.0.100-1 +- Update to .NET 6 + +* Fri Oct 22 2021 Omair Majid - 6.0.0-0.7.rc2 +- Update to .NET 6 RC2 + +* Fri Oct 08 2021 Omair Majid - 6.0.0-0.6.28be3e9a006d90d8c6e87d4353b77882829df718 +- Enable building on arm64 +- Related: RHBZ#1986017 + +* Sun Oct 03 2021 Omair Majid - 6.0.0-0.5.28be3e9a006d90d8c6e87d4353b77882829df718 +- Enable building on s390x +- Related: RHBZ#1986017 + +* Sun Oct 03 2021 Omair Majid - 6.0.0-0.4.28be3e9a006d90d8c6e87d4353b77882829df718 +- Clean up tarball and add initial support for s390x +- Related: RHBZ#1986017 + +* Sun Sep 26 2021 Omair Majid - 6.0.0-0.3.28be3e9a006d90d8c6e87d4353b77882829df718 +- Update to work-in-progress RC2 release + +* Wed Aug 25 2021 Omair Majid - 6.0.0-0.2.preview6 +- Updated to build the latest source-build preview + +* Fri Jul 23 2021 Omair Majid - 6.0.0-0.1.preview6 +- Initial package for .NET 6 + +* Thu Jun 10 2021 Omair Majid - 5.0.204-1 +- Update to .NET SDK 5.0.204 and Runtime 5.0.7 + +* Wed May 12 2021 Omair Majid - 5.0.203-1 +- Update to .NET SDK 5.0.203 and Runtime 5.0.6 + +* Wed Apr 14 2021 Omair Majid - 5.0.202-1 +- Update to .NET SDK 5.0.202 and Runtime 5.0.5 + +* Tue Apr 06 2021 Omair Majid - 5.0.104-2 +- Mark files under /etc/ as config(noreplace) +- Add an rpm-inspect configuration file +- Add an rpmlintrc file +- Enable gating for release branches and ELN too + +* Tue Mar 16 2021 Omair Majid - 5.0.104-1 +- Update to .NET SDK 5.0.104 and Runtime 5.0.4 +- Drop unneeded/upstreamed patches + +* Wed Feb 17 2021 Omair Majid - 5.0.103-2 +- Add Fedora 35 RIDs + +* Thu Feb 11 2021 Omair Majid - 5.0.103-1 +- Update to .NET SDK 5.0.103 and Runtime 5.0.3 + +* Fri Jan 29 2021 Omair Majid - 5.0.102-2 +- Disable bootstrap + +* Fri Dec 18 2020 Omair Majid - 5.0.100-2 +- Update to .NET Core Runtime 5.0.0 and SDK 5.0.100 commit 9c4e5de + +* Fri Dec 04 2020 Omair Majid - 5.0.100-1 +- Update to .NET Core Runtime 5.0.0 and SDK 5.0.100 + +* Thu Dec 03 2020 Omair Majid - 5.0.100-0.4.20201202git337413b +- Update to latest 5.0 pre-GA commit + +* Tue Nov 24 2020 Omair Majid - 5.0.100-0.4.20201123gitdee899c +- Update to 5.0 pre-GA commit + +* Mon Sep 14 2020 Omair Majid - 5.0.100-0.3.preview8 +- Update to Preview 8 + +* Fri Jul 10 2020 Omair Majid - 5.0.100-0.2.preview4 +- Fix building with custom CFLAGS/CXXFLAGS/LDFLAGS +- Clean up patches + +* Mon Jul 06 2020 Omair Majid - 5.0.100-0.1.preview4 +- Initial build + +* Sat Jun 27 2020 Omair Majid - 3.1.105-4 +- Disable bootstrap + +* Fri Jun 26 2020 Omair Majid - 3.1.105-3 +- Re-bootstrap aarch64 + +* Fri Jun 19 2020 Omair Majid - 3.1.105-3 +- Disable bootstrap + +* Thu Jun 18 2020 Omair Majid - 3.1.105-1 +- Bootstrap aarch64 + +* Tue Jun 16 2020 Chris Rummel - 3.1.105-1 +- Update to .NET Core Runtime 3.1.5 and SDK 3.1.105 + +* Fri Jun 05 2020 Chris Rummel - 3.1.104-1 +- Update to .NET Core Runtime 3.1.4 and SDK 3.1.104 + +* Thu Apr 09 2020 Chris Rummel - 3.1.103-1 +- Update to .NET Core Runtime 3.1.3 and SDK 3.1.103 + +* Mon Mar 16 2020 Omair Majid - 3.1.102-1 +- Update to .NET Core Runtime 3.1.2 and SDK 3.1.102 + +* Fri Feb 28 2020 Omair Majid - 3.1.101-4 +- Disable bootstrap + +* Fri Feb 28 2020 Omair Majid - 3.1.101-3 +- Enable bootstrap +- Add Fedora 33 runtime ids + +* Thu Feb 27 2020 Omair Majid - 3.1.101-2 +- Disable bootstrap + +* Tue Jan 21 2020 Omair Majid - 3.1.101-1 +- Update to .NET Core Runtime 3.1.1 and SDK 3.1.101 + +* Thu Dec 05 2019 Omair Majid - 3.1.100-1 +- Update to .NET Core Runtime 3.1.0 and SDK 3.1.100 + +* Mon Nov 18 2019 Omair Majid - 3.1.100-0.4.preview3 +- Fix apphost permissions + +* Fri Nov 15 2019 Omair Majid - 3.1.100-0.3.preview3 +- Update to .NET Core Runtime 3.1.0-preview3.19553.2 and SDK + 3.1.100-preview3-014645 + +* Wed Nov 06 2019 Omair Majid - 3.1.100-0.2 +- Update to .NET Core 3.1 Preview 2 + +* Wed Oct 30 2019 Omair Majid - 3.1.100-0.1 +- Update to .NET Core 3.1 Preview 1 + +* Thu Oct 24 2019 Omair Majid - 3.0.100-5 +- Add cgroupv2 support to .NET Core + +* Wed Oct 16 2019 Omair Majid - 3.0.100-4 +- Include fix from coreclr for building on Fedora 32 + +* Wed Oct 16 2019 Omair Majid - 3.0.100-3 +- Harden built binaries to pass annocheck + +* Fri Oct 11 2019 Omair Majid - 3.0.100-2 +- Export DOTNET_ROOT in profile to make apphost lookup work + +* Fri Sep 27 2019 Omair Majid - 3.0.100-1 +- Update to .NET Core Runtime 3.0.0 and SDK 3.0.100 + +* Wed Sep 25 2019 Omair Majid - 3.0.100-0.18.rc1 +- Update to .NET Core Runtime 3.0.0-rc1-19456-20 and SDK 3.0.100-rc1-014190 + +* Tue Sep 17 2019 Omair Majid - 3.0.100-0.16.preview9 +- Fix files duplicated between dotnet-apphost-pack-3.0 and dotnet-targeting-pack-3.0 +- Fix dependencies between .NET SDK and the targeting packs + +* Mon Sep 16 2019 Omair Majid - 3.0.100-0.15.preview9 +- Update to .NET Core Runtime 3.0.0-preview 9 and SDK 3.0.100-preview9 + +* Mon Aug 19 2019 Omair Majid - 3.0.100-0.11.preview8 +- Update to .NET Core Runtime 3.0.0-preview8-28405-07 and SDK + 3.0.100-preview8-013656 + +* Tue Jul 30 2019 Omair Majid - 3.0.100-0.9.preview7 +- Update to .NET Core Runtime 3.0.0-preview7-27912-14 and SDK + 3.0.100-preview7-012821 + +* Fri Jul 26 2019 Omair Majid - 3.0.100-0.8.preview7 +- Update to .NET Core Runtime 3.0.0-preview7-27902-19 and SDK + 3.0.100-preview7-012802 + +* Wed Jun 26 2019 Omair Majid - 3.0.0-0.7.preview6 +- Obsolete dotnet-sdk-3.0.1xx +- Add supackages for targeting packs +- Add -fcf-protection to CFLAGS + +* Wed Jun 26 2019 Omair Majid - 3.0.0-0.6.preview6 +- Update to .NET Core Runtime 3.0.0-preview6-27804-01 and SDK 3.0.100-preview6-012264 +- Set dotnet installation location in /etc/dotnet/install_location +- Update targeting packs +- Install managed symbols +- Completely conditionalize libunwind bundling + +* Tue May 07 2019 Omair Majid - 3.0.0-0.3.preview4 +- Update to .NET Core 3.0 preview 4 + +* Tue Dec 18 2018 Omair Majid - 3.0.0-0.1.preview1 +- Update to .NET Core 3.0 preview 1 + +* Fri Dec 07 2018 Omair Majid - 2.2.100 +- Update to .NET Core 2.2.0 + +* Wed Nov 07 2018 Omair Majid - 2.2.100-0.2.preview3 +- Update to .NET Core 2.2.0-preview3 + +* Fri Nov 02 2018 Omair Majid - 2.1.403-3 +- Add host-fxr-2.1 subpackage + +* Mon Oct 15 2018 Omair Majid - 2.1.403-2 +- Disable telemetry by default +- Users have to manually export DOTNET_CLI_TELEMETRY_OPTOUT=0 to enable + +* Tue Oct 02 2018 Omair Majid - 2.1.403-1 +- Update to .NET Core Runtime 2.1.5 and SDK 2.1.403 + +* Wed Sep 26 2018 Omair Majid - 2.1.402-2 +- Add ~/.dotnet/tools to $PATH to make it easier to use dotnet tools + +* Thu Sep 13 2018 Omair Majid - 2.1.402-1 +- Update to .NET Core Runtime 2.1.4 and SDK 2.1.402 + +* Wed Sep 05 2018 Omair Majid - 2.1.401-2 +- Use distro-standard flags when building .NET Core + +* Tue Aug 21 2018 Omair Majid - 2.1.401-1 +- Update to .NET Core Runtime 2.1.3 and SDK 2.1.401 + +* Mon Aug 20 2018 Omair Majid - 2.1.302-1 +- Update to .NET Core Runtime 2.1.2 and SDK 2.1.302 + +* Fri Jul 20 2018 Omair Majid - 2.1.301-1 +- Update to .NET Core 2.1 + +* Thu May 03 2018 Omair Majid - 2.0.7-1 +- Update to .NET Core 2.0.7 + +* Wed Mar 28 2018 Omair Majid - 2.0.6-2 +- Enable bash completion for dotnet +- Remove redundant buildrequires and requires + +* Wed Mar 14 2018 Omair Majid - 2.0.6-1 +- Update to .NET Core 2.0.6 + +* Fri Feb 23 2018 Omair Majid - 2.0.5-1 +- Update to .NET Core 2.0.5 + +* Wed Jan 24 2018 Omair Majid - 2.0.3-5 +- Don't apply corefx clang warnings fix on clang < 5 + +* Fri Jan 19 2018 Omair Majid - 2.0.3-4 +- Add a test script to sanity check debug and symbol info. +- Build with clang 5.0 +- Make main package real instead of using a virtual provides (see RHBZ 1519325) + +* Wed Nov 29 2017 Omair Majid - 2.0.3-3 +- Add a Provides for 'dotnet' +- Fix conditional macro + +* Tue Nov 28 2017 Omair Majid - 2.0.3-2 +- Fix build on Fedora 27 + +* Fri Nov 17 2017 Omair Majid - 2.0.3-1 +- Update to .NET Core 2.0.3 + +* Thu Oct 19 2017 Omair Majid - 2.0.0-4 +- Add a hack to let omnisharp work + +* Wed Aug 30 2017 Omair Majid - 2.0.0-3 +- Add a patch for building coreclr and core-setup correctly on Fedora >= 27 + +* Fri Aug 25 2017 Omair Majid - 2.0.0-2 +- Move libicu/libcurl/libunwind requires to runtime package +- Make sdk depend on the exact version of the runtime package + +* Thu Aug 24 2017 Omair Majid - 2.0.0-1 +- Update to 2.0.0 final release + +* Wed Jul 26 2017 Omair Majid - 2.0.0-0.3.preview2 +- Add man pages + +* Tue Jul 25 2017 Omair Majid - 2.0.0-0.2.preview2 +- Add Requires on libicu +- Split into multiple packages +- Do not repeat first-run message + +* Fri Jul 21 2017 Omair Majid - 2.0.0-0.1.preview2 +- Update to .NET Core 2.0 Preview 2 + +* Thu Mar 16 2017 Nemanja Milošević - 1.1.0-7 +- rebuilt with latest libldb +* Wed Feb 22 2017 Nemanja Milosevic - 1.1.0-6 +- compat-openssl 1.0 for F26 for now +* Sun Feb 19 2017 Nemanja Milosevic - 1.1.0-5 +- Fix wrong commit id's +* Sat Feb 18 2017 Nemanja Milosevic - 1.1.0-4 +- Use commit id's instead of branch names +* Sat Feb 18 2017 Nemanja Milosevic - 1.1.0-3 +- Improper patch5 fix +* Sat Feb 18 2017 Nemanja Milosevic - 1.1.0-2 +- SPEC cleanup +- git removal (using all tarballs for reproducible builds) +- more reasonable versioning +* Thu Feb 09 2017 Nemanja Milosevic - 1.1.0-1 +- Fixed debuginfo going to separate package (Patch1) +- Added F25/F26 RIL and fixed the version info (Patch2) +- Added F25/F26 RIL in Microsoft.NETCore.App suported runtime graph (Patch3) +- SPEC file cleanup +* Wed Jan 11 2017 Nemanja Milosevic - 1.1.0-0 +- Initial RPM for Fedora 25/26. diff --git a/fsharp-no-apphost.patch b/fsharp-no-apphost.patch new file mode 100644 index 0000000..1534888 --- /dev/null +++ b/fsharp-no-apphost.patch @@ -0,0 +1,21 @@ +--- a/tests/benchmarks/MicroPerf/MicroPerf.fsproj ++++ b/tests/benchmarks/MicroPerf/MicroPerf.fsproj +@@ -9,6 +9,7 @@ + $(OtherFlags) --nowarn:57 + $(OtherFlags) --langversion:preview + $(OtherFlags) --define:PREVIEW ++ false + + + + $(OtherFlags) --nowarn:1204 + + diff --git a/fsharp-use-work-tree-with-git-apply.patch b/fsharp-use-work-tree-with-git-apply.patch new file mode 100644 index 0000000..810cf67 --- /dev/null +++ b/fsharp-use-work-tree-with-git-apply.patch @@ -0,0 +1,11 @@ +--- a/eng/SourceBuild.props ++++ b/eng/SourceBuild.props +@@ -15,7 +15,7 @@ + + + + diff --git a/gating.yaml b/gating.yaml new file mode 100644 index 0000000..8574546 --- /dev/null +++ b/gating.yaml @@ -0,0 +1,20 @@ +--- !Policy +product_versions: + - fedora-* +decision_context: bodhi_update_push_testing +subject_type: koji_build +rules: + - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional} +--- !Policy +product_versions: + - fedora-* +decision_context: bodhi_update_push_stable +subject_type: koji_build +rules: + - !PassingTestCaseRule {test_case_name: fedora-ci.koji-build.tier0.functional} +--- !Policy +product_versions: + - rhel-* +decision_context: osci_compose_gate +rules: + - !PassingTestCaseRule {test_case_name: osci.brew-build.tier0.functional} diff --git a/installer-12516-portablerid.patch b/installer-12516-portablerid.patch new file mode 100644 index 0000000..4cb4ab6 --- /dev/null +++ b/installer-12516-portablerid.patch @@ -0,0 +1,23 @@ +From 892222071f73062f969f4f6ed1df8f759b9327b7 Mon Sep 17 00:00:00 2001 +From: Tom Deseyn +Date: Wed, 3 Nov 2021 15:12:59 +0100 +Subject: [PATCH] GetRuntimeInformation.targets: determine + PortableProductMonikerRid based on HostOSName and Architecture. + +--- + src/redist/targets/GetRuntimeInformation.targets | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/redist/targets/GetRuntimeInformation.targets b/src/redist/targets/GetRuntimeInformation.targets +index 5133c3a3841..01f704c7d8e 100644 +--- a/src/redist/targets/GetRuntimeInformation.targets ++++ b/src/redist/targets/GetRuntimeInformation.targets +@@ -28,6 +28,8 @@ + '$(Rid)' == 'linux-musl-x64' ">$(Rid) + $(OSName)-$(Architecture) + ++ $(HostOSName)-$(Architecture) ++ + dotnet-sdk-internal$(PgoTerm) + dotnet-sdk$(PgoTerm) + diff --git a/installer-12622-fix-runtime-symbols.patch b/installer-12622-fix-runtime-symbols.patch new file mode 100644 index 0000000..fa2d46f --- /dev/null +++ b/installer-12622-fix-runtime-symbols.patch @@ -0,0 +1,48 @@ +From 7365824ddc6ed66152cfc50f4c8508368953099c Mon Sep 17 00:00:00 2001 +From: Omair Majid +Date: Tue, 9 Nov 2021 08:39:27 -0500 +Subject: [PATCH] Also publish non-portable RID runtime symbols tarball + +This fixes a regression in .NET 6 source-build compared to the .NET +5 source-build. + +source-build wants to publish runtime symbols tarball for portable (eg, +linux-x64) and non-portable (eg, fedora.33-x64) RIDs here after a build. +Following .NET 5 conventions, I expected to see: + + ./artifacts/x64/Release/runtime/dotnet-runtime-symbols-fedora.34-x64-6.0.0.tar.gz + ./artifacts/x64/Release/runtime/dotnet-runtime-symbols-linux-x64-6.0.0.tar.gz + +Unfortunately, only the portable RID (linux-x64) tarball is present +after a full source-build in .NET 6. + +It turns out this is a bug in our build scripts. We try and copy +binaries - including the symbol tarballs - after building each of +runtime-portable and runtime. However, the target dependency is wrong: +after `Build`, the intermediate package doesn't exist from the +just-built repo. + +What ends up happening is that nothing is copied after building +runtime-portable. However, after building runtime, the runtime-portable +intermediate artifacts are found and copied over. So the end +build has portable RID symbos, but not the non-portable ones. + +Fix that by changing the dependency of this target so it runs after +intermediate packages are available. +--- + src/SourceBuild/tarball/content/repos/runtime.common.targets | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/SourceBuild/tarball/content/repos/runtime.common.targets b/src/SourceBuild/tarball/content/repos/runtime.common.targets +index ca606b23d21..862b70dc832 100644 +--- a/src/SourceBuild/tarball/content/repos/runtime.common.targets ++++ b/src/SourceBuild/tarball/content/repos/runtime.common.targets +@@ -23,7 +23,7 @@ + + + + diff --git a/msbuild-no-systemconfiguration.patch b/msbuild-no-systemconfiguration.patch new file mode 100644 index 0000000..537470d --- /dev/null +++ b/msbuild-no-systemconfiguration.patch @@ -0,0 +1,46 @@ +--- a/src/Build/Definition/ProjectCollection.cs ++++ b/src/Build/Definition/ProjectCollection.cs +@@ -1754,7 +1754,11 @@ namespace Microsoft.Build.Evaluation + #if FEATURE_WIN32_REGISTRY + ToolsetRegistryReader registryReader = null, + #endif ++#if FEATURE_SYSTEM_CONFIGURATION + ToolsetConfigurationReader configReader = null ++#else ++ object configReader = null ++#endif + ) + { + _toolsets = new Dictionary(StringComparer.OrdinalIgnoreCase); +--- a/src/Build/Definition/ToolsetReader.cs ++++ b/src/Build/Definition/ToolsetReader.cs +@@ -101,7 +101,11 @@ namespace Microsoft.Build.Evaluation + #if FEATURE_WIN32_REGISTRY + ToolsetRegistryReader registryReader, + #endif ++#if FEATURE_SYSTEM_CONFIGURATION + ToolsetConfigurationReader configurationReader, ++#else ++ object _configurationReader, ++#endif + PropertyDictionary environmentProperties, + PropertyDictionary globalProperties, + ToolsetDefinitionLocations locations +@@ -120,6 +124,7 @@ namespace Microsoft.Build.Evaluation + + if ((locations & ToolsetDefinitionLocations.ConfigurationFile) == ToolsetDefinitionLocations.ConfigurationFile) + { ++#if FEATURE_SYSTEM_CONFIGURATION + if (configurationReader == null) + { + configurationReader = new ToolsetConfigurationReader(environmentProperties, globalProperties); +@@ -129,6 +134,9 @@ namespace Microsoft.Build.Evaluation + defaultToolsVersionFromConfiguration = configurationReader.ReadToolsets(toolsets, globalProperties, + initialProperties, true /* accumulate properties */, out overrideTasksPathFromConfiguration, + out defaultOverrideToolsVersionFromConfiguration); ++#else ++ throw new InvalidOperationException("ToolsetDefinitionLocations.ConfigurationFile not supported"); ++#endif + } + + string defaultToolsVersionFromRegistry = null; diff --git a/msbuild-no-systemsecurity.patch b/msbuild-no-systemsecurity.patch new file mode 100644 index 0000000..dcf6809 --- /dev/null +++ b/msbuild-no-systemsecurity.patch @@ -0,0 +1,12 @@ +--- a/src/Shared/ExceptionHandling.cs ++++ b/src/Shared/ExceptionHandling.cs +@@ -153,7 +153,9 @@ namespace Microsoft.Build.Shared + internal static bool IsXmlException(Exception e) + { + return e is XmlException ++#if FEATURE_SECURITY_PERMISSIONS + || e is XmlSyntaxException ++#endif + || e is XmlSchemaException + || e is UriFormatException; // XmlTextReader for example uses this under the covers + } diff --git a/rename-tarball b/rename-tarball new file mode 100755 index 0000000..ea7e65c --- /dev/null +++ b/rename-tarball @@ -0,0 +1,51 @@ +#!/bin/bash + +# Usage: +# ./rename-tarball original-name.tar.gz new-name.tar.gz + +set -euo pipefail +IFS=$'\n\t' + +positional_args=() +while [[ "$#" -gt 0 ]]; do + arg="${1}" + case "${arg}" in + -h|--help) + print_usage + exit 0 + ;; + *) + positional_args+=("$1") + shift + ;; + esac +done + +if [[ -z "${positional_args[0]:-}" ]]; then + echo "error: missing original tarball name" + exit 1 +fi + +original_path=$(readlink -f "${positional_args[0]:-}") +original_name=$(basename "$original_path") + +new_name=${positional_args[1]:-} +if [[ -z ${new_name} ]]; then + echo "error: missing new tarball name" + exit 1 +fi + +original_name=${original_name/%.tar.gz} +new_name=${new_name/.tar.gz} + +echo "Original: ${original_name}.tar.gz" +echo "New name: ${new_name}.tar.gz" + +mkdir "temp-${new_name}" +pushd "temp-${new_name}" +tar xf "${original_path}" +mv -- * "${new_name}" +tar czf ../"${new_name}.tar.gz" "${new_name}" +rm -rf "${new_name}" +popd +rmdir "temp-${new_name}" diff --git a/roslyn-57003-mono-named-mutex.patch b/roslyn-57003-mono-named-mutex.patch new file mode 100644 index 0000000..c264bff --- /dev/null +++ b/roslyn-57003-mono-named-mutex.patch @@ -0,0 +1,453 @@ +Index: tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Core/Portable/InternalUtilities/PlatformInformation.cs +=================================================================== +--- tarball.6.0.1-rc2-6.0.100-rc2.orig/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Core/Portable/InternalUtilities/PlatformInformation.cs ++++ tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Core/Portable/InternalUtilities/PlatformInformation.cs +@@ -31,5 +31,24 @@ namespace Roslyn.Utilities + } + } + } ++ /// ++ /// Are we running on .NET 5 or later using the Mono runtime? ++ /// Will also return true when running on Mono itself; if necessary ++ /// we can use IsRunningOnMono to distinguish. ++ /// ++ public static bool IsUsingMonoRuntime ++ { ++ get ++ { ++ try ++ { ++ return !(Type.GetType("Mono.RuntimeStructs", throwOnError: false) is null); ++ } ++ catch ++ { ++ return false; ++ } ++ } ++ } + } + } +Index: tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/BuildClientTests.cs +=================================================================== +--- tarball.6.0.1-rc2-6.0.100-rc2.orig/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/BuildClientTests.cs ++++ tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/BuildClientTests.cs +@@ -79,7 +79,7 @@ namespace Microsoft.CodeAnalysis.Compile + // to connect. When it fails it should fall back to in-proc + // compilation. + bool holdsMutex; +- using (var serverMutex = new Mutex(initiallyOwned: true, ++ using (var serverMutex = BuildServerConnection.OpenOrCreateMutex( + name: BuildServerConnection.GetServerMutexName(_pipeName), + createdNew: out holdsMutex)) + { +Index: tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/CompilerServerApiTest.cs +=================================================================== +--- tarball.6.0.1-rc2-6.0.100-rc2.orig/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/CompilerServerApiTest.cs ++++ tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/CompilerServerApiTest.cs +@@ -103,7 +103,7 @@ class Hello + var mutexName = BuildServerConnection.GetServerMutexName(pipeName); + + bool holdsMutex; +- using (var mutex = new Mutex(initiallyOwned: true, ++ using (var mutex = BuildServerConnection.OpenOrCreateMutex( + name: mutexName, + createdNew: out holdsMutex)) + { +@@ -119,7 +119,7 @@ class Hello + } + finally + { +- mutex.ReleaseMutex(); ++ mutex.Dispose(); + } + } + } +Index: tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/CompilerServerTests.cs +=================================================================== +--- tarball.6.0.1-rc2-6.0.100-rc2.orig/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/CompilerServerTests.cs ++++ tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/CompilerServerTests.cs +@@ -304,7 +304,7 @@ End Module") + var newTempDir = _tempDirectory.CreateDirectory(new string('a', 100 - _tempDirectory.Path.Length)); + await ApplyEnvironmentVariables( + new[] { new KeyValuePair("TMPDIR", newTempDir.Path) }, +- async () => ++ async () => await Task.Run(async () => + { + using var serverData = await ServerUtil.CreateServer(_logger); + var result = RunCommandLineCompiler( +@@ -317,7 +317,7 @@ End Module") + + var listener = await serverData.Complete(); + Assert.Equal(CompletionData.RequestCompleted, listener.CompletionDataList.Single()); +- }); ++ })); + } + + [Fact] +Index: tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/VBCSCompilerServerTests.cs +=================================================================== +--- tarball.6.0.1-rc2-6.0.100-rc2.orig/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/VBCSCompilerServerTests.cs ++++ tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Server/VBCSCompilerTests/VBCSCompilerServerTests.cs +@@ -101,7 +101,7 @@ namespace Microsoft.CodeAnalysis.Compile + + var thread = new Thread(() => + { +- using (var mutex = new Mutex(initiallyOwned: true, name: mutexName, createdNew: out created)) ++ using (var mutex = BuildServerConnection.OpenOrCreateMutex(name: mutexName, createdNew: out created)) + using (var stream = NamedPipeUtil.CreateServer(pipeName)) + { + readyMre.Set(); +@@ -112,7 +112,7 @@ namespace Microsoft.CodeAnalysis.Compile + stream.Close(); + + doneMre.WaitOne(); +- mutex.ReleaseMutex(); ++ mutex.Dispose(); + } + }); + +@@ -153,7 +153,7 @@ namespace Microsoft.CodeAnalysis.Compile + { + using (var stream = NamedPipeUtil.CreateServer(pipeName)) + { +- var mutex = new Mutex(initiallyOwned: true, name: mutexName, createdNew: out created); ++ var mutex = BuildServerConnection.OpenOrCreateMutex(name: mutexName, createdNew: out created); + readyMre.Set(); + + stream.WaitForConnection(); +@@ -161,7 +161,6 @@ namespace Microsoft.CodeAnalysis.Compile + + // Client is waiting for a response. Close the mutex now. Then close the connection + // so the client gets an error. +- mutex.ReleaseMutex(); + mutex.Dispose(); + stream.Close(); + +Index: tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Shared/BuildServerConnection.cs +=================================================================== +--- tarball.6.0.1-rc2-6.0.100-rc2.orig/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Shared/BuildServerConnection.cs ++++ tarball.6.0.1-rc2-6.0.100-rc2/src/roslyn.8e1779e16298415843e85029d8b52a1ae9bb4c30/src/Compilers/Shared/BuildServerConnection.cs +@@ -543,19 +543,10 @@ namespace Microsoft.CodeAnalysis.Command + { + try + { +- if (PlatformInformation.IsRunningOnMono) ++ if (PlatformInformation.IsUsingMonoRuntime) + { +- IServerMutex? mutex = null; +- bool createdNew = false; +- try +- { +- mutex = new ServerFileMutexPair(mutexName, false, out createdNew); +- return !createdNew; +- } +- finally +- { +- mutex?.Dispose(); +- } ++ using var mutex = new ServerFileMutex(mutexName); ++ return !mutex.CouldLock(); + } + else + { +@@ -572,9 +563,11 @@ namespace Microsoft.CodeAnalysis.Command + + internal static IServerMutex OpenOrCreateMutex(string name, out bool createdNew) + { +- if (PlatformInformation.IsRunningOnMono) ++ if (PlatformInformation.IsUsingMonoRuntime) + { +- return new ServerFileMutexPair(name, initiallyOwned: true, out createdNew); ++ var mutex = new ServerFileMutex(name); ++ createdNew = mutex.TryLock(0); ++ return mutex; + } + else + { +@@ -648,19 +641,22 @@ namespace Microsoft.CodeAnalysis.Command + } + + /// +- /// An interprocess mutex abstraction based on OS advisory locking (FileStream.Lock/Unlock). ++ /// An interprocess mutex abstraction based on file sharing permission (FileShare.None). + /// If multiple processes running as the same user create FileMutex instances with the same name, + /// those instances will all point to the same file somewhere in a selected temporary directory. +- /// The TryLock method can be used to attempt to acquire the mutex, with Unlock or Dispose used to release. ++ /// The TryLock method can be used to attempt to acquire the mutex, with Dispose used to release. ++ /// The CouldLock method can be used to check whether an attempt to acquire the mutex would have ++ /// succeeded at the current time, without actually acquiring it. + /// Unlike Win32 named mutexes, there is no mechanism for detecting an abandoned mutex. The file + /// will simply revert to being unlocked but remain where it is. + /// +- internal sealed class FileMutex : IDisposable ++ internal sealed class ServerFileMutex : IServerMutex + { +- public readonly FileStream Stream; ++ public FileStream? Stream; + public readonly string FilePath; ++ public readonly string GuardPath; + +- public bool IsLocked { get; private set; } ++ public bool IsDisposed { get; private set; } + + internal static string GetMutexDirectory() + { +@@ -670,61 +666,176 @@ namespace Microsoft.CodeAnalysis.Command + return result; + } + +- public FileMutex(string name) ++ public ServerFileMutex(string name) + { +- FilePath = Path.Combine(GetMutexDirectory(), name); +- Stream = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); ++ var mutexDirectory = GetMutexDirectory(); ++ FilePath = Path.Combine(mutexDirectory, name); ++ GuardPath = Path.Combine(mutexDirectory, ".guard"); + } + +- public bool TryLock(int timeoutMs) ++ /// ++ /// Acquire the guard by opening the guard file with FileShare.None. The guard must only ever ++ /// be held for very brief amounts of time, so we can simply spin until it is acquired. The ++ /// guard must be released by disposing the FileStream returned from this routine. Note the ++ /// guard file is never deleted; this is a leak, but only of a single file. ++ /// ++ internal FileStream LockGuard() + { +- if (IsLocked) +- throw new InvalidOperationException("Lock already held"); +- +- var sw = Stopwatch.StartNew(); +- do ++ // We should be able to acquire the guard quickly. Limit the number of retries anyway ++ // by some arbitrary bound to avoid getting hung up in a possibly infinite loop. ++ for (var i = 0; i < 100; i++) + { + try + { +- Stream.Lock(0, 0); +- IsLocked = true; +- return true; ++ return new FileStream(GuardPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); + } + catch (IOException) + { +- // Lock currently held by someone else. ++ // Guard currently held by someone else. + // We want to sleep for a short period of time to ensure that other processes + // have an opportunity to finish their work and relinquish the lock. + // Spinning here (via Yield) would work but risks creating a priority + // inversion if the lock is held by a lower-priority process. + Thread.Sleep(1); + } ++ } ++ // Handle unexpected failure to acquire guard as error. ++ throw new InvalidOperationException("Unable to acquire guard"); ++ } ++ ++ /// ++ /// Attempt to acquire the lock by opening the lock file with FileShare.None. Sets "Stream" ++ /// and returns true if successful, returns false if the lock is already held by another ++ /// thread or process. Guard must be held when calling this routine. ++ /// ++ internal bool TryLockFile() ++ { ++ Debug.Assert(Stream is null); ++ FileStream? stream = null; ++ try ++ { ++ stream = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); ++ // On some targets, the file locking used to implement FileShare.None may not be ++ // atomic with opening/creating the file. This creates a race window when another ++ // thread holds the lock and is just about to unlock: we may be able to open the ++ // file here, then the other thread unlocks and deletes the file, and then we ++ // acquire the lock on our file handle - but the actual file is already deleted. ++ // To close this race, we verify that the file does in fact still exist now that ++ // we have successfull acquired the locked FileStream. (Note that this check is ++ // safe because we cannot race with an other attempt to create the file since we ++ // hold the guard, and after the FileStream constructor returned we can no race ++ // with file deletion because we hold the lock.) ++ if (!File.Exists(FilePath)) ++ { ++ // To simplify the logic, we treat this case as "unable to acquire the lock" ++ // because it we caught another process while it owned the lock and was just ++ // giving it up. If the caller retries, we'll likely acquire the lock then. ++ stream.Dispose(); ++ return false; ++ } ++ } ++ catch (Exception) ++ { ++ stream?.Dispose(); ++ return false; ++ } ++ Stream = stream; ++ return true; ++ } ++ ++ /// ++ /// Release the lock by deleting the lock file and disposing "Stream". ++ /// ++ internal void UnlockFile() ++ { ++ Debug.Assert(Stream is not null); ++ try ++ { ++ // Delete the lock file while the stream is not yet disposed ++ // and we therefore still hold the FileShare.None exclusion. ++ // There may still be a race with another thread attempting a ++ // TryLockFile in parallel, but that is safely handled there. ++ File.Delete(FilePath); ++ } ++ finally ++ { ++ Stream.Dispose(); ++ Stream = null; ++ } ++ } ++ ++ public bool TryLock(int timeoutMs) ++ { ++ if (IsDisposed) ++ throw new ObjectDisposedException("Mutex"); ++ if (Stream is not null) ++ throw new InvalidOperationException("Lock already held"); ++ ++ var sw = Stopwatch.StartNew(); ++ do ++ { ++ try ++ { ++ // Attempt to acquire lock while holding guard. ++ using var guard = LockGuard(); ++ if (TryLockFile()) ++ return true; ++ } + catch (Exception) + { +- // Something else went wrong. + return false; + } ++ ++ // See comment in LockGuard. ++ Thread.Sleep(1); + } while (sw.ElapsedMilliseconds < timeoutMs); + + return false; + } + +- public void Unlock() ++ public bool CouldLock() + { +- if (!IsLocked) +- return; +- Stream.Unlock(0, 0); +- IsLocked = false; ++ if (IsDisposed) ++ return false; ++ if (Stream is not null) ++ return false; ++ ++ try ++ { ++ // Attempt to acquire lock while holding guard, and if successful ++ // immediately unlock again while still holding guard. This ensures ++ // no other thread will spuriously observe the lock as held due to ++ // the lock attempt here. ++ using var guard = LockGuard(); ++ if (TryLockFile()) ++ { ++ UnlockFile(); ++ return true; ++ } ++ } ++ catch (Exception) ++ { ++ return false; ++ } ++ ++ return false; + } + + public void Dispose() + { +- var wasLocked = IsLocked; +- if (wasLocked) +- Unlock(); +- Stream.Dispose(); +- // We do not delete the lock file here because there is no reliable way to perform a +- // 'delete if no one has the file open' operation atomically on *nix. This is a leak. ++ if (IsDisposed) ++ return; ++ IsDisposed = true; ++ if (Stream is not null) ++ { ++ try ++ { ++ UnlockFile(); ++ } ++ catch (Exception) ++ { ++ } ++ } + } + } + +@@ -792,56 +903,4 @@ namespace Microsoft.CodeAnalysis.Command + } + } + } +- +- /// +- /// Approximates a named mutex with 'locked', 'unlocked' and 'abandoned' states. +- /// There is no reliable way to detect whether a mutex has been abandoned on some target platforms, +- /// so we use the AliveMutex to manually track whether the creator of a mutex is still running, +- /// while the HeldMutex represents the actual lock state of the mutex. +- /// +- internal sealed class ServerFileMutexPair : IServerMutex +- { +- public readonly FileMutex AliveMutex; +- public readonly FileMutex HeldMutex; +- +- public bool IsDisposed { get; private set; } +- +- public ServerFileMutexPair(string mutexName, bool initiallyOwned, out bool createdNew) +- { +- AliveMutex = new FileMutex(mutexName + "-alive"); +- HeldMutex = new FileMutex(mutexName + "-held"); +- createdNew = AliveMutex.TryLock(0); +- if (initiallyOwned && createdNew) +- { +- if (!TryLock(0)) +- throw new Exception("Failed to lock mutex after creating it"); +- } +- } +- +- public bool TryLock(int timeoutMs) +- { +- if (IsDisposed) +- throw new ObjectDisposedException("Mutex"); +- return HeldMutex.TryLock(timeoutMs); +- } +- +- public void Dispose() +- { +- if (IsDisposed) +- return; +- IsDisposed = true; +- +- try +- { +- HeldMutex.Unlock(); +- AliveMutex.Unlock(); +- } +- finally +- { +- AliveMutex.Dispose(); +- HeldMutex.Dispose(); +- } +- } +- } +- + } diff --git a/roslyn-analyzers-no-apphost.patch b/roslyn-analyzers-no-apphost.patch new file mode 100644 index 0000000..c1fc3dd --- /dev/null +++ b/roslyn-analyzers-no-apphost.patch @@ -0,0 +1,10 @@ +--- a/src/Tools/ReleaseNotesUtil/ReleaseNotesUtil.csproj ++++ b/src/Tools/ReleaseNotesUtil/ReleaseNotesUtil.csproj +@@ -4,6 +4,7 @@ + netcoreapp3.1 + true + true ++ false + + + diff --git a/roslyn-no-apphost.patch b/roslyn-no-apphost.patch new file mode 100644 index 0000000..f1767c7 --- /dev/null +++ b/roslyn-no-apphost.patch @@ -0,0 +1,10 @@ +--- a/src/Workspaces/Remote/ServiceHub.CoreComponents/Microsoft.CodeAnalysis.Remote.ServiceHub.CoreComponents.csproj ++++ b/src/Workspaces/Remote/ServiceHub.CoreComponents/Microsoft.CodeAnalysis.Remote.ServiceHub.CoreComponents.csproj +@@ -5,6 +5,7 @@ + Exe + netcoreapp3.1 + ++ false + false + + diff --git a/rpminspect.yaml b/rpminspect.yaml new file mode 100644 index 0000000..2e7c0b7 --- /dev/null +++ b/rpminspect.yaml @@ -0,0 +1,9 @@ +--- +inspections: + # We patch upstream a lot, no need to reject patches + patches: off +runpath: + # Upstream explicitly sets $ORIGIN/netcoredeps as an RPATH + # See https://github.com/dotnet/core/blob/main/Documentation/self-contained-linux-apps.md + allowed_origin_paths: + - /netcoredeps diff --git a/runtime-61442-disable-werror.patch b/runtime-61442-disable-werror.patch new file mode 100644 index 0000000..401440c --- /dev/null +++ b/runtime-61442-disable-werror.patch @@ -0,0 +1,41 @@ +From f41c06ba040adf1930156340c5b03d9864d8a1d4 Mon Sep 17 00:00:00 2001 +From: Omair Majid +Date: Wed, 10 Nov 2021 17:54:45 -0500 +Subject: [PATCH] The 6.0 branch is no longer pre-release + +This has limited affects, but it should have been set to false since 6.0 +is now stable/released. + +The one difference it makes is that -Werror is disabled when building +native code. +--- + Directory.Build.props | 2 +- + eng/native/configureplatform.cmake | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Directory.Build.props b/Directory.Build.props +index f19ea9208c2c..5cb87bb7c257 100644 +--- a/Directory.Build.props ++++ b/Directory.Build.props +@@ -255,7 +255,7 @@ + https://go.microsoft.com/fwlink/?LinkID=799421 + + +- true ++ false + $(MSBuildProjectName.Contains('Private')) + + true +diff --git a/eng/native/configureplatform.cmake b/eng/native/configureplatform.cmake +index 519431772004..af1c88bce5b6 100644 +--- a/eng/native/configureplatform.cmake ++++ b/eng/native/configureplatform.cmake +@@ -2,7 +2,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/functions.cmake) + + # If set, indicates that this is not an officially supported release + # Keep in sync with IsPrerelease in Directory.Build.props +-set(PRERELEASE 1) ++set(PRERELEASE 0) + + #---------------------------------------- + # Detect and set platform variable names diff --git a/runtime-62170-clang13.patch b/runtime-62170-clang13.patch new file mode 100644 index 0000000..8c47186 --- /dev/null +++ b/runtime-62170-clang13.patch @@ -0,0 +1,76 @@ +From 9cd95a5608b667e22727d9eb1a5330efd61dfe50 Mon Sep 17 00:00:00 2001 +From: Jan Vorlicek +Date: Mon, 29 Nov 2021 17:32:45 -0800 +Subject: [PATCH] Fix clang 13 induced runtime issues + +The clang 13 optimizer started to assume that "this" pointer is always +properly aligned. That lead to elimination of some code that was actually +needed. +It also takes pointer aliasing rules more strictly in one place in jit. +That caused the optimizer to falsely assume that a callee with an argument +passed by reference is not modifying that argument and used a stale +copy of the original value at the caller site. + +This change fixes both of the issues. With this fix, runtime compiled +using clang 13 seems to be fully functional. +--- + src/coreclr/inc/corhlpr.h | 8 ++++---- + src/coreclr/jit/bitsetasshortlong.h | 4 ++-- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/src/coreclr/inc/corhlpr.h b/src/coreclr/inc/corhlpr.h +index 450514da95c1..427e8cdc0ff5 100644 +--- a/src/coreclr/inc/corhlpr.h ++++ b/src/coreclr/inc/corhlpr.h +@@ -336,7 +336,7 @@ struct COR_ILMETHOD_SECT + const COR_ILMETHOD_SECT* Next() const + { + if (!More()) return(0); +- return ((COR_ILMETHOD_SECT*)(((BYTE *)this) + DataSize()))->Align(); ++ return ((COR_ILMETHOD_SECT*)Align(((BYTE *)this) + DataSize())); + } + + const BYTE* Data() const +@@ -374,9 +374,9 @@ struct COR_ILMETHOD_SECT + return((AsSmall()->Kind & CorILMethod_Sect_FatFormat) != 0); + } + +- const COR_ILMETHOD_SECT* Align() const ++ static const void* Align(const void* p) + { +- return((COR_ILMETHOD_SECT*) ((((UINT_PTR) this) + 3) & ~3)); ++ return((void*) ((((UINT_PTR) p) + 3) & ~3)); + } + + protected: +@@ -579,7 +579,7 @@ typedef struct tagCOR_ILMETHOD_FAT : IMAGE_COR_ILMETHOD_FAT + + const COR_ILMETHOD_SECT* GetSect() const { + if (!More()) return (0); +- return(((COR_ILMETHOD_SECT*) (GetCode() + GetCodeSize()))->Align()); ++ return(((COR_ILMETHOD_SECT*) COR_ILMETHOD_SECT::Align(GetCode() + GetCodeSize()))); + } + } COR_ILMETHOD_FAT; + +diff --git a/src/coreclr/jit/bitsetasshortlong.h b/src/coreclr/jit/bitsetasshortlong.h +index d343edeeda4c..365cf346a10a 100644 +--- a/src/coreclr/jit/bitsetasshortlong.h ++++ b/src/coreclr/jit/bitsetasshortlong.h +@@ -345,7 +345,7 @@ class BitSetOps /dev/null; then +- # Only lld version >= 9 can be considered stable +- if [[ "$majorVersion" -ge 9 ]]; then +- LDFLAGS="-fuse-ld=lld" +- fi ++ if "$CC" -fuse-ld=lld -Wl,--version >/dev/null 2>&1; then ++ LDFLAGS="-fuse-ld=lld" + fi + fi + diff --git a/runtime-mono-remove-ilstrip.patch b/runtime-mono-remove-ilstrip.patch new file mode 100644 index 0000000..9a711f8 --- /dev/null +++ b/runtime-mono-remove-ilstrip.patch @@ -0,0 +1,33 @@ +diff --git a/src/mono/nuget/Microsoft.NET.Runtime.MonoTargets.Sdk/Microsoft.NET.Runtime.MonoTargets.Sdk.pkgproj b/src/mono/nuget/Microsoft.NET.Runtime.MonoTargets.Sdk/Microsoft.NET.Runtime.MonoTargets.Sdk.pkgproj +index 724b704f864..3dabdc81dae 100644 +--- a/src/mono/nuget/Microsoft.NET.Runtime.MonoTargets.Sdk/Microsoft.NET.Runtime.MonoTargets.Sdk.pkgproj ++++ b/src/mono/nuget/Microsoft.NET.Runtime.MonoTargets.Sdk/Microsoft.NET.Runtime.MonoTargets.Sdk.pkgproj +@@ -6,7 +6,7 @@ + + + +- ++ + + + +@@ -15,7 +15,7 @@ + + + +- ++ + + + +diff --git a/src/mono/nuget/Microsoft.NET.Runtime.MonoTargets.Sdk/Sdk/Sdk.props b/src/mono/nuget/Microsoft.NET.Runtime.MonoTargets.Sdk/Sdk/Sdk.props +index 8a7ede79242..cfd515eeca9 100644 +--- a/src/mono/nuget/Microsoft.NET.Runtime.MonoTargets.Sdk/Sdk/Sdk.props ++++ b/src/mono/nuget/Microsoft.NET.Runtime.MonoTargets.Sdk/Sdk/Sdk.props +@@ -1,5 +1,5 @@ + +- ++ + + + diff --git a/sdk-22373-portablerid.patch b/sdk-22373-portablerid.patch new file mode 100644 index 0000000..8b39eb3 --- /dev/null +++ b/sdk-22373-portablerid.patch @@ -0,0 +1,22 @@ +From 499fcf6e3b0e4b01a9c340a06f00cfc3e1fcc5d2 Mon Sep 17 00:00:00 2001 +From: Tom Deseyn +Date: Tue, 5 Oct 2021 09:04:14 +0200 +Subject: [PATCH] Use the portable rid for --use-current-runtime. + +--- + .../targets/Microsoft.NET.RuntimeIdentifierInference.targets | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.RuntimeIdentifierInference.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.RuntimeIdentifierInference.targets +index 17308aa9160..e764b2d9845 100644 +--- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.RuntimeIdentifierInference.targets ++++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.RuntimeIdentifierInference.targets +@@ -62,7 +62,7 @@ Copyright (c) .NET Foundation. All rights reserved. + + + +- $(NETCoreSdkRuntimeIdentifier) ++ $(NETCoreSdkPortableRuntimeIdentifier) + + + diff --git a/sdk-telemetry-optout.patch b/sdk-telemetry-optout.patch new file mode 100644 index 0000000..d6e6464 --- /dev/null +++ b/sdk-telemetry-optout.patch @@ -0,0 +1,18 @@ +diff --git a/src/Cli/dotnet/Program.cs b/src/Cli/dotnet/Program.cs +index de1ebb9e6..6bbf479de 100644 +--- a/src/Cli/dotnet/Program.cs ++++ b/src/Cli/dotnet/Program.cs +@@ -28,6 +28,13 @@ public class Program + + public static int Main(string[] args) + { ++ // opt out of telemetry by default if the env var is unset ++ string telemetryValue = Environment.GetEnvironmentVariable("DOTNET_CLI_TELEMETRY_OPTOUT"); ++ if (String.IsNullOrEmpty(telemetryValue)) ++ { ++ Environment.SetEnvironmentVariable("DOTNET_CLI_TELEMETRY_OPTOUT", "1"); ++ } ++ + DebugHelper.HandleDebugSwitch(ref args); + + // Capture the current timestamp to calculate the host overhead. diff --git a/sources b/sources new file mode 100644 index 0000000..e5277d1 --- /dev/null +++ b/sources @@ -0,0 +1,3 @@ +SHA512 (dotnet-9e8b04bbff820c93c142f99a507a46b976f5c14c-x64-bootstrap.tar.xz) = dedbc8619af5141f7cba108c4060cbbcf9c4c4c8968180ed1dc71d2afdf829a99c479b6daaf5c15018b8cd66de14eb6fee9fc4072f81546067544a6a6a20b641 +SHA512 (dotnet-arm64-prebuilts-2021-10-29.tar.gz) = e24fb8bb8b0fb24f52a68d472356574d8edf7af554b14618aeeae6ff76b54ce5e6d8a9deb056f9bc052bff8d17bae01c6475217039508bb0e08303f9f6c4b5d1 +SHA512 (dotnet-s390x-prebuilts-2021-10-29.tar.gz) = 6ea9d857edce50efd1cc35a73b3b3ccb170bbdb5cc4c8b20fb0ee1c7cb75cc573a565b01ef1bf4eec10a3e6e5209143957425cee5ff3fe24c7c1c89813272a99 diff --git a/tests/.fmf/version b/tests/.fmf/version new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/tests/.fmf/version @@ -0,0 +1 @@ +2 diff --git a/tests/provision.fmf b/tests/provision.fmf new file mode 100644 index 0000000..87b3807 --- /dev/null +++ b/tests/provision.fmf @@ -0,0 +1,6 @@ +--- + +standard-inventory-qcow2: + qemu: + m: 5G + diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..a1b43d8 --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1,37 @@ +--- +- hosts: localhost + roles: + - role: standard-test-basic + tags: + - classic + - container + - atomic + repositories: + - repo: "https://github.com/redhat-developer/dotnet-regular-tests.git" + dest: "dotnet-regular-tests" + version: "main" + tests: + - download_test_runner: + dir: ./ + run: wget --no-verbose https://github.com/redhat-developer/dotnet-bunny/releases/latest/download/turkey-$(uname -m) -O turkey && chmod +x ./turkey + - print_test_runner_version: + dir: ./ + run: ./turkey --version + - regular: + dir: ./ + run: ./turkey -l={{ remote_artifacts }} dotnet-regular-tests + required_packages: + - aspnetcore-runtime-6.0 + - bash-completion + - binutils + - dotnet-sdk-6.0 + - dotnet-runtime-6.0 + - expect + - git + - jq + - lldb + - npm + - python3 + - strace + - wget + - which diff --git a/update-release b/update-release new file mode 100755 index 0000000..70b3c87 --- /dev/null +++ b/update-release @@ -0,0 +1,95 @@ +#!/bin/bash + +# Usage: +# ./update-release sdk-version runtime-version [--bug bug-id] [--tarball tarball-name] + +set -euo pipefail +IFS=$'\n\t' + +print_usage() { + echo " Usage:" + echo " ./update-release sdk-version runtime-version [--bug bug-id] [--tarball tarball-name]" +} + +user_provided_tarball_name="" + +positional_args=() +bug_ids=() +while [[ "$#" -gt 0 ]]; do + arg="$1" + case "${arg}" in + --bug) + bug_ids+=("$2") + shift; + shift; + ;; + -h|--help) + print_usage + exit 0 + ;; + --tarball) + user_provided_tarball_name="$2" + shift; + shift; + ;; + *) + positional_args+=("$1") + shift + ;; + esac +done + +spec_files=( ./*.spec ) +spec_file="${spec_files[0]}" + +sdk_version=${positional_args[0]:-} +if [[ -z ${sdk_version} ]]; then + echo "error: missing sdk version" + exit 1 +fi + +runtime_version=${positional_args[1]:-} +if [[ -z ${runtime_version} ]]; then + echo "error: missing runtime version" + exit 1 +fi + +host_version="$runtime_version" + +tag=v${sdk_version}-SDK + +if [[ -f "dotnet-${tag}-original.tar.gz" ]]; then + echo "dotnet-${tag}-original.tar.gz alredy exists, not rebuilding tarball" +else + if [[ -n "${user_provided_tarball_name}" ]]; then + ./rename-tarball "$user_provided_tarball_name" "dotnet-${tag}-original.tar.gz" + elif [[ -f "dotnet-${sdk_version}-SDK.tar.gz" ]]; then + ./rename-tarball "dotnet-${sdk_version}-SDK.tar.gz" "dotnet-${tag}-original.tar.gz" + elif [[ -f "dotnet-${runtime_version}.tar.gz" ]]; then + ./rename-tarball "dotnet-${runtime_version}.tar.gz" "dotnet-${tag}-original.tar.gz" + fi +fi + +if [[ ! -f "dotnet-${tag}.tar.gz" ]]; then + ./build-dotnet-tarball "${tag}" +fi + +set -x + +sed -i -E "s|^%global host_version [[:digit:]]\.[[:digit:]]\.[[:digit:]]+|%global host_version ${host_version}|" "$spec_file" +sed -i -E "s|^%global runtime_version [[:digit:]]\.[[:digit:]]\.[[:digit:]]+|%global runtime_version ${runtime_version}|" "$spec_file" +sed -i -E "s|^%global sdk_version [[:digit:]]\.[[:digit:]]\.[[:digit:]][[:digit:]][[:digit:]]|%global sdk_version ${sdk_version}|" "$spec_file" + +comment="Update to .NET SDK ${sdk_version} and Runtime ${runtime_version}" +for bug_id in "${bug_ids[@]}"; do + comment="$comment +- Resolves: RHBZ#$bug_id" +done + +rpmdev-bumpspec --comment="$comment" "$spec_file" + +# Reset release to 1 in 'Release' tag +sed -i -E 's|^Release: [[:digit:]]+%|Release: 1%|' "$spec_file" +# Reset Release in changelog comment +# See https://stackoverflow.com/questions/18620153/find-matching-text-and-replace-next-line +sed -i -E '/^%changelog$/!b;n;s/-[[:digit:]]+$/-1/' "$spec_file" diff --git a/vstest-use-work-tree-with-git-apply.patch b/vstest-use-work-tree-with-git-apply.patch new file mode 100644 index 0000000..58c139f --- /dev/null +++ b/vstest-use-work-tree-with-git-apply.patch @@ -0,0 +1,33 @@ +From b2c4b2427d8c1a2410c4210789caccf1ec87e64a Mon Sep 17 00:00:00 2001 +From: Omair Majid +Date: Thu, 9 Sep 2021 13:21:51 -0400 +Subject: [PATCH] [ArPow] Use --work-tree with git apply + +This makes things work better in a source-tarball build, where there may +be a .git directory somewhere in our parent directories but it's for a +different repo than vstest. In a situation like that a plain `git apply` +will (silently!) ignore patches because they wont apply to the unrelated +repository. That will (eventually) make the source-build fail. +`--work-tree` makes git directly use the directory that we care about. + +See https://github.com/dotnet/source-build/issues/2445 for more details. +--- + eng/SourceBuild.props | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/eng/SourceBuild.props b/eng/SourceBuild.props +index b365645c..68f82592 100644 +--- a/eng/SourceBuild.props ++++ b/eng/SourceBuild.props +@@ -24,7 +24,7 @@ + + + + +-- +2.31.1 + diff --git a/xliff-tasks-use-work-tree-with-git-apply.patch b/xliff-tasks-use-work-tree-with-git-apply.patch new file mode 100644 index 0000000..810cf67 --- /dev/null +++ b/xliff-tasks-use-work-tree-with-git-apply.patch @@ -0,0 +1,11 @@ +--- a/eng/SourceBuild.props ++++ b/eng/SourceBuild.props +@@ -15,7 +15,7 @@ + + + +