From 734f83f2121c2c4e6d73ec0dabdcac1c8f3c4760 Mon Sep 17 00:00:00 2001 From: Omair Majid Date: Nov 27 2019 18:02:14 +0000 Subject: [PATCH 1/8] Update to .NET Core 3.1 Preview 3 --- diff --git a/coreclr-27048-sysctl-deprecation.patch b/coreclr-27048-sysctl-deprecation.patch index e1fdb5a..2591908 100644 --- a/coreclr-27048-sysctl-deprecation.patch +++ b/coreclr-27048-sysctl-deprecation.patch @@ -26,8 +26,8 @@ index e1c949e38d53..50ccf3a75e16 100644 --- a/src/pal/src/misc/sysinfo.cpp +++ b/src/pal/src/misc/sysinfo.cpp @@ -28,9 +28,12 @@ Revision History: - #include - #include + #define __STDC_FORMAT_MACROS + #include #include -#if HAVE_SYSCTL + diff --git a/dotnet3.1.spec b/dotnet3.1.spec index 372161c..7f0de4b 100644 --- a/dotnet3.1.spec +++ b/dotnet3.1.spec @@ -23,11 +23,11 @@ %endif %global dotnet_ldflags %(echo %{__global_ldflags} | sed -re 's/-specs=[^ ]*//g') -%global host_version 3.1.0-preview1.19506.1 -%global runtime_version 3.1.0-preview1.19506.1 -%global aspnetcore_runtime_version 3.1.0-preview1.19508.20 -%global sdk_version 3.1.100-preview1-014459 -%global templates_version 3.1.0-preview1-014459 +%global host_version 3.1.0-preview3.19553.2 +%global runtime_version 3.1.0-preview3.19553.2 +%global aspnetcore_runtime_version 3.1.0-preview3.19555.2 +%global sdk_version 3.1.100-preview3-014645 +%global templates_version 3.1.0-preview3-014645 %global host_rpm_version 3.1.0 %global aspnetcore_runtime_rpm_version 3.1.0 @@ -52,11 +52,13 @@ Name: dotnet3.1 Version: %{sdk_rpm_version} -Release: 0.1%{?dist} +Release: 0.3.preview3%{?dist} Summary: .NET Core CLI tools and runtime License: MIT and ASL 2.0 and BSD URL: https://github.com/dotnet/ +Packager: Fedora DotNet SIG + # The source is generated on a Fedora box via: # ./build-dotnet-tarball dotnet-v%%{runtime_version} Source0: dotnet-v%{sdk_version}-SDK.tar.gz @@ -435,6 +437,13 @@ echo "Testing build results for debug symbols..." %dir %{_libdir}/dotnet/packs %changelog +* 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 diff --git a/update-release b/update-release index be3a0a0..1f436c7 100755 --- a/update-release +++ b/update-release @@ -26,7 +26,7 @@ while [[ "$#" -gt 0 ]]; do esac done -spec_file=dotnet3.0.spec +spec_file=dotnet3.1.spec runtime_version=${positional_args[0]:-} if [[ -z ${runtime_version} ]]; then @@ -41,12 +41,12 @@ if [[ -z ${sdk_version} ]]; then exit 1 fi -if [[ ! -f "dotnet-v${runtime_version}.tar.gz" ]] && [[ -f "dotnet-${runtime_version}.tar.gz" ]]; then - ./rename-tarball "dotnet-${runtime_version}.tar.gz" "dotnet-v${runtime_version}.tar.gz" +if [[ ! -f "dotnet-v${sdk_version}-SDK.tar.gz" ]] && [[ -f "dotnet-${sdk_version}-SDK.tar.gz" ]]; then + ./rename-tarball "dotnet-${sdk_version}-SDK.tar.gz" "dotnet-v${sdk_version}-SDK.tar.gz" fi -if [[ ! -f "dotnet-v${runtime_version}.tar.gz" ]]; then - ./build-dotnet-tarball "v${runtime_version}" +if [[ ! -f "dotnet-v${sdk_version}-SDK.tar.gz" ]]; then + ./build-dotnet-tarball "v${sdk_version}-SDK" fi set -x From 020c21307dc546a292bf36d76e0173e375bb603f Mon Sep 17 00:00:00 2001 From: Omair Majid Date: Nov 27 2019 18:02:14 +0000 Subject: [PATCH 2/8] Fix apphost permissions --- diff --git a/dotnet3.1.spec b/dotnet3.1.spec index 7f0de4b..2327516 100644 --- a/dotnet3.1.spec +++ b/dotnet3.1.spec @@ -52,7 +52,7 @@ Name: dotnet3.1 Version: %{sdk_rpm_version} -Release: 0.3.preview3%{?dist} +Release: 0.4.preview3%{?dist} Summary: .NET Core CLI tools and runtime License: MIT and ASL 2.0 and BSD URL: https://github.com/dotnet/ @@ -362,6 +362,9 @@ 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 {} \; +chmod ugo=rx %{buildroot}/%{_libdir}/dotnet/sdk/%{sdk_version}/AppHostTemplate/apphost +chmod ugo=rx %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Host.%{runtime_id}/%{runtime_version}/runtimes/%{runtime_id}/native/libnethost.so +chmod ugo=rx %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Host.%{runtime_id}/%{runtime_version}/runtimes/%{runtime_id}/native/apphost install -dm 0755 %{buildroot}%{_sysconfdir}/profile.d/ install dotnet.sh %{buildroot}%{_sysconfdir}/profile.d/ @@ -437,6 +440,9 @@ echo "Testing build results for debug symbols..." %dir %{_libdir}/dotnet/packs %changelog +* 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 diff --git a/update-release b/update-release index 1f436c7..dfb72a9 100755 --- a/update-release +++ b/update-release @@ -51,8 +51,8 @@ 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 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 Core Runtime ${runtime_version} and SDK ${sdk_version}" From e1affb271924ca101a4dc59bd3cb6b0bb6960e13 Mon Sep 17 00:00:00 2001 From: Omair Majid Date: Dec 07 2019 14:52:31 +0000 Subject: [PATCH 3/8] Update to .NET Core Runtime 3.1.0 and SDK 3.1.100 --- diff --git a/build-dotnet-tarball b/build-dotnet-tarball index 59639ee..4af7757 100755 --- a/build-dotnet-tarball +++ b/build-dotnet-tarball @@ -3,10 +3,12 @@ # Usage: # build-dotnet-tarball # -# Creates a source archive from a tag at github.com/dotnet/source-build +# Creates a source archive from a tag (or commit) at github.com/dotnet/source-build -# Source-build 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. +# Source-build 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' @@ -23,6 +25,31 @@ clean_dotnet_cache() { 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 runtime_id { + + declare -A archmap + archmap=( + ["aarch64"]="arm64" + ["amd64"]="x64" + ["armv8l"]="arm" + ["i686"]="x86" + ["i386"]="x86" + ["x86_64"]="x64" + ) + + arch=${archmap["$(uname -m)"]} + + 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}" +} + positional_args=() while [[ "$#" -gt 0 ]]; do arg="${1}" @@ -47,26 +74,44 @@ fi set -x -temp_dir=$(mktemp -d -p "$(pwd)") -dir_name="dotnet-${tag}" -pushd "${temp_dir}" -git clone https://github.com/dotnet/source-build -pushd source-build -git checkout "${tag}" -git submodule update --init --recursive -clean_dotnet_cache -sed -i -e 's|cmakeargs -DCLR_CMAKE_USE_SYSTEM_LIBUNWIND=TRUE||' repos/coreclr.proj -./build-source-tarball.sh "${dir_name}" - -# Remove files with funny licenses and crypto implementations -pushd "${dir_name}" -find src/AspNetCore.*/src -type d -name samples | xargs rm -r -rm -r src/NuGet.Client.*/test/EndToEnd/ProjectTemplates/NetCoreWebApplication1.0.zip -popd +dir_name="dotnet-${tag}-$(runtime_id)" +unmodified_tarball_name="${dir_name}-original" +tarball_name="${dir_name}" -popd -popd +if [ -f "${tarball_name}.tar.gz" ]; then + echo "error: ${tarball_name}.tar.gz 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/source-build + pushd source-build + git checkout "${tag}" + git submodule update --init --recursive + clean_dotnet_cache + sed -i -e 's|cmakeargs -DCLR_CMAKE_USE_SYSTEM_LIBUNWIND=TRUE||' repos/coreclr.proj + ./build-source-tarball.sh "${unmodified_tarball_name}" + popd + popd + + tar czf "${unmodified_tarball_name}.tar.gz" -C "${temp_dir}/source-build" "${unmodified_tarball_name}" -tar czf "${dir_name}.tar.gz" -C "${temp_dir}/source-build" "${dir_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}" +# Remove files with funny licenses, crypto implementations and other +# not-very-useful artifacts to reduce tarball size +rm -r src/AspNetCore.*/src/SignalR/clients/java/signalr/gradle* +find src/AspNetCore.*/src -type d -name samples -print0 | xargs -0 rm -r +rm -r src/NuGet.Client.*/test/EndToEnd/ProjectTemplates/NetCoreWebApplication1.0.zip +find src/coreclr.*/ -depth -name tests -print0 | xargs -0 rm -r +popd -rm -rf "${temp_dir}" +tar czf "${tarball_name}.tar.gz" "${tarball_name}" diff --git a/dotnet3.1.spec b/dotnet3.1.spec index 2327516..b478374 100644 --- a/dotnet3.1.spec +++ b/dotnet3.1.spec @@ -23,16 +23,16 @@ %endif %global dotnet_ldflags %(echo %{__global_ldflags} | sed -re 's/-specs=[^ ]*//g') -%global host_version 3.1.0-preview3.19553.2 -%global runtime_version 3.1.0-preview3.19553.2 -%global aspnetcore_runtime_version 3.1.0-preview3.19555.2 -%global sdk_version 3.1.100-preview3-014645 -%global templates_version 3.1.0-preview3-014645 +%global host_version 3.1.0 +%global runtime_version 3.1.0 +%global aspnetcore_runtime_version %{runtime_version} +%global sdk_version 3.1.100 +%global templates_version %{runtime_version} -%global host_rpm_version 3.1.0 -%global aspnetcore_runtime_rpm_version 3.1.0 -%global runtime_rpm_version 3.1.0 -%global sdk_rpm_version 3.1.100 +%global host_rpm_version %{host_version} +%global aspnetcore_runtime_rpm_version %{aspnetcore_runtime_version} +%global runtime_rpm_version %{runtime_version} +%global sdk_rpm_version %{sdk_version} %if 0%{?fedora} || 0%{?rhel} < 8 %global use_bundled_libunwind 0 @@ -40,19 +40,26 @@ %global use_bundled_libunwind 1 %endif +%ifarch x86_64 +%global runtime_arch x64 +%endif +%ifarch aarch64 +%global runtime_arch arm64 +%endif + %if 0%{?fedora} -%global runtime_id fedora.%{fedora}-x64 +%global runtime_id fedora.%{fedora}-%{runtime_arch} %else %if 0%{?centos} -%global runtime_id centos.%{centos}-x64 +%global runtime_id centos.%{centos}-%{runtime_arch} %else -%global runtime_id rhel.%{rhel}-x64 +%global runtime_id rhel.%{rhel}-%{runtime_arch} %endif %endif Name: dotnet3.1 Version: %{sdk_rpm_version} -Release: 0.4.preview3%{?dist} +Release: 1%{?dist} Summary: .NET Core CLI tools and runtime License: MIT and ASL 2.0 and BSD URL: https://github.com/dotnet/ @@ -61,7 +68,7 @@ Packager: Fedora DotNet SIG # The source is generated on a Fedora box via: # ./build-dotnet-tarball dotnet-v%%{runtime_version} -Source0: dotnet-v%{sdk_version}-SDK.tar.gz +Source0: dotnet-v%{sdk_version}-SDK-fedora.31-%{runtime_arch}.tar.gz Source1: check-debug-symbols.py Source2: dotnet.sh.in @@ -286,7 +293,7 @@ applications using the .NET Core SDK. %prep -%setup -q -n dotnet-v%{sdk_version}-SDK +%setup -q -n dotnet-v%{sdk_version}-SDK-fedora.31-%{runtime_arch} # Fix bad hardcoded path in build sed -i 's|/usr/share/dotnet|%{_libdir}/dotnet|' src/core-setup.*/src/corehost/common/pal.unix.cpp @@ -349,11 +356,11 @@ sed -e 's|[@]LIBDIR[@]|%{_libdir}|g' %{SOURCE2} > dotnet.sh %install install -dm 0755 %{buildroot}%{_libdir}/dotnet -ls bin/x64/Release -tar xf bin/x64/Release/dotnet-sdk-%{sdk_version}-%{runtime_id}.tar.gz -C %{buildroot}%{_libdir}/dotnet/ +ls bin/%{runtime_arch}/Release +tar xf bin/%{runtime_arch}/Release/dotnet-sdk-%{sdk_version}-%{runtime_id}.tar.gz -C %{buildroot}%{_libdir}/dotnet/ # Install managed symbols -tar xf bin/x64/Release/runtime/dotnet-runtime-symbols-%{runtime_version}-%{runtime_id}.tar.gz \ +tar xf bin/%{runtime_arch}/Release/runtime/dotnet-runtime-symbols-%{runtime_version}-%{runtime_id}.tar.gz \ -C %{buildroot}/%{_libdir}/dotnet/shared/Microsoft.NETCore.App/%{runtime_version}/ # Fix executable permissions on files @@ -440,6 +447,9 @@ echo "Testing build results for debug symbols..." %dir %{_libdir}/dotnet/packs %changelog +* 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 From bedf9f6f9c188944636b4a3c327e78d1a1f7bf48 Mon Sep 17 00:00:00 2001 From: Omair Majid Date: Jan 27 2020 15:30:53 +0000 Subject: [PATCH 4/8] Update to .NET Core SDK 3.1.101 and Runtime 3.1.1 Enable bootstrapping --- diff --git a/dotnet3.1.spec b/dotnet3.1.spec index b478374..7157050 100644 --- a/dotnet3.1.spec +++ b/dotnet3.1.spec @@ -1,3 +1,5 @@ +%bcond_without bootstrap + # Avoid provides/requires from private libraries %global privlibs libhostfxr %global privlibs %{privlibs}|libclrjit @@ -23,10 +25,10 @@ %endif %global dotnet_ldflags %(echo %{__global_ldflags} | sed -re 's/-specs=[^ ]*//g') -%global host_version 3.1.0 -%global runtime_version 3.1.0 +%global host_version 3.1.1 +%global runtime_version 3.1.1 %global aspnetcore_runtime_version %{runtime_version} -%global sdk_version 3.1.100 +%global sdk_version 3.1.101 %global templates_version %{runtime_version} %global host_rpm_version %{host_version} @@ -68,7 +70,7 @@ Packager: Fedora DotNet SIG # The source is generated on a Fedora box via: # ./build-dotnet-tarball dotnet-v%%{runtime_version} -Source0: dotnet-v%{sdk_version}-SDK-fedora.31-%{runtime_arch}.tar.gz +Source0: dotnet-v%{sdk_version}-SDK.tar.gz Source1: check-debug-symbols.py Source2: dotnet.sh.in @@ -92,6 +94,10 @@ ExclusiveArch: x86_64 BuildRequires: clang BuildRequires: cmake BuildRequires: coreutils +%if %{without bootstrap} +BuildRequires: dotnet-sdk-3.1 +BuildRequires: dotnet-sdk-3.1-source-built-artifacts +%endif BuildRequires: git %if 0%{?fedora} || 0%{?rhel} > 7 BuildRequires: glibc-langpack-en @@ -106,6 +112,7 @@ BuildRequires: libunwind-devel BuildRequires: lldb-devel BuildRequires: llvm BuildRequires: lttng-ust-devel +BuildRequires: make BuildRequires: openssl-devel BuildRequires: python3 BuildRequires: tar @@ -292,11 +299,40 @@ applications using the .NET Core SDK. %dotnet_targeting_pack netstandard-targeting-pack-2.1 %{sdk_rpm_version} NETStandard.Library 2.1 NETStandard.Library.Ref +%package -n dotnet-sdk-3.1-source-built-artifacts + +Version: %{sdk_rpm_version} +Summary: Internal package for building .NET Core 3.1 Software Development Kit + +%description -n dotnet-sdk-3.1-source-built-artifacts +The .NET Core source-built archive is a collection of packages needed +to build the .NET Core SDK itself. + +These are not meant for general use. + + %prep -%setup -q -n dotnet-v%{sdk_version}-SDK-fedora.31-%{runtime_arch} +%setup -q -n dotnet-v%{sdk_version}-SDK + +%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 +rm -r .dotnet/ +rm -r packages/source-built +%endif + +%if %{without bootstrap} +sed -i -e 's|3.1.100-preview1-014459|3.1.101|' global.json +mkdir -p packages/archive +ln -s %{_libdir}/dotnet/source-built-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/core-setup.*/src/corehost/common/pal.unix.cpp +sed -i 's|/usr/share/dotnet|%{_libdir}/dotnet|' src/dotnet-core-setup.*/src/corehost/common/pal.unix.cpp # Disable warnings sed -i 's|skiptests|skiptests ignorewarnings|' repos/coreclr.proj @@ -315,12 +351,12 @@ pushd src/coreclr.* %patch203 -p1 popd -pushd src/core-setup.* +pushd src/dotnet-core-setup.* %patch300 -p1 %patch301 -p1 popd -pushd src/cli.* +pushd src/dotnet-cli.* %patch500 -p1 popd @@ -340,6 +376,10 @@ find -iname 'nuget.config' -exec echo {}: \; -exec cat {} \; -exec echo \; %build cat /etc/os-release +%if %{without bootstrap} +cp -a %{_libdir}/dotnet .dotnet +%endif + export CFLAGS="%{dotnet_cflags}" export CXXFLAGS="%{dotnet_cflags}" export LDFLAGS="%{dotnet_ldflags}" @@ -369,16 +409,19 @@ 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 {} \; -chmod ugo=rx %{buildroot}/%{_libdir}/dotnet/sdk/%{sdk_version}/AppHostTemplate/apphost -chmod ugo=rx %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Host.%{runtime_id}/%{runtime_version}/runtimes/%{runtime_id}/native/libnethost.so -chmod ugo=rx %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Host.%{runtime_id}/%{runtime_version}/runtimes/%{runtime_id}/native/apphost +chmod 0755 %{buildroot}/%{_libdir}/dotnet/sdk/%{sdk_version}/AppHostTemplate/apphost +chmod 0755 %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Host.%{runtime_id}/%{runtime_version}/runtimes/%{runtime_id}/native/libnethost.so +chmod 0755 %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Host.%{runtime_id}/%{runtime_version}/runtimes/%{runtime_id}/native/apphost +chmod 0644 %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Host.%{runtime_id}/%{runtime_version}/runtimes/%{runtime_id}/native/nethost.h +chmod 0644 %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.AspNetCore.App.Ref/3.1.0/obj/Microsoft.AspNetCore.App.Ref.csproj.nuget.cache +chmod 0644 %{buildroot}/%{_libdir}/dotnet/packs/Microsoft.AspNetCore.App.Ref/3.1.0/Microsoft.AspNetCore.App.Ref/3.1.0/Debug/netstandard2.0/Microsoft.AspNetCore.App.Ref.assets.cache 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/cli.*/scripts/register-completions.bash %{buildroot}/%{_datadir}/bash-completion/completions/dotnet +install src/dotnet-cli.*/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 @@ -394,6 +437,9 @@ echo "%{_libdir}/dotnet" >> install_location install -dm 0755 %{buildroot}%{_sysconfdir}/dotnet install install_location %{buildroot}%{_sysconfdir}/dotnet/ +install -dm 0755 %{buildroot}%{_libdir}/dotnet/source-built-artifacts +install bin/%{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. @@ -446,7 +492,15 @@ echo "Testing build results for debug symbols..." %{_libdir}/dotnet/sdk/%{sdk_version} %dir %{_libdir}/dotnet/packs +%files -n dotnet-sdk-3.1-source-built-artifacts +%dir %{_libdir}/dotnet +%{_libdir}/dotnet/source-built-artifacts + + %changelog +* 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 diff --git a/update-release b/update-release index dfb72a9..09eb509 100755 --- a/update-release +++ b/update-release @@ -41,10 +41,6 @@ if [[ -z ${sdk_version} ]]; then exit 1 fi -if [[ ! -f "dotnet-v${sdk_version}-SDK.tar.gz" ]] && [[ -f "dotnet-${sdk_version}-SDK.tar.gz" ]]; then - ./rename-tarball "dotnet-${sdk_version}-SDK.tar.gz" "dotnet-v${sdk_version}-SDK.tar.gz" -fi - if [[ ! -f "dotnet-v${sdk_version}-SDK.tar.gz" ]]; then ./build-dotnet-tarball "v${sdk_version}-SDK" fi From 8e3dd6920c8c1c91e3661e5312feb9532afe1310 Mon Sep 17 00:00:00 2001 From: Omair Majid Date: Jan 28 2020 20:33:50 +0000 Subject: [PATCH 5/8] Improve package - Remove non-upstreamed cgroupv2 patches - Add bundled(jquery) - Remove 'Packager' tag --- diff --git a/coreclr-cgroupv2-02.patch b/coreclr-cgroupv2-02.patch deleted file mode 100644 index 3097d86..0000000 --- a/coreclr-cgroupv2-02.patch +++ /dev/null @@ -1,54 +0,0 @@ -diff --git a/src/gc/unix/cgroup.cpp b/src/gc/unix/cgroup.cpp -index e5760bebd8..d9a4e2dedd 100644 ---- a/src/gc/unix/cgroup.cpp -+++ b/src/gc/unix/cgroup.cpp -@@ -31,6 +31,9 @@ Abstract: - #ifndef SIZE_T_MAX - #define SIZE_T_MAX (~(size_t)0) - #endif -+#ifndef _countof -+#define _countof(_array) (sizeof(_array) / sizeof(_array[0])) -+#endif // !_countof - - #define PROC_MOUNTINFO_FILENAME "/proc/self/mountinfo" - #define PROC_CGROUP_FILENAME "/proc/self/cgroup" -@@ -74,7 +77,7 @@ public: - if (s_memory_cgroup_path == nullptr) - return result; - -- mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files)); -+ mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, _countof(files)); - if (mem_limit_filename == nullptr) - return result; - -@@ -97,7 +100,7 @@ public: - if (s_memory_cgroup_path == nullptr) - return result; - -- mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files)); -+ mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, _countof(files)); - if (mem_usage_filename == nullptr) - return result; - -diff --git a/src/pal/src/misc/cgroup.cpp b/src/pal/src/misc/cgroup.cpp -index e32b74aabe..0b922123c8 100644 ---- a/src/pal/src/misc/cgroup.cpp -+++ b/src/pal/src/misc/cgroup.cpp -@@ -62,7 +61,7 @@ public: - if (s_memory_cgroup_path == nullptr) - return result; - -- mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files)); -+ mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, _countof(files)); - if (mem_limit_filename == nullptr) - return result; - -@@ -85,7 +84,7 @@ public: - if (s_memory_cgroup_path == nullptr) - return result; - -- mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files)); -+ mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, _countof(files)); - if (mem_usage_filename == nullptr) - return result; - diff --git a/coreclr-cgroupv2.patch b/coreclr-cgroupv2.patch deleted file mode 100644 index 2233808..0000000 --- a/coreclr-cgroupv2.patch +++ /dev/null @@ -1,876 +0,0 @@ -From 7b33e078b41819284175533215047359bb952b5d Mon Sep 17 00:00:00 2001 -From: Omair Majid -Date: Fri, 26 Jul 2019 17:12:48 -0400 -Subject: [PATCH] Add cgroup v2 support to CoreCLR - -Upstream cgroup v2 documentation is available at: -https://www.kernel.org/doc/Documentation/cgroup-v2.txt - -Some notable differences between cgroup v1 and v2, from a CoreCLR point -of view, include: - -- cgroup v2 has a single hierarchy, so we just look for a single "cgroup2" - entry in /proc/self/mountinfo (without looking for a subsystem match). - -- Since cgroup v2 has a single hierarchy, /proc/self/cgroup generally - has a single line "0::/path". There's no need to match subsystems or - hierarchy ids here. - -- "memory.limit_in_bytes" is now "memory.max". It can contain the - literal "max" to indicate no limit. - -- "memory.usage_in_bytes" is now "memory.current" - -- "cpu.cfs_quota_us" and "cpu.cfs_period_us" have been combined into a - single "cpu.max" file with the format "$MAX $PERIOD". The max value - can be a literal "max" to indicate a limit is not active. ---- - src/gc/unix/cgroup.cpp | 292 +++++++++++++++++++++++++++++------- - src/pal/src/misc/cgroup.cpp | 287 ++++++++++++++++++++++++++++------- - 2 files changed, 471 insertions(+), 108 deletions(-) - -diff --git a/src/gc/unix/cgroup.cpp b/src/gc/unix/cgroup.cpp -index 1e60898948..e5760bebd8 100644 ---- a/src/gc/unix/cgroup.cpp -+++ b/src/gc/unix/cgroup.cpp -@@ -35,20 +35,24 @@ Abstract: - #define PROC_MOUNTINFO_FILENAME "/proc/self/mountinfo" - #define PROC_CGROUP_FILENAME "/proc/self/cgroup" - #define PROC_STATM_FILENAME "/proc/self/statm" --#define MEM_LIMIT_FILENAME "/memory.limit_in_bytes" --#define MEM_USAGE_FILENAME "/memory.usage_in_bytes" --#define CFS_QUOTA_FILENAME "/cpu.cfs_quota_us" --#define CFS_PERIOD_FILENAME "/cpu.cfs_period_us" -+#define CGROUP1_MEMORY_LIMIT_FILENAME "/memory.limit_in_bytes" -+#define CGROUP2_MEMORY_LIMIT_FILENAME "/memory.max" -+#define CGROUP1_MEMORY_USAGE_FILENAME "/memory.usage_in_bytes" -+#define CGROUP2_MEMORY_USAGE_FILENAME "/memory.current" -+#define CGROUP1_CFS_QUOTA_FILENAME "/cpu.cfs_quota_us" -+#define CGROUP1_CFS_PERIOD_FILENAME "/cpu.cfs_period_us" -+#define CGROUP2_CPU_MAX_FILENAME "/cpu.max" -+ - - class CGroup - { -- static char* s_memory_cgroup_path; -- static char* s_cpu_cgroup_path; -+ static char *s_memory_cgroup_path; -+ static char *s_cpu_cgroup_path; - public: - static void Initialize() - { -- s_memory_cgroup_path = FindCgroupPath(&IsMemorySubsystem); -- s_cpu_cgroup_path = FindCgroupPath(&IsCpuSubsystem); -+ s_memory_cgroup_path = FindCGroupPath(&IsCGroup1MemorySubsystem); -+ s_cpu_cgroup_path = FindCGroupPath(&IsCGroup1CpuSubsystem); - } - - static void Cleanup() -@@ -59,20 +63,21 @@ public: - - static bool GetPhysicalMemoryLimit(size_t *val) - { -+ const char *files[] = { -+ CGROUP1_MEMORY_LIMIT_FILENAME, -+ CGROUP2_MEMORY_LIMIT_FILENAME -+ }; -+ - char *mem_limit_filename = nullptr; - bool result = false; - - if (s_memory_cgroup_path == nullptr) - return result; - -- size_t len = strlen(s_memory_cgroup_path); -- len += strlen(MEM_LIMIT_FILENAME); -- mem_limit_filename = (char*)malloc(len+1); -+ mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files)); - if (mem_limit_filename == nullptr) - return result; - -- strcpy(mem_limit_filename, s_memory_cgroup_path); -- strcat(mem_limit_filename, MEM_LIMIT_FILENAME); - result = ReadMemoryValueFromFile(mem_limit_filename, val); - free(mem_limit_filename); - return result; -@@ -80,6 +85,11 @@ public: - - static bool GetPhysicalMemoryUsage(size_t *val) - { -+ const char *files[] = { -+ CGROUP1_MEMORY_USAGE_FILENAME, -+ CGROUP2_MEMORY_USAGE_FILENAME -+ }; -+ - char *mem_usage_filename = nullptr; - bool result = false; - -@@ -87,14 +97,10 @@ public: - if (s_memory_cgroup_path == nullptr) - return result; - -- size_t len = strlen(s_memory_cgroup_path); -- len += strlen(MEM_USAGE_FILENAME); -- mem_usage_filename = (char*)malloc(len+1); -+ mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files)); - if (mem_usage_filename == nullptr) - return result; - -- strcpy(mem_usage_filename, s_memory_cgroup_path); -- strcat(mem_usage_filename, MEM_USAGE_FILENAME); - result = ReadMemoryValueFromFile(mem_usage_filename, val); - free(mem_usage_filename); - return result; -@@ -112,16 +118,149 @@ public: - } - - static bool GetCpuLimit(uint32_t *val) -+ { -+ if (GetCGroup1CpuLimit(val)) -+ { -+ return true; -+ } -+ -+ if (GetCGroup2CpuLimit(val)) -+ { -+ return true; -+ } -+ -+ return false; -+ } -+ -+private: -+ static bool IsCGroup1MemorySubsystem(const char *strTok){ -+ return strcmp("memory", strTok) == 0; -+ } -+ -+ static bool IsCGroup1CpuSubsystem(const char *strTok){ -+ return strcmp("cpu", strTok) == 0; -+ } -+ -+ static bool GetCGroup2CpuLimit(uint32_t *val) -+ { -+ char *line = nullptr; -+ char *filename = nullptr; -+ FILE *file = nullptr; -+ char *max_quota_string = nullptr; -+ char *period_string = nullptr; -+ -+ size_t lineLen = 0; -+ int sscanRet = 0; -+ long long max_quota = 0; -+ long long period = 0; -+ double cpu_count = 0; -+ -+ bool result = false; -+ -+ if (s_cpu_cgroup_path == nullptr) -+ { -+ return false; -+ } -+ -+ size_t filename_len = strlen(s_cpu_cgroup_path) + strlen(CGROUP2_CPU_MAX_FILENAME); -+ filename = (char*)malloc(filename_len + 1); -+ if (filename == nullptr) -+ { -+ goto done; -+ } -+ -+ strcpy(filename, s_cpu_cgroup_path); -+ strcat(filename, CGROUP2_CPU_MAX_FILENAME); -+ -+ file = fopen(filename, "r"); -+ if (file == nullptr) -+ { -+ goto done; -+ } -+ -+ if (getline(&line, &lineLen, file) == -1) -+ { -+ goto done; -+ } -+ -+ // The expected format is: -+ // $MAX $PERIOD -+ // Where "$MAX" may be the string literal "max" -+ -+ max_quota_string = (char*) malloc(lineLen + 1); -+ if (max_quota_string == nullptr) -+ { -+ goto done; -+ } -+ period_string = (char*) malloc(lineLen + 1); -+ if (period_string == nullptr) -+ { -+ goto done; -+ } -+ -+ sscanRet = sscanf(line, "%s %s", max_quota_string, period_string); -+ if (sscanRet != 2) -+ { -+ assert(!"Unable to parse " CGROUP2_CPU_MAX_FILENAME " file contents with sscanf."); -+ goto done; -+ } -+ -+ // "max" means no cpu limit -+ if (strncmp("max", max_quota_string, lineLen + 1) == 0) -+ { -+ goto done; -+ } -+ -+ errno = 0; -+ max_quota = atoll(max_quota_string); -+ if (errno != 0) -+ { -+ goto done; -+ } -+ -+ errno = 0; -+ period = atoll(period_string); -+ if (errno != 0) -+ { -+ goto done; -+ } -+ -+ // Cannot have less than 1 CPU -+ if (max_quota <= period) -+ { -+ result = true; -+ *val = 1; -+ goto done; -+ } -+ -+ // Calculate cpu count based on quota and round it up -+ cpu_count = (double) max_quota / period + 0.999999999; -+ *val = (cpu_count < UINT32_MAX) ? (uint32_t)cpu_count : UINT32_MAX; -+ -+ result = true; -+ -+ done: -+ if (file) -+ fclose(file); -+ free(filename); -+ free(line); -+ free(max_quota_string); -+ free(period_string); -+ -+ return result; -+ } -+ -+ static bool GetCGroup1CpuLimit(uint32_t *val) - { - long long quota; - long long period; - double cpu_count; - -- quota = ReadCpuCGroupValue(CFS_QUOTA_FILENAME); -+ quota = ReadCpuCGroupValue(CGROUP1_CFS_QUOTA_FILENAME); - if (quota <= 0) - return false; - -- period = ReadCpuCGroupValue(CFS_PERIOD_FILENAME); -+ period = ReadCpuCGroupValue(CGROUP1_CFS_PERIOD_FILENAME); - if (period <= 0) - return false; - -@@ -138,27 +277,19 @@ public: - - return true; - } -- --private: -- static bool IsMemorySubsystem(const char *strTok){ -- return strcmp("memory", strTok) == 0; -- } - -- static bool IsCpuSubsystem(const char *strTok){ -- return strcmp("cpu", strTok) == 0; -- } -- -- static char* FindCgroupPath(bool (*is_subsystem)(const char *)){ -+ static char* FindCGroupPath(bool (*is_subsystem)(const char *)){ - char *cgroup_path = nullptr; - char *hierarchy_mount = nullptr; - char *hierarchy_root = nullptr; - char *cgroup_path_relative_to_mount = nullptr; -+ bool is_cgroupv2 = false; - -- FindHierarchyMount(is_subsystem, &hierarchy_mount, &hierarchy_root); -+ FindHierarchyMount(is_subsystem, &is_cgroupv2, &hierarchy_mount, &hierarchy_root); - if (hierarchy_mount == nullptr || hierarchy_root == nullptr) - goto done; - -- cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(is_subsystem); -+ cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(is_cgroupv2, is_subsystem); - if (cgroup_path_relative_to_mount == nullptr) - goto done; - -@@ -179,7 +310,7 @@ private: - return cgroup_path; - } - -- static void FindHierarchyMount(bool (*is_subsystem)(const char *), char** pmountpath, char** pmountroot) -+ static void FindHierarchyMount(bool (*is_subsystem)(const char *), bool* is_cgroupv2, char** pmountpath, char** pmountroot) - { - char *line = nullptr; - size_t lineLen = 0, maxLineLen = 0; -@@ -219,14 +350,18 @@ private: - assert(!"Failed to parse mount info file contents with sscanf."); - goto done; - } -- -+ - if (strncmp(filesystemType, "cgroup", 6) == 0) - { -+ if (strncmp(filesystemType, "cgroup2", 8) == 0) -+ { -+ *is_cgroupv2 = true; -+ } - char* context = nullptr; - char* strTok = strtok_r(options, ",", &context); - while (strTok != nullptr) - { -- if (is_subsystem(strTok)) -+ if (*is_cgroupv2 || is_subsystem(strTok)) - { - mountpath = (char*)malloc(lineLen+1); - if (mountpath == nullptr) -@@ -234,7 +369,7 @@ private: - mountroot = (char*)malloc(lineLen+1); - if (mountroot == nullptr) - goto done; -- -+ - sscanfRet = sscanf(line, - "%*s %*s %*s %s %s ", - mountroot, -@@ -261,8 +396,8 @@ private: - if (mountinfofile) - fclose(mountinfofile); - } -- -- static char* FindCGroupPathForSubsystem(bool (*is_subsystem)(const char *)) -+ -+ static char* FindCGroupPathForSubsystem(bool is_cgroupv2, bool (*is_subsystem)(const char *)) - { - char *line = nullptr; - size_t lineLen = 0; -@@ -274,7 +409,7 @@ private: - FILE *cgroupfile = fopen(PROC_CGROUP_FILENAME, "r"); - if (cgroupfile == nullptr) - goto done; -- -+ - while (!result && getline(&line, &lineLen, cgroupfile) != -1) - { - if (subsystem_list == nullptr || lineLen > maxLineLen) -@@ -289,28 +424,43 @@ private: - goto done; - maxLineLen = lineLen; - } -- -- // See man page of proc to get format for /proc/self/cgroup file -- int sscanfRet = sscanf(line, -- "%*[^:]:%[^:]:%s", -- subsystem_list, -- cgroup_path); -- if (sscanfRet != 2) -+ -+ if (is_cgroupv2) - { -- assert(!"Failed to parse cgroup info file contents with sscanf."); -- goto done; -+ // See https://www.kernel.org/doc/Documentation/cgroup-v2.txt -+ // Look for "0::/some/path" -+ int sscanfRet = sscanf(line, -+ "0::%s", -+ cgroup_path); -+ if (sscanfRet == 1) -+ { -+ result = true; -+ } - } -- -- char* context = nullptr; -- char* strTok = strtok_r(subsystem_list, ",", &context); -- while (strTok != nullptr) -+ else - { -- if (is_subsystem(strTok)) -+ // See man page of proc to get format for /proc/self/cgroup file -+ int sscanfRet = sscanf(line, -+ "%*[^:]:%[^:]:%s", -+ subsystem_list, -+ cgroup_path); -+ if (sscanfRet != 2) - { -- result = true; -- break; -+ assert(!"Failed to parse cgroup info file contents with sscanf."); -+ goto done; -+ } -+ -+ char* context = nullptr; -+ char* strTok = strtok_r(subsystem_list, ",", &context); -+ while (strTok != nullptr) -+ { -+ if (is_subsystem(strTok)) -+ { -+ result = true; -+ break; -+ } -+ strTok = strtok_r(nullptr, ",", &context); - } -- strTok = strtok_r(nullptr, ",", &context); - } - } - done: -@@ -325,6 +475,36 @@ private: - fclose(cgroupfile); - return cgroup_path; - } -+ -+ static char* SearchForFile(char* search_root, const char* possible_files[], size_t possible_files_len) -+ { -+ if (search_root == nullptr) -+ { -+ return nullptr; -+ } -+ -+ for (size_t i = 0; i < possible_files_len; i++) -+ { -+ const char* possible_file = possible_files[i]; -+ size_t len = strlen(search_root); -+ len += strlen(possible_file); -+ char* full_filename = (char*)malloc(len+1); -+ if (full_filename == nullptr) -+ { -+ return nullptr; -+ } -+ strcpy(full_filename, search_root); -+ strcat(full_filename, possible_file); -+ if (access(full_filename, R_OK) != -1) -+ { -+ return full_filename; -+ } -+ -+ free(full_filename); -+ } -+ -+ return nullptr; -+ } - - static bool ReadMemoryValueFromFile(const char* filename, size_t* val) - { -diff --git a/src/pal/src/misc/cgroup.cpp b/src/pal/src/misc/cgroup.cpp -index 3fc43a7b05..e32b74aabe 100644 ---- a/src/pal/src/misc/cgroup.cpp -+++ b/src/pal/src/misc/cgroup.cpp -@@ -23,10 +23,15 @@ - #define PROC_MOUNTINFO_FILENAME "/proc/self/mountinfo" - #define PROC_CGROUP_FILENAME "/proc/self/cgroup" - #define PROC_STATM_FILENAME "/proc/self/statm" --#define MEM_LIMIT_FILENAME "/memory.limit_in_bytes" --#define MEM_USAGE_FILENAME "/memory.usage_in_bytes" --#define CFS_QUOTA_FILENAME "/cpu.cfs_quota_us" --#define CFS_PERIOD_FILENAME "/cpu.cfs_period_us" -+#define CGROUP1_MEMORY_LIMIT_FILENAME "/memory.limit_in_bytes" -+#define CGROUP2_MEMORY_LIMIT_FILENAME "/memory.max" -+#define CGROUP1_MEMORY_USAGE_FILENAME "/memory.usage_in_bytes" -+#define CGROUP2_MEMORY_USAGE_FILENAME "/memory.current" -+#define CGROUP1_CFS_QUOTA_FILENAME "/cpu.cfs_quota_us" -+#define CGROUP1_CFS_PERIOD_FILENAME "/cpu.cfs_period_us" -+#define CGROUP2_CPU_MAX_FILENAME "/cpu.max" -+ -+ - class CGroup - { - static char *s_memory_cgroup_path; -@@ -34,8 +39,8 @@ - public: - static void Initialize() - { -- s_memory_cgroup_path = FindCgroupPath(&IsMemorySubsystem); -- s_cpu_cgroup_path = FindCgroupPath(&IsCpuSubsystem); -+ s_memory_cgroup_path = FindCGroupPath(&IsCGroup1MemorySubsystem); -+ s_cpu_cgroup_path = FindCGroupPath(&IsCGroup1CpuSubsystem); - } - - static void Cleanup() -@@ -43,23 +48,24 @@ - PAL_free(s_memory_cgroup_path); - PAL_free(s_cpu_cgroup_path); - } -- -+ - static bool GetPhysicalMemoryLimit(size_t *val) - { -+ const char *files[] = { -+ CGROUP1_MEMORY_LIMIT_FILENAME, -+ CGROUP2_MEMORY_LIMIT_FILENAME -+ }; -+ - char *mem_limit_filename = nullptr; - bool result = false; - - if (s_memory_cgroup_path == nullptr) - return result; - -- size_t len = strlen(s_memory_cgroup_path); -- len += strlen(MEM_LIMIT_FILENAME); -- mem_limit_filename = (char*)PAL_malloc(len+1); -+ mem_limit_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files)); - if (mem_limit_filename == nullptr) - return result; - -- strcpy_s(mem_limit_filename, len+1, s_memory_cgroup_path); -- strcat_s(mem_limit_filename, len+1, MEM_LIMIT_FILENAME); - result = ReadMemoryValueFromFile(mem_limit_filename, val); - PAL_free(mem_limit_filename); - return result; -@@ -67,36 +73,172 @@ - - static bool GetPhysicalMemoryUsage(size_t *val) - { -+ const char *files[] = { -+ CGROUP1_MEMORY_USAGE_FILENAME, -+ CGROUP2_MEMORY_USAGE_FILENAME -+ }; -+ - char *mem_usage_filename = nullptr; - bool result = false; - - if (s_memory_cgroup_path == nullptr) - return result; - -- size_t len = strlen(s_memory_cgroup_path); -- len += strlen(MEM_USAGE_FILENAME); -- mem_usage_filename = (char*)malloc(len+1); -+ mem_usage_filename = SearchForFile(s_memory_cgroup_path, files, sizeof(files)); - if (mem_usage_filename == nullptr) - return result; - -- strcpy(mem_usage_filename, s_memory_cgroup_path); -- strcat(mem_usage_filename, MEM_USAGE_FILENAME); - result = ReadMemoryValueFromFile(mem_usage_filename, val); -- free(mem_usage_filename); -+ PAL_free(mem_usage_filename); - return result; - } - - static bool GetCpuLimit(UINT *val) - { -+ if (GetCGroup1CpuLimit(val)) -+ { -+ return true; -+ } -+ -+ if (GetCGroup2CpuLimit(val)) -+ { -+ return true; -+ } -+ -+ return false; -+ } -+ -+private: -+ static bool IsCGroup1MemorySubsystem(const char *strTok){ -+ return strcmp("memory", strTok) == 0; -+ } -+ -+ static bool IsCGroup1CpuSubsystem(const char *strTok){ -+ return strcmp("cpu", strTok) == 0; -+ } -+ -+ static bool GetCGroup2CpuLimit(UINT *val) -+ { -+ char *line = nullptr; -+ char *filename = nullptr; -+ FILE *file = nullptr; -+ char *max_quota_string = nullptr; -+ char *period_string = nullptr; -+ -+ size_t lineLen = 0; -+ int sscanRet = 0; -+ long long max_quota = 0; -+ long long period = 0; -+ double cpu_count = 0; -+ -+ bool result = false; -+ -+ if (s_cpu_cgroup_path == nullptr) -+ { -+ return false; -+ } -+ -+ size_t filename_len = strlen(s_cpu_cgroup_path) + strlen(CGROUP2_CPU_MAX_FILENAME); -+ filename = (char*)PAL_malloc(filename_len + 1); -+ if (filename == nullptr) -+ { -+ goto done; -+ } -+ -+ strcpy_s(filename, filename_len + 1, s_cpu_cgroup_path); -+ strcat_s(filename, filename_len + 1, CGROUP2_CPU_MAX_FILENAME); -+ -+ file = fopen(filename, "r"); -+ if (file == nullptr) -+ { -+ goto done; -+ } -+ -+ if (getline(&line, &lineLen, file) == -1) -+ { -+ goto done; -+ } -+ -+ // The expected format is: -+ // $MAX $PERIOD -+ // Where "$MAX" may be the string literal "max" -+ -+ max_quota_string = (char*)PAL_malloc(lineLen + 1); -+ if (max_quota_string == nullptr) -+ { -+ goto done; -+ } -+ period_string = (char*)PAL_malloc(lineLen + 1); -+ if (period_string == nullptr) -+ { -+ goto done; -+ } -+ -+ sscanRet = sscanf_s(line, "%s %s", -+ max_quota_string, lineLen + 1, -+ period_string, lineLen + 1); -+ if (sscanRet != 2) -+ { -+ _ASSERTE(!"Unable to parse " CGROUP2_CPU_MAX_FILENAME " file contents with sscanf_s."); -+ goto done; -+ } -+ -+ // "max" means no cpu limit -+ if (strncmp("max", max_quota_string, lineLen + 1) == 0) -+ { -+ goto done; -+ } -+ -+ errno = 0; -+ max_quota = atoll(max_quota_string); -+ if (errno != 0) -+ { -+ goto done; -+ } -+ -+ errno = 0; -+ period = atoll(period_string); -+ if (errno != 0) -+ { -+ goto done; -+ } -+ -+ // Cannot have less than 1 CPU -+ if (max_quota <= period) -+ { -+ result = true; -+ *val = 1; -+ goto done; -+ } -+ -+ // Calculate cpu count based on quota and round it up -+ cpu_count = (double) max_quota / period + 0.999999999; -+ *val = (cpu_count < UINT_MAX) ? (UINT)cpu_count : UINT_MAX; -+ -+ result = true; -+ -+ done: -+ if (file) -+ fclose(file); -+ PAL_free(filename); -+ PAL_free(line); -+ PAL_free(max_quota_string); -+ PAL_free(period_string); -+ -+ return result; -+ } -+ -+ static bool GetCGroup1CpuLimit(UINT *val) -+ { - long long quota; - long long period; - double cpu_count; - -- quota = ReadCpuCGroupValue(CFS_QUOTA_FILENAME); -+ quota = ReadCpuCGroupValue(CGROUP1_CFS_QUOTA_FILENAME); - if (quota <= 0) - return false; - -- period = ReadCpuCGroupValue(CFS_PERIOD_FILENAME); -+ period = ReadCpuCGroupValue(CGROUP1_CFS_PERIOD_FILENAME); - if (period <= 0) - return false; - -@@ -114,27 +256,19 @@ - return true; - } - --private: -- static bool IsMemorySubsystem(const char *strTok){ -- return strcmp("memory", strTok) == 0; -- } -- -- static bool IsCpuSubsystem(const char *strTok){ -- return strcmp("cpu", strTok) == 0; -- } -- -- static char* FindCgroupPath(bool (*is_subsystem)(const char *)){ -+ static char* FindCGroupPath(bool (*is_subsystem)(const char *)){ - char *cgroup_path = nullptr; - char *hierarchy_mount = nullptr; - char *hierarchy_root = nullptr; - char *cgroup_path_relative_to_mount = nullptr; -+ bool is_cgroupv2 = false; - size_t len; - -- FindHierarchyMount(is_subsystem, &hierarchy_mount, &hierarchy_root); -+ FindHierarchyMount(is_subsystem, &is_cgroupv2, &hierarchy_mount, &hierarchy_root); - if (hierarchy_mount == nullptr || hierarchy_root == nullptr) - goto done; - -- cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(is_subsystem); -+ cgroup_path_relative_to_mount = FindCGroupPathForSubsystem(is_cgroupv2, is_subsystem); - if (cgroup_path_relative_to_mount == nullptr) - goto done; - -@@ -157,7 +291,7 @@ - return cgroup_path; - } - -- static void FindHierarchyMount(bool (*is_subsystem)(const char *), char** pmountpath, char** pmountroot) -+ static void FindHierarchyMount(bool (*is_subsystem)(const char *), bool* is_cgroupv2, char** pmountpath, char** pmountroot) - { - char *line = nullptr; - size_t lineLen = 0, maxLineLen = 0; -@@ -199,11 +333,15 @@ - - if (strncmp(filesystemType, "cgroup", 6) == 0) - { -+ if (strncmp(filesystemType, "cgroup2", 8) == 0) -+ { -+ *is_cgroupv2 = true; -+ } - char* context = nullptr; - char* strTok = strtok_s(options, ",", &context); - while (strTok != nullptr) - { -- if (is_subsystem(strTok)) -+ if (*is_cgroupv2 || is_subsystem(strTok)) - { - mountpath = (char*)PAL_malloc(lineLen+1); - if (mountpath == nullptr) -@@ -239,7 +377,7 @@ - fclose(mountinfofile); - } - -- static char* FindCGroupPathForSubsystem(bool (*is_subsystem)(const char *)) -+ static char* FindCGroupPathForSubsystem(bool is_cgroupv2, bool (*is_subsystem)(const char *)) - { - char *line = nullptr; - size_t lineLen = 0; -@@ -267,27 +405,42 @@ - maxLineLen = lineLen; - } - -- // See man page of proc to get format for /proc/self/cgroup file -- int sscanfRet = sscanf_s(line, -- "%*[^:]:%[^:]:%s", -- subsystem_list, lineLen+1, -- cgroup_path, lineLen+1); -- if (sscanfRet != 2) -+ if (is_cgroupv2) - { -- _ASSERTE(!"Failed to parse cgroup info file contents with sscanf_s."); -- goto done; -+ // See https://www.kernel.org/doc/Documentation/cgroup-v2.txt -+ // Look for "0::/some/path" -+ int sscanfRet = sscanf_s(line, -+ "0::%s", -+ cgroup_path, lineLen+1); -+ if (sscanfRet == 1) -+ { -+ result = true; -+ } - } -- -- char* context = nullptr; -- char* strTok = strtok_s(subsystem_list, ",", &context); -- while (strTok != nullptr) -+ else - { -- if (is_subsystem(strTok)) -+ // See man page of proc to get format for /proc/self/cgroup file -+ int sscanfRet = sscanf_s(line, -+ "%*[^:]:%[^:]:%s", -+ subsystem_list, lineLen+1, -+ cgroup_path, lineLen+1); -+ if (sscanfRet != 2) - { -- result = true; -- break; -+ _ASSERTE(!"Failed to parse cgroup info file contents with sscanf_s."); -+ goto done; -+ } -+ -+ char* context = nullptr; -+ char* strTok = strtok_s(subsystem_list, ",", &context); -+ while (strTok != nullptr) -+ { -+ if (is_subsystem(strTok)) -+ { -+ result = true; -+ break; -+ } -+ strTok = strtok_s(nullptr, ",", &context); - } -- strTok = strtok_s(nullptr, ",", &context); - } - } - done: -@@ -303,6 +456,36 @@ - return cgroup_path; - } - -+ static char* SearchForFile(char* search_root, const char* possible_files[], size_t possible_files_len) -+ { -+ if (search_root == nullptr) -+ { -+ return nullptr; -+ } -+ -+ for (size_t i = 0; i < possible_files_len; i++) -+ { -+ const char* possible_file = possible_files[i]; -+ size_t len = strlen(search_root); -+ len += strlen(possible_file); -+ char* full_filename = (char*)PAL_malloc(len+1); -+ if (full_filename == nullptr) -+ { -+ return nullptr; -+ } -+ strcpy_s(full_filename, len+1, search_root); -+ strcat_s(full_filename, len+1, possible_file); -+ if (access(full_filename, R_OK) != -1) -+ { -+ return full_filename; -+ } -+ -+ PAL_free(full_filename); -+ } -+ -+ return nullptr; -+ } -+ - static bool ReadMemoryValueFromFile(const char* filename, size_t* val) - { - return ::ReadMemoryValueFromFile(filename, val); --- -2.23.0 diff --git a/dotnet3.1.spec b/dotnet3.1.spec index 7157050..46eefcf 100644 --- a/dotnet3.1.spec +++ b/dotnet3.1.spec @@ -62,12 +62,10 @@ Name: dotnet3.1 Version: %{sdk_rpm_version} Release: 1%{?dist} -Summary: .NET Core CLI tools and runtime -License: MIT and ASL 2.0 and BSD +Summary: .NET Core 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/ -Packager: Fedora DotNet SIG - # The source is generated on a Fedora box via: # ./build-dotnet-tarball dotnet-v%%{runtime_version} Source0: dotnet-v%{sdk_version}-SDK.tar.gz @@ -81,8 +79,6 @@ Patch103: corefx-39633-cgroupv2-mountpoints.patch Patch200: coreclr-27048-sysctl-deprecation.patch Patch201: coreclr-hardening-flags.patch -Patch202: coreclr-cgroupv2.patch -Patch203: coreclr-cgroupv2-02.patch Patch300: core-setup-do-not-strip.patch Patch301: core-setup-hardening-flags.patch @@ -193,7 +189,7 @@ Summary: NET Core 3.1 runtime Requires: dotnet-hostfxr-3.1%{?_isa} >= %{host_rpm_version}-%{release} # libicu is dlopen()ed -Requires: libicu +Requires: libicu%{?_isa} %if %{use_bundled_libunwind} Provides: bundled(libunwind) = 1.3 @@ -254,6 +250,9 @@ applications and micro-services. Version: %{sdk_rpm_version} Summary: .NET Core 3.1 Software Development Kit +Provides: bundled(js-jquery) +Provides: bundled(npm) + Requires: dotnet-runtime-3.1%{?_isa} >= %{runtime_rpm_version}-%{release} Requires: aspnetcore-runtime-3.1%{?_isa} >= %{aspnetcore_runtime_rpm_version}-%{release} @@ -275,13 +274,13 @@ It particularly focuses on creating console applications, web applications and micro-services. -%define dotnet_targeting_pack() %{expand: +%global dotnet_targeting_pack() %{expand: %package -n %{1} Version: %{2} Summary: Targeting Pack for %{3} %{4} -Requires: dotnet-host +Requires: dotnet-host%{?_isa} %description -n %{1} This package provides a targetting pack for %{3} %{4} @@ -347,8 +346,6 @@ popd pushd src/coreclr.* %patch200 -p1 %patch201 -p1 -%patch202 -p1 -%patch203 -p1 popd pushd src/dotnet-core-setup.* From 569554ef2b548ad5aecb66d65e2437682d01a5d9 Mon Sep 17 00:00:00 2001 From: Omair Majid Date: Jan 29 2020 22:02:47 +0000 Subject: [PATCH 6/8] Add BuildRequires on dotnet/source-build-reference-packages --- diff --git a/dotnet3.1.spec b/dotnet3.1.spec index 46eefcf..089fd35 100644 --- a/dotnet3.1.spec +++ b/dotnet3.1.spec @@ -91,6 +91,7 @@ BuildRequires: clang BuildRequires: cmake BuildRequires: coreutils %if %{without bootstrap} +BuildRequires: dotnet-build-reference-packages BuildRequires: dotnet-sdk-3.1 BuildRequires: dotnet-sdk-3.1-source-built-artifacts %endif @@ -319,6 +320,7 @@ 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 -r .dotnet/ rm -r packages/source-built %endif From 0004ee9d047da6f274ae19169c36c3774fa76684 Mon Sep 17 00:00:00 2001 From: Omair Majid Date: Jan 31 2020 19:27:38 +0000 Subject: [PATCH 7/8] Fix spelling mistake --- diff --git a/dotnet3.1.spec b/dotnet3.1.spec index 089fd35..cf73d25 100644 --- a/dotnet3.1.spec +++ b/dotnet3.1.spec @@ -284,7 +284,7 @@ Summary: Targeting Pack for %{3} %{4} Requires: dotnet-host%{?_isa} %description -n %{1} -This package provides a targetting pack for %{3} %{4} +This package provides a targeting pack for %{3} %{4} that allows developers to compile against and target %{3} %{4} applications using the .NET Core SDK. @@ -561,7 +561,7 @@ echo "Testing build results for debug symbols..." * 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 targetting packs +- Update targeting packs - Install managed symbols - Completely conditionalize libunwind bundling From efe9e6e5c71f3c141efd99b8d4bf27a78bd016eb Mon Sep 17 00:00:00 2001 From: Omair Majid Date: Jan 31 2020 20:27:02 +0000 Subject: [PATCH 8/8] Remove strip patch Stripping is opt-in already. Deleting the code that is never exercised, because we don't opt in, should not have any issues. The built-time test making sure that debuginfo is still included passes with this change. --- diff --git a/core-setup-do-not-strip.patch b/core-setup-do-not-strip.patch deleted file mode 100644 index 2b3a8b3..0000000 --- a/core-setup-do-not-strip.patch +++ /dev/null @@ -1,58 +0,0 @@ ---- a/src/settings.cmake -+++ b/src/settings.cmake -@@ -69,55 +69,10 @@ - endif (CMAKE_SYSTEM_NAME STREQUAL Darwin) - endif () - --function(strip_symbols targetName outputFilename) -- if(CLR_CMAKE_PLATFORM_UNIX) -- if(STRIP_SYMBOLS) -- -- # On the older version of cmake (2.8.12) used on Ubuntu 14.04 the TARGET_FILE -- # generator expression doesn't work correctly returning the wrong path and on -- # the newer cmake versions the LOCATION property isn't supported anymore. -- if(CMAKE_VERSION VERSION_EQUAL 3.0 OR CMAKE_VERSION VERSION_GREATER 3.0) -- set(strip_source_file $) -- else() -- get_property(strip_source_file TARGET ${targetName} PROPERTY LOCATION) -- endif() -- -- if(CMAKE_SYSTEM_NAME STREQUAL Darwin) -- set(strip_destination_file ${strip_source_file}.dwarf) -- -- add_custom_command( -- TARGET ${targetName} -- POST_BUILD -- VERBATIM -- COMMAND ${DSYMUTIL} --flat --minimize ${strip_source_file} -- COMMAND ${STRIP} -u -r ${strip_source_file} -- COMMENT Stripping symbols from ${strip_source_file} into file ${strip_destination_file} -- ) -- else(CMAKE_SYSTEM_NAME STREQUAL Darwin) -- set(strip_destination_file ${strip_source_file}.dbg) -- -- add_custom_command( -- TARGET ${targetName} -- POST_BUILD -- VERBATIM -- COMMAND ${OBJCOPY} --only-keep-debug ${strip_source_file} ${strip_destination_file} -- COMMAND ${OBJCOPY} --strip-unneeded ${strip_source_file} -- COMMAND ${OBJCOPY} --add-gnu-debuglink=${strip_destination_file} ${strip_source_file} -- COMMENT Stripping symbols from ${strip_source_file} into file ${strip_destination_file} -- ) -- endif(CMAKE_SYSTEM_NAME STREQUAL Darwin) -- -- set(${outputFilename} ${strip_destination_file} PARENT_SCOPE) -- endif(STRIP_SYMBOLS) -- endif(CLR_CMAKE_PLATFORM_UNIX) --endfunction() -- - function(install_symbols targetName destination_path) - if(WIN32) - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/$/${targetName}.pdb DESTINATION ${destination_path}) - else() -- strip_symbols(${targetName} strip_destination_file) -- install(FILES ${strip_destination_file} DESTINATION ${destination_path}) - endif() - endfunction() - diff --git a/dotnet3.1.spec b/dotnet3.1.spec index cf73d25..ef6ebc8 100644 --- a/dotnet3.1.spec +++ b/dotnet3.1.spec @@ -80,8 +80,7 @@ Patch103: corefx-39633-cgroupv2-mountpoints.patch Patch200: coreclr-27048-sysctl-deprecation.patch Patch201: coreclr-hardening-flags.patch -Patch300: core-setup-do-not-strip.patch -Patch301: core-setup-hardening-flags.patch +Patch300: core-setup-hardening-flags.patch Patch500: cli-telemetry-optout.patch @@ -352,7 +351,6 @@ popd pushd src/dotnet-core-setup.* %patch300 -p1 -%patch301 -p1 popd pushd src/dotnet-cli.*