From a772f1c431c71a64d751ba4b981b0ddceaf1bb7c Mon Sep 17 00:00:00 2001 From: eabdullin Date: Wed, 19 Nov 2025 07:28:16 +0000 Subject: [PATCH] Import from CS git --- .dotnet10.0.metadata | 5 + .gitignore | 5 + SOURCES/check-debug-symbols.py | 140 +++ .../dotnet-10.0.100-rc.1.25451.107.tar.gz.sig | 17 + SOURCES/dotnet.sh.in | 14 + SOURCES/macros.dotnet | 18 + SOURCES/release-key-2023.asc | 29 + SOURCES/release.json | 11 + SOURCES/runtime-118376-z13-simd.patch | 657 +++++++++++++ ...time-disable-fortify-on-ilasm-parser.patch | 12 + SOURCES/runtime-openssl-sha1.patch | 34 + ...runtime-re-enable-implicit-rejection.patch | 142 +++ SPECS/dotnet10.0.spec | 921 ++++++++++++++++++ 13 files changed, 2005 insertions(+) create mode 100644 .dotnet10.0.metadata create mode 100755 SOURCES/check-debug-symbols.py create mode 100644 SOURCES/dotnet-10.0.100-rc.1.25451.107.tar.gz.sig create mode 100644 SOURCES/dotnet.sh.in create mode 100644 SOURCES/macros.dotnet create mode 100644 SOURCES/release-key-2023.asc create mode 100644 SOURCES/release.json create mode 100644 SOURCES/runtime-118376-z13-simd.patch create mode 100644 SOURCES/runtime-disable-fortify-on-ilasm-parser.patch create mode 100644 SOURCES/runtime-openssl-sha1.patch create mode 100644 SOURCES/runtime-re-enable-implicit-rejection.patch create mode 100644 SPECS/dotnet10.0.spec diff --git a/.dotnet10.0.metadata b/.dotnet10.0.metadata new file mode 100644 index 0000000..2aefa7a --- /dev/null +++ b/.dotnet10.0.metadata @@ -0,0 +1,5 @@ +ee1a56716978a3c41a44e3443000f707b07933c7 SOURCES/dotnet-10.0.100-rc.1.25451.107.tar.gz +62d6dafc4b1ce51f68320ed821b6e3b373392b95 SOURCES/dotnet-prebuilts-10.0.100-rc.1.25420.111-arm64.tar.gz +3ac146f7938cba5e13e302fed264d292b5a0d5eb SOURCES/dotnet-prebuilts-10.0.100-rc.1.25420.111-x64.tar.gz +85fda17f8a358b46070d1edbb798fe99e358d132 SOURCES/dotnet-prebuilts-10.0.100-rc.1.25451.107-ppc64le.tar.gz +813d4b3b93f64462efc3ce9b41aaa98f54c1cbe8 SOURCES/dotnet-prebuilts-10.0.100-rc.1.25451.107-s390x.tar.gz diff --git a/.gitignore b/.gitignore index e69de29..a2c4d0d 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,5 @@ +SOURCES/dotnet-10.0.100-rc.1.25451.107.tar.gz +SOURCES/dotnet-prebuilts-10.0.100-rc.1.25420.111-arm64.tar.gz +SOURCES/dotnet-prebuilts-10.0.100-rc.1.25420.111-x64.tar.gz +SOURCES/dotnet-prebuilts-10.0.100-rc.1.25451.107-ppc64le.tar.gz +SOURCES/dotnet-prebuilts-10.0.100-rc.1.25451.107-s390x.tar.gz diff --git a/SOURCES/check-debug-symbols.py b/SOURCES/check-debug-symbols.py new file mode 100755 index 0000000..a4caa57 --- /dev/null +++ b/SOURCES/check-debug-symbols.py @@ -0,0 +1,140 @@ +#!/usr/bin/python3 + +""" +Check debug symbols are present in shared object and can identify +code. + +It starts scanning from a directory and recursively scans all ELF +files found in it for various symbols to ensure all debuginfo is +present and nothing has been stripped. + +Usage: + +./check-debug-symbols /path/of/dir/to/scan/ + + +Example: + +./check-debug-symbols /usr/lib64 +""" + +# This technique was explained to me by Mark Wielaard (mjw). + +import collections +import os +import re +import subprocess +import sys + +ScanResult = collections.namedtuple('ScanResult', + 'file_name debug_info debug_abbrev file_symbols gnu_debuglink') + +file_symbol_exclude_list = [ + 'ilc', +] + +def scan_file(file): + "Scan the provided file and return a ScanResult containing results of the scan." + + # Test for .debug_* sections in the shared object. This is the main test. + # Stripped objects will not contain these. + readelf_S_result = subprocess.run(['eu-readelf', '-S', file], + stdout=subprocess.PIPE, encoding='utf-8', check=True) + has_debug_info = any(line for line in readelf_S_result.stdout.split('\n') if '] .debug_info' in line) + + has_debug_abbrev = any(line for line in readelf_S_result.stdout.split('\n') if '] .debug_abbrev' in line) + + # Test FILE symbols. These will most likely be removed by anyting that + # manipulates symbol tables because it's generally useless. So a nice test + # that nothing has messed with symbols. + def contains_file_symbols(line): + parts = line.split() + if len(parts) < 8: + return False + return \ + parts[2] == '0' and parts[3] == 'FILE' and parts[4] == 'LOCAL' and parts[5] == 'DEFAULT' and \ + parts[6] == 'ABS' and re.match(r'((.*/)?[-_a-zA-Z0-9]+\.(c|cc|cpp|cxx))?', parts[7]) + + readelf_s_result = subprocess.run(["eu-readelf", '-s', file], + stdout=subprocess.PIPE, encoding='utf-8', check=True) + has_file_symbols = True + if not os.path.basename(file) in file_symbol_exclude_list: + has_file_symbols = any(line for line in readelf_s_result.stdout.split('\n') if contains_file_symbols(line)) + + # Test that there are no .gnu_debuglink sections pointing to another + # debuginfo file. There shouldn't be any debuginfo files, so the link makes + # no sense either. + has_gnu_debuglink = any(line for line in readelf_s_result.stdout.split('\n') if '] .gnu_debuglink' in line) + + return ScanResult(file, has_debug_info, has_debug_abbrev, has_file_symbols, has_gnu_debuglink) + +def is_elf(file): + result = subprocess.run(['file', file], stdout=subprocess.PIPE, encoding='utf-8', check=True) + return re.search(r'ELF 64-bit [LM]SB (?:pie )?(?:executable|shared object)', result.stdout) + +def scan_file_if_sensible(file): + if is_elf(file): + return scan_file(file) + return None + +def scan_dir(dir): + results = [] + for root, _, files in os.walk(dir): + for name in files: + result = scan_file_if_sensible(os.path.join(root, name)) + if result: + results.append(result) + return results + +def scan(file): + file = os.path.abspath(file) + if os.path.isdir(file): + return scan_dir(file) + elif os.path.isfile(file): + return [scan_file_if_sensible(file)] + +def is_bad_result(result): + return not result.debug_info or not result.debug_abbrev or not result.file_symbols or result.gnu_debuglink + +def print_scan_results(results, verbose): + # print(results) + for result in results: + file_name = result.file_name + found_issue = False + if not result.debug_info: + found_issue = True + print('error: missing .debug_info section in', file_name) + if not result.debug_abbrev: + found_issue = True + print('error: missing .debug_abbrev section in', file_name) + if not result.file_symbols: + found_issue = True + print('error: missing FILE symbols in', file_name) + if result.gnu_debuglink: + found_issue = True + print('error: unexpected .gnu_debuglink section in', file_name) + if verbose and not found_issue: + print('OK: ', file_name) + +def main(args): + verbose = False + files = [] + for arg in args: + if arg == '--verbose' or arg == '-v': + verbose = True + else: + files.append(arg) + + results = [] + for file in files: + results.extend(scan(file)) + + print_scan_results(results, verbose) + + if any(is_bad_result(result) for result in results): + return 1 + return 0 + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/SOURCES/dotnet-10.0.100-rc.1.25451.107.tar.gz.sig b/SOURCES/dotnet-10.0.100-rc.1.25451.107.tar.gz.sig new file mode 100644 index 0000000..93c959e --- /dev/null +++ b/SOURCES/dotnet-10.0.100-rc.1.25451.107.tar.gz.sig @@ -0,0 +1,17 @@ +-----BEGIN PGP SIGNATURE----- +Version: BSN Pgp v1.0.0.0 + +iQIcBAABCAAGBQJowLIWAAoJEP2/U8JNtIcu4pgP/2SWmbDSU9AigTTQw7ENur4R +e87kPGnwGqosGiN/in5GhZsrRy2D0ETu9QvyscB1yCpXof3fsrpoBVCfuWwSyv0+ +bRDUChXEMqOO6iwZmQc+fmZ/Kbymos1WWqFqBmOtNqcfs7L0gKZnTkEA/XRDVsSV +l8ZTUuEL5XKZnY1DmeTYrsOeHTtmxSVEzH1DsWP/2rjBXN4eBCa9neXIQCGqoOZE +xebrlitT9N2/LwZ6NyeRYK0ZaVHS0SNIaFfQf/OpCG5ytYItL1sGZYkmnMXLQBhd +3lgGGpv9bKr/5XZP1A/nWXLPH3nKKGF/6sqEAkEcQ6kjQsDBkGbJgsWJgGes1ked +CUagzbXtnYyuQcFoT6pEmZ3e2u3E/XjnFy0bqRWUaaUhnLQnuC8zC3r/CvTy8JTv ++ncB9BFuzgrtZD94zlmqWvich6QbQDDRngwSA6XZRH90l+i9PrhWt4RddnLa+joY +QyuvmGftQrFnmJXBPjQdAg5Fz96zVRQq7crwpgCgpZE2gPvl8CSxzHuHQ6oRVZW/ +yoQC+XJDkZDjclatsv3a9dRBMnLH4hkGyXwsdX7dBDOpZ0iMCKDy+HF7sDV4pxGU +FZicVmAddHXhZCrKZAQGpSLkjWYacOjYVLdNmUNwC3CRzN8Ncbam6psKzI6AJizJ +Ites5ZZ9uBm2i6z/179f +=uhIK +-----END PGP SIGNATURE----- diff --git a/SOURCES/dotnet.sh.in b/SOURCES/dotnet.sh.in new file mode 100644 index 0000000..65b92a0 --- /dev/null +++ b/SOURCES/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/SOURCES/macros.dotnet b/SOURCES/macros.dotnet new file mode 100644 index 0000000..307078e --- /dev/null +++ b/SOURCES/macros.dotnet @@ -0,0 +1,18 @@ +# .NET's name for the architecture +%dotnet_runtime_arch %{lua: +local target = rpm.expand("%{_target_cpu}") +local arch = "x64" +if target == "aarch64" then + arch = "arm64" +elseif target == "ppc64le" then + arch = "ppc64le" +elseif target == "s390x" then + arch = "s390x" +elseif target == "x86_64" then + arch = "x64" +end +print(arch) +} + +# .NET's identifier for the OS+architecture combination +%dotnet_runtime_id %(. /etc/os-release ; echo "${ID}.${VERSION_ID%%.*}")-%{dotnet_runtime_arch} diff --git a/SOURCES/release-key-2023.asc b/SOURCES/release-key-2023.asc new file mode 100644 index 0000000..96844b6 --- /dev/null +++ b/SOURCES/release-key-2023.asc @@ -0,0 +1,29 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BSN Pgp v1.1.0.0 + +mQINBGUKsUYBEADVCJm4EhXALr1ld42kWeh/vM0XMZ2orNT6NRLDRYjpE4mm4UqA +vpjfGCwt5fLcrT4yZng8ABkB3QwTsZzmxesAMD5AZR/gdU1G96DuDGsjp6zJvTuX +zvz3PXUYfcl9n5X32acA6N9J5Xfp10xqX3oitUODBdYy/vKW/v/y87ZxgaR6a3wp +pPJBJIVKwFJx13v4BHRsGp1fepliQcXPvmNKFNI20le5+FbLq6C9hY5wcwGHGfQr +EokH79GsmqgSImqxDOIh06J5VfWA+JwV+3vf95pD8IUrRfGQ+GK7b1/bySxtM5Qa +b/IDgvl/Qq3AzEpGarMBaqGbqMz1C7jd8Y6nyKMP/V+OCjbEdYNM8GRz6kBP3Un+ +Frat5Lc2o4DF+zB3PKIJS3hku5gwlJu6IU1F23vmYFtjUcpRGmyQZDoWyBbOWlB5 +4SXqVu16amUsRFYmOK8BJMjdotcVbriVIv6WRmugfhIMoRJzVGxYkdbuiuMAX69V +xDoGpxX5A8S5A79y0USUVtadQfFavMTyb/gUuUe8oDsqK9gdI3ETxLYG4gYwauVX +fCGfoLOKsq5dPzEuEA7GCRrMau+rHKFaM7BigSdnHFW7xNZ4v0YnXAagoqM2G5o5 +9sak0l57vxxTVk2V3iZzkoU2J2Zlyxyh72n5vjRmb7aNwmQh4Eav6a8ssQARAQAB +tBlvbm54Y29yZWRldkBtaWNyb3NvZnQuY29tiQI4BBMBCAAiBQJlCrFGAhsDBgsJ +CAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRD9v1PCTbSHLtfzEADIKq15XDeQxLSo +BG1aFa9n82K1YADVcu1LeddfhDmQWLnZNgyHtQlKN2n59282CXtgymzae3uc05s2 +feIJaqF4M4NnCX8Ct3K7Hq1jI7ZktlquPCCy9XHq9aQY8XTxmdtRevtclKgYTwDh +w+D/KbE8vTZ6o7JoubA3MKf4k3S8qL/0rIyaC6h0EpiWoMy1TdNMMK7BT4kl6Vz4 +W6KmNgOux1Pzku5ULM4WuOzmwW+NAzpOLJowfDs1ZC2RM3+g9i1/DmwWtCHngvGD ++clA0I0agXxo05toOBTfwxd2gWYczuo/Ole16fYTzqT6n0DHqOjjcc9A7EmC72fQ +J+hHAqM+4+CbEGuMpNnTMpCZs98bcK3Rqx/bDJYtbclZzm5O/V4nVbDrJZKzpgA1 +KuzNMLkr62P6/t15UsStgmrlTILmE5NG0CR1mj/46+mNbsMZCel3dcvnT1Zf4rTq +QxMC7Dd/DECKQVC339G/BRfNyhOk2S1mZR/g1uS4bznL+tiwudDh/TAi5C3ZBDMh +0muwD9caXS/QFIBWtb2ai3IcpU357R/ERPKLcWYtoYJ80RuKi6XYr1WxSPBmd5Qm +wuncye+wR2dveo2jnIXZGUSgz50ZNgBxs/cYWAQ8J6KMgIBa+JY2qalzvIGbrC5x +Sr+CkhS8vrktfnRgc8yBssJnvNfqXA== +=pKgS +-----END PGP PUBLIC KEY BLOCK----- diff --git a/SOURCES/release.json b/SOURCES/release.json new file mode 100644 index 0000000..b0e6839 --- /dev/null +++ b/SOURCES/release.json @@ -0,0 +1,11 @@ +{ + "release": "10.0.0-rc.1", + "channel": "10.0", + "tag": "v10.0.100-rc.1.25451.107", + "sdkVersion": "10.0.100-rc.1.25451.107", + "runtimeVersion": "10.0.0-rc.1.25451.107", + "aspNetCoreVersion": "10.0.0-rc.1.25451.107", + "sourceRepository": "https://github.com/dotnet/dotnet", + "sourceVersion": "2db1f5ee2bdda2e8d873769325fabede32e420e0", + "officialBuildId": "20250901.7" +} diff --git a/SOURCES/runtime-118376-z13-simd.patch b/SOURCES/runtime-118376-z13-simd.patch new file mode 100644 index 0000000..582e6f3 --- /dev/null +++ b/SOURCES/runtime-118376-z13-simd.patch @@ -0,0 +1,657 @@ +From 97f2fb6ab2988c03917a937cc1552356ff5f7069 Mon Sep 17 00:00:00 2001 +From: saitama951 +Date: Tue, 5 Aug 2025 07:12:13 +0000 +Subject: [PATCH 1/4] [S390X] Add simd fallback support for unsupported s390x + architectures + +Vector facility was introduced in the z13, which majorly +introduces vector int/short/long/double variants of the +vector instructions. with the release of z14 we introduced +vector float variant as part of vector enhancement facility 1. +This patch majorly supports z13 and previous generations. +--- + src/mono/mono/mini/simd-intrinsics.c | 113 +++++++++++++++++++++++-- + src/mono/mono/utils/mono-hwcap-s390x.c | 1 + + src/mono/mono/utils/mono-hwcap-vars.h | 1 + + 3 files changed, 109 insertions(+), 6 deletions(-) + +diff --git a/src/runtime/src/mono/mono/mini/simd-intrinsics.c b/src/runtime/src/mono/mono/mini/simd-intrinsics.c +index 88143637310ef9..b8f78487cd85e6 100644 +--- a/src/runtime/src/mono/mono/mini/simd-intrinsics.c ++++ b/src/runtime/src/mono/mono/mini/simd-intrinsics.c +@@ -2112,6 +2112,8 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + } + #elif defined(TARGET_S390X) + if (type_enum_is_float(arg0_type)) { ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; + return emit_simd_ins_for_sig (cfg, klass, arg0_type == MONO_TYPE_R8 ? OP_S390_VFLPDB : OP_S390_VFLPSB, -1, arg0_type, fsig, args); + } else { + return emit_simd_ins_for_sig (cfg, klass, OP_VECTOR_IABS, -1, arg0_type, fsig, args); +@@ -2135,11 +2137,17 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + if (!is_element_type_primitive (fsig->params [0]) || !is_element_type_primitive (fsig->params [1])) + return NULL; + ++#if defined(TARGET_S390X) ++ if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative) || (id !=SN_Xor) || (id != SN_BitwiseAnd) || (id != SN_BitwiseOr)) && arg0_type == MONO_TYPE_R4) ++ return NULL; ++#endif ++ + #if !defined(TARGET_ARM64) && !defined(TARGET_S390X) + if (((id == SN_Max) || (id == SN_Min)) && type_enum_is_float(arg0_type)) + return NULL; + #endif + ++ + return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id); + } + case SN_Divide: { +@@ -2149,7 +2157,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + if (!is_element_type_primitive (fsig->params [0]) || + !(MONO_TYPE_IS_VECTOR_PRIMITIVE (fsig->params [1]) || is_element_type_primitive (fsig->params [1]))) + return NULL; +- ++#if defined(TARGET_S390X) ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id); + } + case SN_Multiply: { +@@ -2170,7 +2181,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + return NULL; + } else if (!(is_element_type_primitive (fsig->params [0]) && is_element_type_primitive (fsig->params [1]))) + return NULL; +- ++#if defined(TARGET_S390X) ++ if (!mono_hwcap_s390x_has_ve1 && (vector_inner_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, vector_inner_type, id); + } + case SN_AndNot: { +@@ -2198,13 +2212,17 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + int add_op; + + if (type_enum_is_float (arg0_type)) { ++#if defined(TARGET_S390X) ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + mul_op = OP_FMUL; + add_op = OP_FADD; + } else { + mul_op = OP_IMUL; + add_op = OP_IADD; + +-#ifdef TARGET_ARM64 ++#if defined(TARGET_ARM64) || defined(TARGET_S390X) + if (!COMPILE_LLVM (cfg) && (arg0_type == MONO_TYPE_I8 || arg0_type == MONO_TYPE_U8 || arg0_type == MONO_TYPE_I || arg0_type == MONO_TYPE_U)) + return NULL; + #endif +@@ -2274,6 +2292,8 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + int ceil_or_floor = id == SN_Ceiling ? 10 : 9; + return emit_simd_ins_for_sig (cfg, klass, OP_SSE41_ROUNDP, ceil_or_floor, arg0_type, fsig, args); + #elif defined(TARGET_S390X) ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; + int ceil_or_floor = id == SN_Ceiling ? 6 : 7; + switch (arg0_type){ + case MONO_TYPE_R4: +@@ -2464,6 +2484,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + return emit_vector_create_scalar (cfg, vklass, etype, args [0], is_unsafe); + } + case SN_Dot: { ++#if defined(TARGET_S390X) ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + return emit_dot (cfg, klass, fsig->params [0], arg0_type, args [0]->dreg, args [1]->dreg); + } + case SN_Equals: +@@ -2472,6 +2496,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + if (!is_element_type_primitive (fsig->params [0])) + return NULL; + MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]); ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + if (id == SN_Equals) + return emit_xcompare (cfg, klass, arg0_type, args [0], args [1]); + +@@ -2733,7 +2761,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + case SN_LessThanOrEqual: { + if (!is_element_type_primitive (fsig->params [0])) + return NULL; +- ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + return emit_xcompare_for_intrinsic (cfg, klass, id, arg0_type, args [0], args [1]); + } + case SN_GreaterThanAll: +@@ -2750,7 +2781,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + g_assert (fsig->param_count == 2 && + fsig->ret->type == MONO_TYPE_BOOLEAN && + mono_metadata_type_equal (fsig->params [0], fsig->params [1])); +- ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + gboolean is_all = FALSE; + switch (id) { + case SN_GreaterThanAll: +@@ -2857,6 +2891,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + return NULL; + if (!type_enum_is_float(arg0_type)) + return emit_xzero (cfg, klass); ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + int op = -1; + #if defined(TARGET_ARM64) || defined(TARGET_AMD64) || defined(TARGET_WASM) || defined(TARGET_S390X) + op = OP_ONES_COMPLEMENT; +@@ -2879,7 +2917,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + return emit_xones (cfg, klass); + } + } +- ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + MonoInst *arg0 = args [0]; + MonoClass *op_klass = klass; + +@@ -2907,6 +2948,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + case SN_IsPositiveInfinity: { + if (!is_element_type_primitive (fsig->params [0])) + return NULL; ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + if (arg0_type == MONO_TYPE_R4) { + guint32 value[4]; + +@@ -2984,6 +3029,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + case SN_IsZero: { + if (!is_element_type_primitive (fsig->params [0])) + return NULL; ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + return emit_xcompare (cfg, klass, arg0_type, args [0], emit_xzero (cfg, klass)); + } + case SN_Narrow: { +@@ -3129,7 +3178,10 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + case SN_OnesComplement: { + if (!is_element_type_primitive (fsig->params [0])) + return NULL; ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1 && (id == SN_Negate) && (arg0_type == MONO_TYPE_R4)) + return emit_simd_ins_for_unary_op (cfg, klass, fsig, args, arg0_type, id); ++#endif + } + case SN_Shuffle: { + MonoType *etype = get_vector_t_elem_type (fsig->ret); +@@ -3295,6 +3347,9 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + + return emit_simd_ins_for_sig (cfg, klass, OP_XOP_X_X, instc0, arg0_type, fsig, args); + #elif defined(TARGET_S390X) ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++ + int instc0 = arg0_type == MONO_TYPE_R4 ? OP_S390_VFSQSB : OP_S390_VFSQDB; + return emit_simd_ins_for_sig (cfg, klass, instc0, 0, arg0_type, fsig, args); + #else +@@ -3792,6 +3847,10 @@ emit_sri_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + if (fsig->param_count != 2 ) + return NULL; + arg0_type = fsig->param_count > 0 ? get_underlying_type (fsig->params [0]) : MONO_TYPE_VOID; ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1 && ((id !=SN_op_ExclusiveOr) || (id != SN_op_BitwiseAnd) || (id != SN_op_BitwiseOr)) && arg0_type == MONO_TYPE_R4) ++ return NULL; ++#endif + return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id); + + } +@@ -3800,6 +3859,10 @@ emit_sri_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + if (fsig->param_count != 2 ) + return NULL; + MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]); ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + switch (id) { + case SN_op_Equality: return emit_xequal (cfg, arg_class, arg0_type, args [0], args [1]); + case SN_op_Inequality: return emit_not_xequal (cfg, arg_class, arg0_type, args [0], args [1]); +@@ -3810,6 +3873,10 @@ emit_sri_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + case SN_op_UnaryNegation: + if (fsig->param_count != 1 ) + return NULL; ++#if defined(TARGET_S390X) ++ if (!mono_hwcap_s390x_has_ve1 && (id == SN_op_UnaryNegation) && (arg0_type == MONO_TYPE_R4)) ++ return NULL; ++#endif + return emit_simd_ins_for_unary_op (cfg, klass, fsig, args, arg0_type, id); + case SN_op_UnaryPlus: + if (fsig->param_count != 1) +@@ -4150,10 +4217,18 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + #ifndef TARGET_ARM64 + if ((id == SN_Max) || (id == SN_Min)) + return NULL; ++#endif ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative))) ++ return NULL; + #endif + return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, MONO_TYPE_R4, id); + } + case SN_Dot: { ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1) ++ return NULL; ++#endif + return emit_dot (cfg, klass, fsig->params [0], MONO_TYPE_R4, args [0]->dreg, args [1]->dreg); + } + case SN_Negate: +@@ -4172,6 +4247,10 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + return emit_simd_ins_for_sig (cfg, cmethod->klass, OP_XOP_OVR_X_X, INTRINS_AARCH64_ADV_SIMD_FABS, MONO_TYPE_R4, fsig, args); + #endif + } ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1) ++ return NULL; ++#endif + // MAX(x,0-x) + MonoInst *zero = emit_xzero (cfg, klass); + MonoInst *neg = emit_simd_ins (cfg, klass, OP_XBINOP, zero->dreg, args [0]->dreg); +@@ -4185,12 +4264,20 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + case SN_op_Equality: { + if (!(fsig->param_count == 2 && mono_metadata_type_equal (fsig->params [0], type) && mono_metadata_type_equal (fsig->params [1], type))) + return NULL; ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1) ++ return NULL; ++#endif + MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]); + return emit_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]); + } + case SN_op_Inequality: { + if (!(fsig->param_count == 2 && mono_metadata_type_equal (fsig->params [0], type) && mono_metadata_type_equal (fsig->params [1], type))) + return NULL; ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1) ++ return NULL; ++#endif + MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]); + return emit_not_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]); + } +@@ -4201,6 +4288,11 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + ins = emit_simd_ins (cfg, klass, OP_XOP_X_X, args [0]->dreg, -1); + ins->inst_c0 = (IntrinsicId)INTRINS_SIMD_SQRT_R4; + return ins; ++#elif defined(TARGET_S390X) ++ if (!mono_hwcap_s390x_has_ve1) ++ return NULL; ++ ins = emit_simd_ins (cfg, klass, OP_S390_VFSQSB, args [0]->dreg, -1); ++ return ins; + #else + return NULL; + #endif +@@ -4215,6 +4307,10 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + if (id == SN_Clamp) + return NULL; + #endif ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1) ++ return NULL; ++#endif + + MonoInst *max = emit_simd_ins (cfg, klass, OP_XBINOP, args[0]->dreg, args[1]->dreg); + max->inst_c0 = OP_FMAX; +@@ -6865,6 +6961,11 @@ static MonoInst* + emit_simd_intrinsics (const char *class_ns, const char *class_name, MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args) + { + MonoInst *ins; ++#ifdef TARGET_S390X ++ /* vector facility was introduced in z13 */ ++ if (!mono_hwcap_s390x_has_vec) ++ return NULL; ++#endif + + if (cfg->opt & MONO_OPT_SIMD) { + ins = arch_emit_simd_intrinsics (class_ns, class_name, cfg, cmethod, fsig, args); +diff --git a/src/runtime/src/mono/mono/utils/mono-hwcap-s390x.c b/src/runtime/src/mono/mono/utils/mono-hwcap-s390x.c +index ddc828bbc046a0..7f735066e238b8 100644 +--- a/src/runtime/src/mono/mono/utils/mono-hwcap-s390x.c ++++ b/src/runtime/src/mono/mono/utils/mono-hwcap-s390x.c +@@ -157,6 +157,7 @@ mono_hwcap_arch_init (void) + + mono_hwcap_s390x_has_fpe = facs.fpe; + mono_hwcap_s390x_has_vec = facs.vec; ++ mono_hwcap_s390x_has_ve1 = facs.ve1; + mono_hwcap_s390x_has_mlt = facs.multi; + mono_hwcap_s390x_has_ia = facs.ia; + mono_hwcap_s390x_has_gie = facs.gie; +diff --git a/src/runtime/src/mono/mono/utils/mono-hwcap-vars.h b/src/runtime/src/mono/mono/utils/mono-hwcap-vars.h +index 98f4eb29115e83..391910a919c76e 100644 +--- a/src/runtime/src/mono/mono/utils/mono-hwcap-vars.h ++++ b/src/runtime/src/mono/mono/utils/mono-hwcap-vars.h +@@ -54,6 +54,7 @@ MONO_HWCAP_VAR(riscv_has_stdext_v) + #elif defined (TARGET_S390X) + + MONO_HWCAP_VAR(s390x_has_fpe) ++MONO_HWCAP_VAR(s390x_has_ve1) + MONO_HWCAP_VAR(s390x_has_vec) + MONO_HWCAP_VAR(s390x_has_mlt) + MONO_HWCAP_VAR(s390x_has_ia) + +From f5e4c47373482aedd36b7f9c579739f3e8160432 Mon Sep 17 00:00:00 2001 +From: Sanjam Panda <36253777+saitama951@users.noreply.github.com> +Date: Tue, 5 Aug 2025 14:45:51 +0530 +Subject: [PATCH 2/4] Apply suggestions from code review + +fix code style + +Co-authored-by: kasperk81 <83082615+kasperk81@users.noreply.github.com> +--- + src/mono/mono/mini/simd-intrinsics.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/src/runtime/src/mono/mono/mini/simd-intrinsics.c b/src/runtime/src/mono/mono/mini/simd-intrinsics.c +index b8f78487cd85e6..0b33399d8634b5 100644 +--- a/src/runtime/src/mono/mono/mini/simd-intrinsics.c ++++ b/src/runtime/src/mono/mono/mini/simd-intrinsics.c +@@ -2183,7 +2183,7 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + return NULL; + #if defined(TARGET_S390X) + if (!mono_hwcap_s390x_has_ve1 && (vector_inner_type == MONO_TYPE_R4)) +- return NULL; ++ return NULL; + #endif + return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, vector_inner_type, id); + } +@@ -2783,7 +2783,7 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + mono_metadata_type_equal (fsig->params [0], fsig->params [1])); + #ifdef TARGET_S390X + if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) +- return NULL; ++ return NULL; + #endif + gboolean is_all = FALSE; + switch (id) { +@@ -4227,7 +4227,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + case SN_Dot: { + #ifdef TARGET_S390X + if (!mono_hwcap_s390x_has_ve1) +- return NULL; ++ return NULL; + #endif + return emit_dot (cfg, klass, fsig->params [0], MONO_TYPE_R4, args [0]->dreg, args [1]->dreg); + } +@@ -4249,7 +4249,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + } + #ifdef TARGET_S390X + if (!mono_hwcap_s390x_has_ve1) +- return NULL; ++ return NULL; + #endif + // MAX(x,0-x) + MonoInst *zero = emit_xzero (cfg, klass); +@@ -4266,7 +4266,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + return NULL; + #ifdef TARGET_S390X + if (!mono_hwcap_s390x_has_ve1) +- return NULL; ++ return NULL; + #endif + MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]); + return emit_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]); +@@ -4276,7 +4276,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + return NULL; + #ifdef TARGET_S390X + if (!mono_hwcap_s390x_has_ve1) +- return NULL; ++ return NULL; + #endif + MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]); + return emit_not_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]); +@@ -4309,7 +4309,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + #endif + #ifdef TARGET_S390X + if (!mono_hwcap_s390x_has_ve1) +- return NULL; ++ return NULL; + #endif + + MonoInst *max = emit_simd_ins (cfg, klass, OP_XBINOP, args[0]->dreg, args[1]->dreg); + +From 579eda9bc245938bbb2a932064ba552528b7457d Mon Sep 17 00:00:00 2001 +From: saitama951 +Date: Wed, 6 Aug 2025 04:35:56 +0000 +Subject: [PATCH 3/4] fix errors * fix test case failures on arm64 * fix more + code style reviews + +--- + src/mono/mono/mini/simd-intrinsics.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/src/runtime/src/mono/mono/mini/simd-intrinsics.c b/src/runtime/src/mono/mono/mini/simd-intrinsics.c +index 0b33399d8634b5..fab77158e8bdf5 100644 +--- a/src/runtime/src/mono/mono/mini/simd-intrinsics.c ++++ b/src/runtime/src/mono/mono/mini/simd-intrinsics.c +@@ -2782,7 +2782,7 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + fsig->ret->type == MONO_TYPE_BOOLEAN && + mono_metadata_type_equal (fsig->params [0], fsig->params [1])); + #ifdef TARGET_S390X +- if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) ++ if (!mono_hwcap_s390x_has_ve1 && (arg0_type == MONO_TYPE_R4)) + return NULL; + #endif + gboolean is_all = FALSE; +@@ -3180,8 +3180,9 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + return NULL; + #ifdef TARGET_S390X + if (!mono_hwcap_s390x_has_ve1 && (id == SN_Negate) && (arg0_type == MONO_TYPE_R4)) +- return emit_simd_ins_for_unary_op (cfg, klass, fsig, args, arg0_type, id); ++ return NULL; + #endif ++ return emit_simd_ins_for_unary_op (cfg, klass, fsig, args, arg0_type, id); + } + case SN_Shuffle: { + MonoType *etype = get_vector_t_elem_type (fsig->ret); +@@ -3849,7 +3850,7 @@ emit_sri_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + arg0_type = fsig->param_count > 0 ? get_underlying_type (fsig->params [0]) : MONO_TYPE_VOID; + #ifdef TARGET_S390X + if (!mono_hwcap_s390x_has_ve1 && ((id !=SN_op_ExclusiveOr) || (id != SN_op_BitwiseAnd) || (id != SN_op_BitwiseOr)) && arg0_type == MONO_TYPE_R4) +- return NULL; ++ return NULL; + #endif + return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id); + +@@ -4220,7 +4221,7 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + #endif + #ifdef TARGET_S390X + if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative))) +- return NULL; ++ return NULL; + #endif + return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, MONO_TYPE_R4, id); + } + +From 9f2dad96c5bf08f462577f11100249fdb3f060a6 Mon Sep 17 00:00:00 2001 +From: saitama951 +Date: Thu, 14 Aug 2025 12:51:00 +0000 +Subject: [PATCH 4/4] address review comments + +--- + src/mono/mono/mini/mini-s390x.h | 2 +- + src/mono/mono/mini/mini.h | 11 ++++++++ + src/mono/mono/mini/simd-intrinsics.c | 38 +++++++--------------------- + 3 files changed, 21 insertions(+), 30 deletions(-) + +diff --git a/src/runtime/src/mono/mono/mini/mini-s390x.h b/src/runtime/src/mono/mono/mini/mini-s390x.h +index 6e680ba9c6374b..82b2f411f4d439 100644 +--- a/src/runtime/src/mono/mono/mini/mini-s390x.h ++++ b/src/runtime/src/mono/mono/mini/mini-s390x.h +@@ -83,7 +83,7 @@ struct SeqPointInfo { + #define MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX 1 + #define MONO_ARCH_HAVE_UNWIND_BACKTRACE 1 + #define MONO_ARCH_FLOAT32_SUPPORTED 1 +-#define MONO_ARCH_SIMD_INTRINSICS mono_hwcap_s390x_has_vec ++#define MONO_ARCH_SIMD_INTRINSICS 1 + #define MONO_ARCH_NEED_SIMD_BANK 1 + #define MONO_ARCH_USE_SHARED_FP_SIMD_BANK 1 + #define S390_STACK_ALIGNMENT 8 +diff --git a/src/runtime/src/mono/mono/mini/mini.h b/src/runtime/src/mono/mono/mini/mini.h +index 30e5f5c4728811..65b38b751e8c45 100644 +--- a/src/runtime/src/mono/mono/mini/mini.h ++++ b/src/runtime/src/mono/mono/mini/mini.h +@@ -64,6 +64,12 @@ typedef struct SeqPointInfo SeqPointInfo; + #include "mono/metadata/callspec.h" + #include "mono/metadata/icall-signatures.h" + ++/* we use runtime checks to fallback to scalar ops for/ ++ * older z/Architectures ++ */ ++#ifdef TARGET_S390X ++#include ++#endif + /* + * The mini code should not have any compile time dependencies on the GC being used, so the same object file from mini/ + * can be linked into both mono and mono-sgen. +@@ -3015,6 +3021,11 @@ mini_safepoints_enabled (void) + static inline gboolean + mini_class_is_simd (MonoCompile *cfg, MonoClass *klass) + { ++#ifdef TARGET_S390X ++ /* vector facility was introduced in z13 */ ++ if (!mono_hwcap_s390x_has_vec) ++ return FALSE; ++#endif + #ifdef MONO_ARCH_SIMD_INTRINSICS + if (!(((cfg)->opt & MONO_OPT_SIMD) && m_class_is_simd_type (klass))) + return FALSE; +diff --git a/src/runtime/src/mono/mono/mini/simd-intrinsics.c b/src/runtime/src/mono/mono/mini/simd-intrinsics.c +index fab77158e8bdf5..ebe0637605fe5a 100644 +--- a/src/runtime/src/mono/mono/mini/simd-intrinsics.c ++++ b/src/runtime/src/mono/mono/mini/simd-intrinsics.c +@@ -2138,7 +2138,9 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + return NULL; + + #if defined(TARGET_S390X) +- if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative) || (id !=SN_Xor) || (id != SN_BitwiseAnd) || (id != SN_BitwiseOr)) && arg0_type == MONO_TYPE_R4) ++ if (!mono_hwcap_s390x_has_ve1 && arg0_type == MONO_TYPE_R4) ++ return NULL; ++ if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative)) && (arg0_type == MONO_TYPE_R8)) + return NULL; + #endif + +@@ -2147,7 +2149,6 @@ emit_sri_vector (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsi + return NULL; + #endif + +- + return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id); + } + case SN_Divide: { +@@ -3849,7 +3850,7 @@ emit_sri_vector_t (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + return NULL; + arg0_type = fsig->param_count > 0 ? get_underlying_type (fsig->params [0]) : MONO_TYPE_VOID; + #ifdef TARGET_S390X +- if (!mono_hwcap_s390x_has_ve1 && ((id !=SN_op_ExclusiveOr) || (id != SN_op_BitwiseAnd) || (id != SN_op_BitwiseOr)) && arg0_type == MONO_TYPE_R4) ++ if (!mono_hwcap_s390x_has_ve1 && arg0_type == MONO_TYPE_R4) + return NULL; + #endif + return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, arg0_type, id); +@@ -3968,6 +3969,11 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + return NULL; + #endif + ++#ifdef TARGET_S390X ++ if (!mono_hwcap_s390x_has_ve1) ++ return NULL; ++#endif ++ + if (!(cfg->opt & MONO_OPT_SIMD)) + return NULL; + +@@ -4218,18 +4224,10 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + #ifndef TARGET_ARM64 + if ((id == SN_Max) || (id == SN_Min)) + return NULL; +-#endif +-#ifdef TARGET_S390X +- if (!mono_hwcap_s390x_has_ve1 && ((id == SN_Max) || (id == SN_Min) || (id == SN_MaxNative) || (id == SN_MinNative))) +- return NULL; + #endif + return emit_simd_ins_for_binary_op (cfg, klass, fsig, args, MONO_TYPE_R4, id); + } + case SN_Dot: { +-#ifdef TARGET_S390X +- if (!mono_hwcap_s390x_has_ve1) +- return NULL; +-#endif + return emit_dot (cfg, klass, fsig->params [0], MONO_TYPE_R4, args [0]->dreg, args [1]->dreg); + } + case SN_Negate: +@@ -4248,10 +4246,6 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + return emit_simd_ins_for_sig (cfg, cmethod->klass, OP_XOP_OVR_X_X, INTRINS_AARCH64_ADV_SIMD_FABS, MONO_TYPE_R4, fsig, args); + #endif + } +-#ifdef TARGET_S390X +- if (!mono_hwcap_s390x_has_ve1) +- return NULL; +-#endif + // MAX(x,0-x) + MonoInst *zero = emit_xzero (cfg, klass); + MonoInst *neg = emit_simd_ins (cfg, klass, OP_XBINOP, zero->dreg, args [0]->dreg); +@@ -4265,20 +4259,12 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + case SN_op_Equality: { + if (!(fsig->param_count == 2 && mono_metadata_type_equal (fsig->params [0], type) && mono_metadata_type_equal (fsig->params [1], type))) + return NULL; +-#ifdef TARGET_S390X +- if (!mono_hwcap_s390x_has_ve1) +- return NULL; +-#endif + MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]); + return emit_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]); + } + case SN_op_Inequality: { + if (!(fsig->param_count == 2 && mono_metadata_type_equal (fsig->params [0], type) && mono_metadata_type_equal (fsig->params [1], type))) + return NULL; +-#ifdef TARGET_S390X +- if (!mono_hwcap_s390x_has_ve1) +- return NULL; +-#endif + MonoClass *arg_class = mono_class_from_mono_type_internal (fsig->params [0]); + return emit_not_xequal (cfg, arg_class, MONO_TYPE_R4, args [0], args [1]); + } +@@ -4290,8 +4276,6 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + ins->inst_c0 = (IntrinsicId)INTRINS_SIMD_SQRT_R4; + return ins; + #elif defined(TARGET_S390X) +- if (!mono_hwcap_s390x_has_ve1) +- return NULL; + ins = emit_simd_ins (cfg, klass, OP_S390_VFSQSB, args [0]->dreg, -1); + return ins; + #else +@@ -4308,10 +4292,6 @@ emit_vector_2_3_4 (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *f + if (id == SN_Clamp) + return NULL; + #endif +-#ifdef TARGET_S390X +- if (!mono_hwcap_s390x_has_ve1) +- return NULL; +-#endif + + MonoInst *max = emit_simd_ins (cfg, klass, OP_XBINOP, args[0]->dreg, args[1]->dreg); + max->inst_c0 = OP_FMAX; diff --git a/SOURCES/runtime-disable-fortify-on-ilasm-parser.patch b/SOURCES/runtime-disable-fortify-on-ilasm-parser.patch new file mode 100644 index 0000000..a128222 --- /dev/null +++ b/SOURCES/runtime-disable-fortify-on-ilasm-parser.patch @@ -0,0 +1,12 @@ +diff --git dotnet/src/runtime/src/coreclr/ilasm/CMakeLists.txt dotnet/src/runtime/src/coreclr/ilasm/CMakeLists.txt +index cca2c6da185..d31e6cb2070 100644 +--- dotnet/src/runtime/src/coreclr/ilasm/CMakeLists.txt ++++ dotnet/src/runtime/src/coreclr/ilasm/CMakeLists.txt +@@ -52,6 +52,7 @@ if(CLR_CMAKE_HOST_UNIX) + add_compile_options(-Wno-array-bounds) + add_compile_options(-Wno-unused-label) + set_source_files_properties( prebuilt/asmparse.cpp PROPERTIES COMPILE_FLAGS "-O0" ) ++ set_source_files_properties( prebuilt/asmparse.cpp PROPERTIES COMPILE_FLAGS "-Wp,-U_FORTIFY_SOURCE,-D_FORTIFY_SOURCE=0" ) + endif(CLR_CMAKE_HOST_UNIX) + + if(CLR_CMAKE_HOST_LINUX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS OR CLR_CMAKE_HOST_HAIKU) diff --git a/SOURCES/runtime-openssl-sha1.patch b/SOURCES/runtime-openssl-sha1.patch new file mode 100644 index 0000000..6e307ef --- /dev/null +++ b/SOURCES/runtime-openssl-sha1.patch @@ -0,0 +1,34 @@ +From d7805229ffe6906cd0832c0482b963caf4b4fd82 Mon Sep 17 00:00:00 2001 +From: Tom Deseyn +Date: Wed, 28 Feb 2024 14:08:15 +0100 +Subject: [PATCH] Allow certificate validation with SHA-1 signatures. + +RHEL OpenSSL builds disable SHA-1 signatures. This causes certificate +validation to fail when using the X509_V_FLAG_CHECK_SS_SIGNATURE flag +with a chain where the last certificate uses a SHA-1 signature. + +This removes X509_V_FLAG_CHECK_SS_SIGNATURE flag to have the default +OpenSSL behavior for certificate validation. +--- + .../libs/System.Security.Cryptography.Native/pal_x509.c | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/src/runtime/src/native/libs/System.Security.Cryptography.Native/pal_x509.c b/src/runtime/src/native/libs/System.Security.Cryptography.Native/pal_x509.c +index 04c6ba06cd..2cd3413dae 100644 +--- a/src/runtime/src/native/libs/System.Security.Cryptography.Native/pal_x509.c ++++ b/src/runtime/src/native/libs/System.Security.Cryptography.Native/pal_x509.c +@@ -272,11 +272,6 @@ int32_t CryptoNative_X509StoreCtxInit(X509_STORE_CTX* ctx, X509_STORE* store, X5 + + int32_t val = X509_STORE_CTX_init(ctx, store, x509, extraStore); + +- if (val != 0) +- { +- X509_STORE_CTX_set_flags(ctx, X509_V_FLAG_CHECK_SS_SIGNATURE); +- } +- + return val; + } + +-- +2.43.2 + diff --git a/SOURCES/runtime-re-enable-implicit-rejection.patch b/SOURCES/runtime-re-enable-implicit-rejection.patch new file mode 100644 index 0000000..a2e5614 --- /dev/null +++ b/SOURCES/runtime-re-enable-implicit-rejection.patch @@ -0,0 +1,142 @@ +From 5fdc289903bd3a77d455583650b00297da0cae8f Mon Sep 17 00:00:00 2001 +From: Omair Majid +Date: Fri, 2 Feb 2024 15:51:23 -0500 +Subject: [PATCH] Revert "Disable implicit rejection for RSA PKCS#1 (#95216)" + +This reverts commit a5fc8ff9b03ffb2fdb81dad524ad1a20a0714995. + +To quote Clemens Lang: + +> [Disabling implcit rejection] re-enables a Bleichenbacher timing oracle +> attack against PKCS#1v1.5 decryption. See +> https://people.redhat.com/~hkario/marvin/ for details and +> https://github.com/dotnet/runtime/pull/95157#issuecomment-1842784399 for a +> comment by the researcher who published the vulnerability and proposed the +> change in OpenSSL. + +For more details, see: +https://github.com/dotnet/runtime/pull/95216#issuecomment-1842799314 +--- + .../RSA/EncryptDecrypt.cs | 49 ++++--------------- + .../opensslshim.h | 6 --- + .../pal_evp_pkey_rsa.c | 13 ----- + 3 files changed, 10 insertions(+), 58 deletions(-) + +diff --git a/src/runtime/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/EncryptDecrypt.cs b/src/runtime/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/EncryptDecrypt.cs +index 39f3ebc82ec..5b97f468a42 100644 +--- a/src/runtime/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/EncryptDecrypt.cs ++++ b/src/runtime/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/EncryptDecrypt.cs +@@ -353,10 +353,19 @@ private void RsaCryptRoundtrip(RSAEncryptionPadding paddingMode, bool expectSucc + Assert.Equal(TestData.HelloBytes, output); + } + +- [ConditionalFact(nameof(PlatformSupportsEmptyRSAEncryption))] ++ [ConditionalFact] + [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)] + public void RoundtripEmptyArray() + { ++ if (OperatingSystem.IsIOS() && !OperatingSystem.IsIOSVersionAtLeast(13, 6)) ++ { ++ throw new SkipTestException("iOS prior to 13.6 does not reliably support RSA encryption of empty data."); ++ } ++ if (OperatingSystem.IsTvOS() && !OperatingSystem.IsTvOSVersionAtLeast(14, 0)) ++ { ++ throw new SkipTestException("tvOS prior to 14.0 does not reliably support RSA encryption of empty data."); ++ } ++ + using (RSA rsa = RSAFactory.Create(TestData.RSA2048Params)) + { + void RoundtripEmpty(RSAEncryptionPadding paddingMode) +@@ -757,23 +746,5 @@ public static IEnumerable OaepPaddingModes + } + } + } +- +- public static bool PlatformSupportsEmptyRSAEncryption +- { +- get +- { +- if (OperatingSystem.IsIOS() && !OperatingSystem.IsIOSVersionAtLeast(13, 6)) +- { +- return false; +- } +- +- if (OperatingSystem.IsTvOS() && !OperatingSystem.IsTvOSVersionAtLeast(14, 0)) +- { +- return false; +- } +- +- return true; +- } +- } + } + } +diff --git a/src/runtime/src/native/libs/System.Security.Cryptography.Native/opensslshim.h b/src/runtime/src/native/libs/System.Security.Cryptography.Native/opensslshim.h +index 0748e305d5c..cf10d2f7949 100644 +--- a/src/runtime/src/native/libs/System.Security.Cryptography.Native/opensslshim.h ++++ b/src/runtime/src/native/libs/System.Security.Cryptography.Native/opensslshim.h +@@ -296,10 +296,8 @@ int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *md, size_t len); + REQUIRED_FUNCTION(ERR_peek_error) \ + REQUIRED_FUNCTION(ERR_peek_error_line) \ + REQUIRED_FUNCTION(ERR_peek_last_error) \ +- REQUIRED_FUNCTION(ERR_pop_to_mark) \ + FALLBACK_FUNCTION(ERR_put_error) \ + REQUIRED_FUNCTION(ERR_reason_error_string) \ +- REQUIRED_FUNCTION(ERR_set_mark) \ + LIGHTUP_FUNCTION(ERR_set_debug) \ + LIGHTUP_FUNCTION(ERR_set_error) \ + REQUIRED_FUNCTION(EVP_aes_128_cbc) \ +@@ -355,7 +353,6 @@ int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *md, size_t len); + REQUIRED_FUNCTION(EVP_PKCS82PKEY) \ + REQUIRED_FUNCTION(EVP_PKEY2PKCS8) \ + REQUIRED_FUNCTION(EVP_PKEY_CTX_ctrl) \ +- REQUIRED_FUNCTION(EVP_PKEY_CTX_ctrl_str) \ + REQUIRED_FUNCTION(EVP_PKEY_CTX_free) \ + REQUIRED_FUNCTION(EVP_PKEY_CTX_get0_pkey) \ + REQUIRED_FUNCTION(EVP_PKEY_CTX_new) \ +@@ -797,10 +794,8 @@ FOR_ALL_OPENSSL_FUNCTIONS + #define ERR_peek_error_line ERR_peek_error_line_ptr + #define ERR_peek_last_error ERR_peek_last_error_ptr + #define ERR_put_error ERR_put_error_ptr +-#define ERR_pop_to_mark ERR_pop_to_mark_ptr + #define ERR_reason_error_string ERR_reason_error_string_ptr + #define ERR_set_debug ERR_set_debug_ptr +-#define ERR_set_mark ERR_set_mark_ptr + #define ERR_set_error ERR_set_error_ptr + #define EVP_aes_128_cbc EVP_aes_128_cbc_ptr + #define EVP_aes_128_cfb8 EVP_aes_128_cfb8_ptr +@@ -855,7 +850,6 @@ FOR_ALL_OPENSSL_FUNCTIONS + #define EVP_PKCS82PKEY EVP_PKCS82PKEY_ptr + #define EVP_PKEY2PKCS8 EVP_PKEY2PKCS8_ptr + #define EVP_PKEY_CTX_ctrl EVP_PKEY_CTX_ctrl_ptr +-#define EVP_PKEY_CTX_ctrl_str EVP_PKEY_CTX_ctrl_str_ptr + #define EVP_PKEY_CTX_free EVP_PKEY_CTX_free_ptr + #define EVP_PKEY_CTX_get0_pkey EVP_PKEY_CTX_get0_pkey_ptr + #define EVP_PKEY_CTX_new EVP_PKEY_CTX_new_ptr +diff --git a/src/runtime/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_rsa.c b/src/runtime/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_rsa.c +index 043bf9f9d1e..c9ccdf33e3a 100644 +--- a/src/runtime/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_rsa.c ++++ b/src/runtime/src/native/libs/System.Security.Cryptography.Native/pal_evp_pkey_rsa.c +@@ -67,19 +67,6 @@ static bool ConfigureEncryption(EVP_PKEY_CTX* ctx, RsaPaddingMode padding, const + { + return false; + } +- +- // OpenSSL 3.2 introduced a change where PKCS#1 RSA decryption does not fail for invalid padding. +- // If the padding is invalid, the decryption operation returns random data. +- // See https://github.com/openssl/openssl/pull/13817 for background. +- // Some Linux distributions backported this change to previous versions of OpenSSL. +- // Here we do a best-effort to set a flag to revert the behavior to failing if the padding is invalid. +- ERR_set_mark(); +- +- EVP_PKEY_CTX_ctrl_str(ctx, "rsa_pkcs1_implicit_rejection", "0"); +- +- // Undo any changes to the error queue that may have occured while configuring implicit rejection if the +- // current version does not support implicit rejection. +- ERR_pop_to_mark(); + } + else + { +-- +2.43.0 + diff --git a/SPECS/dotnet10.0.spec b/SPECS/dotnet10.0.spec new file mode 100644 index 0000000..6b8442f --- /dev/null +++ b/SPECS/dotnet10.0.spec @@ -0,0 +1,921 @@ +%bcond_without bootstrap + +# 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 dotnetver 10.0 + +# Only the package for the latest dotnet version should provide RPMs like +# dotnet-host +%global is_latest_dotnet 1 + +# upstream can produce releases with a different tag than the SDK version +#%%global upstream_tag v%%{runtime_version} +%global upstream_tag v10.0.100-rc.1.25451.107 +%global upstream_tag_without_v %(echo %{upstream_tag} | sed -e 's|^v||') + +%global hostfxr_version %{runtime_version} +%global runtime_version 10.0.0-rc.1.25451.107 +%global aspnetcore_runtime_version 10.0.0-rc.1.25451.107 +%global sdk_version 10.0.100-rc.1.25451.107 +%global sdk_feature_band_version %(echo %{sdk_version} | cut -d '-' -f 1 | sed -e 's|[[:digit:]][[:digit:]]$|00|') +%global templates_version %{aspnetcore_runtime_version} +#%%global templates_version %%(echo %%{runtime_version} | awk 'BEGIN { FS="."; OFS="." } {print $1, $2, $3+1 }') + +%global runtime_rpm_version 10.0.0~rc.1.25451.107 +%global aspnetcore_runtime_rpm_version 10.0.0~rc.1.25451.107 +%global sdk_rpm_version 10.0.100~rc.1.25451.107 + +%global use_bundled_brotli 0 +%global use_bundled_libunwind 1 +%global use_bundled_llvm_libunwind 1 +%global use_bundled_rapidjson 0 +%global use_bundled_zlib 0 + +%global use_lttng 0 + +%if 0%{?rhel} > 0 +%global use_bundled_rapidjson 1 +%endif + +%ifarch aarch64 +%global runtime_arch arm64 +%endif +%ifarch ppc64le +%global runtime_arch ppc64le +%endif +%ifarch s390x +%global runtime_arch s390x +%endif +%ifarch x86_64 +%global runtime_arch x64 +%endif + +%global mono_archs ppc64le s390x + +# On Fedora and RHEL > 9, ship RPM macros +%if 0%{?fedora} || 0%{?rhel} > 9 +%global include_macros 1 +%else +%global include_macros 0 +%endif + +%{!?runtime_id:%global runtime_id %(. /etc/os-release ; echo "${ID}.${VERSION_ID%%.*}")-%{runtime_arch}} + +# Define macros for OS backwards compat +%if %{undefined bash_completions_dir} +%global bash_completions_dir %{_datadir}/bash-completion/completions +%endif +%if %{undefined zsh_completions_dir} +%global zsh_completions_dir %{_datadir}/zsh/site-functions +%endif + + + +Name: dotnet%{dotnetver} +Version: %{sdk_rpm_version} +Release: 0.8%{?dist} +Summary: .NET Runtime and SDK +License: 0BSD AND Apache-2.0 AND (Apache-2.0 WITH LLVM-exception) AND APSL-2.0 AND BSD-2-Clause AND BSD-3-Clause AND BSD-4-Clause AND BSL-1.0 AND bzip2-1.0.6 AND CC0-1.0 AND CC-BY-3.0 AND CC-BY-4.0 AND CC-PDDC AND CNRI-Python AND EPL-1.0 AND GPL-2.0-only AND (GPL-2.0-only WITH GCC-exception-2.0) AND GPL-2.0-or-later AND GPL-3.0-only AND ICU AND ISC AND LGPL-2.1-only AND LGPL-2.1-or-later AND LicenseRef-Fedora-Public-Domain AND LicenseRef-ISO-8879 AND MIT AND MIT-Wu AND MS-PL AND MS-RL AND NCSA AND OFL-1.1 AND OpenSSL AND Unicode-DFS-2015 AND Unicode-DFS-2016 AND W3C-19980720 AND X11 AND Zlib + +URL: https://github.com/dotnet/ + +Source0: https://github.com/dotnet/dotnet/archive/refs/tags/%{upstream_tag}.tar.gz#/dotnet-%{upstream_tag_without_v}.tar.gz +Source1: https://github.com/dotnet/dotnet/releases/download/%{upstream_tag}/dotnet-%{upstream_tag_without_v}.tar.gz.sig +Source2: https://dotnet.microsoft.com/download/dotnet/release-key-2023.asc +Source3: https://github.com/dotnet/dotnet/releases/download/%{upstream_tag}/release.json +%if %{with bootstrap} +# The bootstrap SDK version is one listed in the global.json file of the main source archive +%global bootstrap_sdk_version 10.0.100-rc.1.25420.111 +# The source is generated on a Fedora box via: +# ./build-dotnet-bootstrap-tarball %%{upstream_tag} +Source10: dotnet-prebuilts-%{bootstrap_sdk_version}-x64.tar.gz +Source11: dotnet-prebuilts-%{bootstrap_sdk_version}-arm64.tar.gz +# To generate ppc64le and s390x archives: +# 1. Build the VMR commit in cross-build mode for the architecture +# 2. Use `build-prebuilt-archive` to create the archive from the VMR +%global bootstrap_sdk_version_ppc64le_s390x 10.0.100-rc.1.25451.107 +Source12: dotnet-prebuilts-%{bootstrap_sdk_version_ppc64le_s390x}-ppc64le.tar.gz +Source13: dotnet-prebuilts-%{bootstrap_sdk_version_ppc64le_s390x}-s390x.tar.gz +%endif + +Source100: macros.dotnet +Source101: check-debug-symbols.py +Source102: dotnet.sh.in + +# https://github.com/dotnet/runtime/pull/95216#issuecomment-1842799314 +Patch0: runtime-re-enable-implicit-rejection.patch +# We disable checking the signature of the last certificate in a chain if the certificate is supposedly self-signed. +# A side effect of not checking the self-signature of such a certificate is that disabled or unsupported message +# digests used for the signature are not treated as fatal errors. +# https://issues.redhat.com/browse/RHEL-25254 +Patch1: runtime-openssl-sha1.patch +# fix an error caused by combining Fedora's CFLAGS with how .NET builds some assembly files +Patch2: runtime-disable-fortify-on-ilasm-parser.patch +# Add SIMD fallback paths for z13 +Patch3: runtime-118376-z13-simd.patch + + +ExclusiveArch: aarch64 ppc64le s390x x86_64 + + +%if ! %{use_bundled_brotli} +BuildRequires: brotli-devel +%endif +BuildRequires: clang +BuildRequires: cmake +BuildRequires: coreutils +%if %{without bootstrap} +BuildRequires: dotnet-sdk-%{dotnetver} +BuildRequires: dotnet-sdk-%{dotnetver}-source-built-artifacts +%endif +BuildRequires: findutils +BuildRequires: git +BuildRequires: glibc-langpack-en +BuildRequires: gnupg2 +BuildRequires: hostname +BuildRequires: krb5-devel +BuildRequires: libicu-devel +%if ! %{use_bundled_libunwind} +BuildRequires: libunwind-devel +%endif +%ifnarch s390x +BuildRequires: lld +%else +# lld is not supported/available/usable on s390x +BuildRequires: binutils +%endif +# If the build ever crashes, then having lldb installed might help the +# runtime generate a backtrace for the crash +BuildRequires: lldb +BuildRequires: llvm +%if ! %{use_bundled_llvm_libunwind} +BuildRequires: llvm-libunwind-devel +%endif +%if %{use_lttng} +BuildRequires: lttng-ust-devel +%endif +BuildRequires: make +BuildRequires: openssl-devel +BuildRequires: python3 +%if ! %{use_bundled_rapidjson} +BuildRequires: rapidjson-devel +%endif +BuildRequires: tar +BuildRequires: util-linux +%if ! %{use_bundled_zlib} +BuildRequires: zlib-devel +%endif + + +# The tracing support in CoreCLR is optional. It has a run-time +# dependency on some additional libraries like lttng-ust. The runtime +# gracefully disables tracing if the dependencies are missing. +%global __requires_exclude_from ^(%{_libdir}/dotnet/.*/libcoreclrtraceptprovider\\.so)$ + +# Avoid generating provides and requires for private libraries +%global privlibs libhostfxr +%global privlibs %{privlibs}|libclrgc +%global privlibs %{privlibs}|libclrjit +%global privlibs %{privlibs}|libcoreclr +%global privlibs %{privlibs}|libcoreclrtraceptprovider +%global privlibs %{privlibs}|libhostpolicy +%global privlibs %{privlibs}|libmscordaccore +%global privlibs %{privlibs}|libmscordbi +%global privlibs %{privlibs}|libnethost +%global privlibs %{privlibs}|libSystem.Globalization.Native +%global privlibs %{privlibs}|libSystem.IO.Compression.Native +%global privlibs %{privlibs}|libSystem.Native +%global privlibs %{privlibs}|libSystem.Net.Security.Native +%global privlibs %{privlibs}|libSystem.Security.Cryptography.Native.OpenSsl +%global __provides_exclude ^(%{privlibs})\\.so +%global __requires_exclude ^(%{privlibs})\\.so + + +%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. + +# The `dotnet` package was a bit of historical mistake. Users +# shouldn't be asked to install .NET without a version because .NET +# code (source or build) is generally version specific. We have kept +# it around in older versions of RHEL and Fedora. But no reason to +# continue this mistake. +%if ( 0%{?fedora} && 0%{?fedora} < 38 ) || ( 0%{?rhel} && 0%{?rhel} < 9 ) + +%package -n dotnet + +Version: %{sdk_rpm_version} +Summary: .NET CLI tools and runtime + +Requires: dotnet-sdk-%{dotnetver}%{?_isa} >= %{sdk_rpm_version}-%{release} + +%description -n dotnet +.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. + +%endif + + +%package -n dotnet-host + +Version: %{runtime_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-%{dotnetver} + +Version: %{runtime_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} >= %{runtime_rpm_version}-%{release} + +%description -n dotnet-hostfxr-%{dotnetver} +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-%{dotnetver} + +Version: %{runtime_rpm_version} +Summary: NET %{dotnetver} runtime + +Requires: dotnet-hostfxr-%{dotnetver}%{?_isa} >= %{runtime_rpm_version}-%{release} + +# libicu is dlopen()ed +Requires: libicu%{?_isa} + +# See src/runtime/src/libraries/Native/AnyOS/brotli-version.txt +Provides: bundled(libbrotli) = 1.0.9 +%if %{use_bundled_libunwind} +# See src/runtime/src/coreclr/pal/src/libunwind/libunwind-version.txt +Provides: bundled(libunwind) = 1.5.rc1.28.g9165d2a1 +%endif + +%description -n dotnet-runtime-%{dotnetver} +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 dotnet-runtime-dbg-%{dotnetver} + +Version: %{runtime_rpm_version} +Summary: Managed debug symbols NET %{dotnetver} runtime + +Requires: dotnet-runtime-%{dotnetver}%{?_isa} = %{runtime_rpm_version}-%{release} + +%description -n dotnet-runtime-dbg-%{dotnetver} +This package contains the managed symbol (pdb) files useful to debug the +managed parts of the .NET runtime itself. + + +%package -n aspnetcore-runtime-%{dotnetver} + +Version: %{aspnetcore_runtime_rpm_version} +Summary: ASP.NET Core %{dotnetver} runtime + +Requires: dotnet-runtime-%{dotnetver}%{?_isa} = %{runtime_rpm_version}-%{release} + +%description -n aspnetcore-runtime-%{dotnetver} +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 aspnetcore-runtime-dbg-%{dotnetver} + +Version: %{aspnetcore_runtime_rpm_version} +Summary: Managed debug symbols for the ASP.NET Core %{dotnetver} runtime + +Requires: aspnetcore-runtime-%{dotnetver}%{?_isa} = %{aspnetcore_runtime_rpm_version}-%{release} + +%description -n aspnetcore-runtime-dbg-%{dotnetver} +This package contains the managed symbol (pdb) files useful to debug the +managed parts of the ASP.NET Core runtime itself. + + +%package -n dotnet-templates-%{dotnetver} + +Version: %{sdk_rpm_version} +Summary: .NET %{dotnetver} 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} >= %{runtime_rpm_version}-%{release} + +%description -n dotnet-templates-%{dotnetver} +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-%{dotnetver} + +Version: %{sdk_rpm_version} +Summary: .NET %{dotnetver} Software Development Kit + +Provides: bundled(js-jquery) + +Requires: dotnet-runtime-%{dotnetver}%{?_isa} >= %{runtime_rpm_version}-%{release} +Requires: aspnetcore-runtime-%{dotnetver}%{?_isa} >= %{aspnetcore_runtime_rpm_version}-%{release} + +Requires: dotnet-apphost-pack-%{dotnetver}%{?_isa} >= %{runtime_rpm_version}-%{release} +Requires: dotnet-targeting-pack-%{dotnetver}%{?_isa} >= %{runtime_rpm_version}-%{release} +Requires: aspnetcore-targeting-pack-%{dotnetver}%{?_isa} >= %{aspnetcore_runtime_rpm_version}-%{release} + +Requires: dotnet-templates-%{dotnetver}%{?_isa} >= %{sdk_rpm_version}-%{release} + +%description -n dotnet-sdk-%{dotnetver} +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. + + +%package -n dotnet-sdk-dbg-%{dotnetver} + +Version: %{sdk_rpm_version} +Summary: Managed debug symbols for the .NET %{dotnetver} Software Development Kit + +Requires: dotnet-sdk-%{dotnetver}%{?_isa} = %{sdk_rpm_version}-%{release} + +%description -n dotnet-sdk-dbg-%{dotnetver} +This package contains the managed symbol (pdb) files useful to debug the .NET +Software Development Kit (SDK) itself. + + +%package -n dotnet-sdk-aot-%{dotnetver} + +Version: %{sdk_rpm_version} +Summary: Ahead-of-Time (AOT) support for the .NET %{dotnetver} Software Development Kit + +Requires: dotnet-sdk-%{dotnetver}%{?_isa} >= %{sdk_rpm_version}-%{release} + +# When installing AOT support, also install all dependencies needed to build +# NativeAOT applications. AOT invokes `clang ... -lssl -lcrypto -lbrotlienc +# -lbrotlidec -lz ...`. +Requires: brotli-devel%{?_isa} +Requires: clang%{?_isa} +Requires: openssl-devel%{?_isa} +Requires: zlib-devel%{?_isa} + +%description -n dotnet-sdk-aot-%{dotnetver} +This package provides Ahead-of-time (AOT) compilation support for the .NET SDK. + + +%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-%{dotnetver} %{runtime_rpm_version} Microsoft.NETCore.App %{dotnetver} Microsoft.NETCore.App.Host.%{runtime_id} +%dotnet_targeting_pack dotnet-targeting-pack-%{dotnetver} %{runtime_rpm_version} Microsoft.NETCore.App.Ref %{dotnetver} Microsoft.NETCore.App.Ref +%dotnet_targeting_pack aspnetcore-targeting-pack-%{dotnetver} %{aspnetcore_runtime_rpm_version} Microsoft.AspNetCore.App %{dotnetver} Microsoft.AspNetCore.App.Ref + + +%package -n dotnet-sdk-%{dotnetver}-source-built-artifacts + +Version: %{sdk_rpm_version} +Summary: Internal package for building .NET %{dotnetver} Software Development Kit + +%description -n dotnet-sdk-%{dotnetver}-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 +%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}' + +release_json_tag=$(grep tag %{SOURCE3} | cut -d: -f2 | sed -E 's/[," ]*//g') +if [[ ${release_json_tag} != %{upstream_tag} ]]; then + echo "error: tag in release.json doesn't match tag in spec file" + exit 1 +fi + +%setup -q -n dotnet-%{upstream_tag_without_v} + +# Remove all prebuilts and binaries +rm -rf .dotnet/ +rm -rf packages/source-built +find -type f \( \ + -iname '*.bin' -or \ + -iname '*.binlog' -or \ + -iname '*.dat' -or \ + -iname '*.db' -or \ + -iname '*.dll' -or \ + -iname '*.doc' -or \ + -iname '*.docx' -or \ + -iname '*.exe' -or \ + -iname '*.mdb' -or \ + -iname '*.mod' -or \ + -iname '*.msi' -or \ + -iname '*.netmodule' -or \ + -iname '*.nupkg' -or \ + -iname '*.o' -or \ + -iname '*.obj' -or \ + -iname '*.out' -or \ + -iname '*.p7b' -or \ + -iname '*.p7s' -or \ + -iname '*.pdb' -or \ + -iname '*.pfx' -or \ + -iname '*.so' -or \ + -iname '*.tar.gz' -or \ + -iname '*.tgz' -or \ + -iname '*.tlb' -or \ + -iname '*.winmd' -or \ + -iname '*.vsix' -or \ + -iname '*.zip' \ + \) \ + -delete + +# No js/nodejs code should be getting built, and no javascript prebuilts +# packages should be present on disk or used. Delete things to make the build +# break if any Javascript is compiled/used. +find -iname package.json -delete +find -iname package-lock.json -delete +rm -rf ./src/aspnetcore/src/Components/Web.JS/dist + +%if %{without bootstrap} + +mkdir -p prereqs/packages/archive +ln -s %{_libdir}/dotnet/source-built-artifacts/Private.SourceBuilt.Artifacts.*.tar.gz prereqs/packages/archive/ + +%else + +%ifarch x86_64 +tar -x --strip-components=1 -f %{SOURCE10} -C prereqs/packages/archive/ +%endif +%ifarch aarch64 +tar -x --strip-components=1 -f %{SOURCE11} -C prereqs/packages/archive/ +%endif +%ifarch ppc64le +tar -x --strip-components=1 -f %{SOURCE12} -C prereqs/packages/archive/ +%endif +%ifarch s390x +tar -x --strip-components=1 -f %{SOURCE13} -C prereqs/packages/archive/ +%endif + +rm -rf .dotnet +mkdir -p .dotnet/ +tar xf prereqs/packages/archive/dotnet-sdk*%{runtime_arch}.tar.gz -C .dotnet/ +rm -rf prereqs/packages/archive/dotnet-sdk*.tar.gz + +%endif + +%autopatch -p1 -M 999 + +%if ! %{use_bundled_brotli} +rm -r src/runtime/src/native/external/brotli/ +%endif + +%if ! %{use_bundled_libunwind} +rm -r src/runtime/src/native/external/libunwind/ +%endif + +%if ! %{use_bundled_llvm_libunwind} +rm -r src/runtime/src/native/external/llvm-libunwind +%endif + +%if ! %{use_bundled_rapidjson} +rm -r src/runtime/src/native/external/rapidjson +%endif + +%if ! %{use_bundled_zlib} +rm -r src/runtime/src/native/external/zlib-ng +%endif + + + +%build +cat /etc/os-release + +%if %{without bootstrap} +# We need to create a copy because build scripts will mutate this +cp -a %{_libdir}/dotnet previously-built-dotnet +find previously-built-dotnet +%endif + +%if 0%{?fedora} || 0%{?rhel} >= 9 +# 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 + +# -fstack-clash-protection breaks CoreCLR +CFLAGS=$(echo $CFLAGS | sed -e 's/-fstack-clash-protection//' ) +CXXFLAGS=$(echo $CXXFLAGS | sed -e 's/-fstack-clash-protection//' ) + +%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 + +%ifarch s390x +# -march=z13 -mtune=z14 makes clang crash while compiling .NET +CFLAGS=$(echo $CFLAGS | sed -e 's/ -march=z13//') +CFLAGS=$(echo $CFLAGS | sed -e 's/ -mtune=z14//') +CXXFLAGS=$(echo $CXXFLAGS | sed -e 's/ -march=z13//') +CXXFLAGS=$(echo $CXXFLAGS | sed -e 's/ -mtune=z14//') +%endif + +# Enabling fortify-source and "-Wall -Weverything" produces new warnings from libc. Turn them off. +CFLAGS="$CFLAGS -Wno-used-but-marked-unused" +CXXFLAGS="$CXXFLAGS -Wno-used-but-marked-unused" + +export EXTRA_CFLAGS="$CFLAGS" +export EXTRA_CXXFLAGS="$CXXFLAGS" +export EXTRA_LDFLAGS="$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, unfortunately. +export COMPlus_LTTng=0 + +# Replace commas in the vendor name. Commas in msbuild properties are parsed +# differently than what we want. +vendor=$(echo "%{?dist_vendor}%{!?dist_vendor:%_host_vendor}" | sed -E 's/,/ /') + +system_libs= +%if ! %{use_bundled_brotli} + system_libs=$system_libs+brotli+ +%endif +%if ! %{use_bundled_libunwind} + system_libs=$system_libs+libunwind+ +%endif +%if ! %{use_bundled_llvm_libunwind} + system_libs=$system_libs+llvmlibunwind+ +%endif +%if ! %{use_bundled_rapidjson} + system_libs=$system_libs+rapidjson+ +%endif +%if ! %{use_bundled_zlib} + system_libs=$system_libs+zlib+ +%endif +%if ! %{use_lttng} + system_libs=$system_libs-lttng- +%endif + +%ifarch ppc64le s390x +max_attempts=3 +%else +max_attempts=1 +%endif + +function retry_until_success { + local exit_code=1 + local tries=$1 + shift + set +e + while [[ $exit_code != 0 ]] && [[ $tries != 0 ]]; do + (( tries = tries - 1 )) + "$@" + exit_code=$? + done + set -e + return $exit_code +} + + +cat >dotnet-rpm-build.sh < dotnet.sh + + + +%install +install -dm 0755 %{buildroot}%{_libdir}/dotnet +ls artifacts/assets/Release/ +mkdir -p built-sdk +tar xf artifacts/assets/Release/Sdk/%{sdk_version}/dotnet-sdk-%{sdk_version}*-%{runtime_id}.tar.gz -C %{buildroot}%{_libdir}/dotnet/ + +# Delete bundled certificates: we want to use the system store only, +# except for when we have no other choice and ca-certificates doesn't +# provide it. Currently ca-ceritificates has no support for +# timestamping certificates (timestamp.ctl). +find %{buildroot}%{_libdir}/dotnet -name 'codesignctl.pem' -delete +if [[ $(find %{buildroot}%{_libdir}/dotnet -name '*.pem' -print | wc -l) != 1 ]]; then + find %{buildroot}%{_libdir}/dotnet -name '*.pem' -print + echo "too many certificate bundles" + exit 2 +fi + +# Install managed symbols +tar xf artifacts/assets/Release/dotnet-symbols-sdk-%{sdk_version}*-%{runtime_id}.tar.gz \ + -C %{buildroot}%{_libdir}/dotnet/ +find %{buildroot}%{_libdir}/dotnet/packs -iname '*.pdb' -delete + +# Fix executable permissions on files +find %{buildroot}%{_libdir}/dotnet/ -type f -name 'apphost' -exec chmod +x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name 'ilc' -exec chmod +x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name 'singlefilehost' -exec chmod +x {} \; +find %{buildroot}%{_libdir}/dotnet/ -type f -name '*.sh' -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 '*.o' -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 {} \; + +%if %{is_latest_dotnet} +install -dm 0755 %{buildroot}%{_sysconfdir}/profile.d/ +install dotnet.sh %{buildroot}%{_sysconfdir}/profile.d/ + +# Install dynamic completions +install -dm 0755 %{buildroot}/%{bash_completions_dir} +install src/sdk/scripts/register-completions.bash %{buildroot}/%{bash_completions_dir}/dotnet +install -dm 755 %{buildroot}/%{zsh_completions_dir} +install src/sdk/scripts/register-completions.zsh %{buildroot}/%{zsh_completions_dir}/_dotnet + +install -dm 0755 %{buildroot}%{_bindir} +ln -s ../../%{_libdir}/dotnet/dotnet %{buildroot}%{_bindir}/ +ln -s ../../%{_libdir}/dotnet/dnx %{buildroot}%{_bindir}/ + +for section in 1 7; do + install -dm 0755 %{buildroot}%{_mandir}/man${section}/ + find -iname 'dotnet*'.${section} -type f -exec cp {} %{buildroot}%{_mandir}/man${section}/ \; +done + +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/ +%endif + +install -dm 0755 %{buildroot}%{_libdir}/dotnet/source-built-artifacts +install -m 0644 artifacts/assets/Release/Private.SourceBuilt.Artifacts.*.tar.gz %{buildroot}/%{_libdir}/dotnet/source-built-artifacts/ + + +# Quick and dirty check for https://github.com/dotnet/source-build/issues/2731 +test -f %{buildroot}%{_libdir}/dotnet/sdk/%{sdk_version}*/Sdks/Microsoft.NET.Sdk/Sdk/Sdk.props + +# 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. +echo "Testing build results for debug symbols..." +%{SOURCE101} -v %{buildroot}%{_libdir}/dotnet/ + +%if %{include_macros} +install -dm 0755 %{buildroot}%{_rpmmacrodir}/ +install -m 0644 %{SOURCE100} %{buildroot}%{_rpmmacrodir}/ +%endif + +find %{buildroot}%{_libdir}/dotnet/shared/Microsoft.NETCore.App -type f -and -not -name '*.pdb' | sed -E 's|%{buildroot}||' > dotnet-runtime-non-dbg-files +find %{buildroot}%{_libdir}/dotnet/shared/Microsoft.NETCore.App -type f -name '*.pdb' | sed -E 's|%{buildroot}||' > dotnet-runtime-dbg-files +find %{buildroot}%{_libdir}/dotnet/shared/Microsoft.AspNetCore.App -type f -and -not -name '*.pdb' | sed -E 's|%{buildroot}||' > aspnetcore-runtime-non-dbg-files +find %{buildroot}%{_libdir}/dotnet/shared/Microsoft.AspNetCore.App -type f -name '*.pdb' | sed -E 's|%{buildroot}||' > aspnetcore-runtime-dbg-files +find %{buildroot}%{_libdir}/dotnet/sdk -type d | tail -n +2 | sed -E 's|%{buildroot}||' | sed -E 's|^|%dir |' > dotnet-sdk-non-dbg-files +find %{buildroot}%{_libdir}/dotnet/sdk -type f -and -not -name '*.pdb' | sed -E 's|%{buildroot}||' >> dotnet-sdk-non-dbg-files +find %{buildroot}%{_libdir}/dotnet/sdk -type f -name '*.pdb' | sed -E 's|%{buildroot}||' > dotnet-sdk-dbg-files + +%if %{is_latest_dotnet} == 0 +# If this is an older version, self-test now, before we delete files. After we +# delete files, we will not have everything we need to self-test in %%check. +%{buildroot}%{_libdir}/dotnet/dotnet --info +%{buildroot}%{_libdir}/dotnet/dotnet --version + +# Provided by dotnet-host from another SRPM +rm %{buildroot}%{_libdir}/dotnet/LICENSE.txt +rm %{buildroot}%{_libdir}/dotnet/ThirdPartyNotices.txt +rm %{buildroot}%{_libdir}/dotnet/dotnet +%endif + +# Removed by upstream in .NET 10 RC 2 +rm -r %{buildroot}%{_libdir}/dotnet/packs/NETStandard.Library.Ref/2.1.0 +rmdir %{buildroot}%{_libdir}/dotnet/packs/NETStandard.Library.Ref + + + +%check +%if 0%{?fedora} > 35 +# lttng in Fedora > 35 is incompatible with .NET +export COMPlus_LTTng=0 +%endif + +%if %{is_latest_dotnet} +%{buildroot}%{_libdir}/dotnet/dotnet --info +%{buildroot}%{_libdir}/dotnet/dotnet --version +%endif + + + +%if ( 0%{?fedora} && 0%{?fedora} < 38 ) || ( 0%{?rhel} && 0%{?rhel} < 9 ) +%files -n dotnet +# empty package useful for dependencies +%endif + +%if %{is_latest_dotnet} +%files -n dotnet-host +%dir %{_libdir}/dotnet +%{_libdir}/dotnet/dotnet +%{_libdir}/dotnet/dnx +%dir %{_libdir}/dotnet/host +%dir %{_libdir}/dotnet/host/fxr +%{_bindir}/dotnet +%{_bindir}/dnx +%license %{_libdir}/dotnet/LICENSE.txt +%license %{_libdir}/dotnet/ThirdPartyNotices.txt +%doc %{_mandir}/man1/dotnet*.1.* +%doc %{_mandir}/man7/dotnet*.7.* +%config(noreplace) %{_sysconfdir}/profile.d/dotnet.sh +%config(noreplace) %{_sysconfdir}/dotnet +%dir %{_datadir}/bash-completion +%dir %{bash_completions_dir} +%{_datadir}/bash-completion/completions/dotnet +%dir %{_datadir}/zsh +%dir %{zsh_completions_dir} +%{_datadir}/zsh/site-functions/_dotnet +%if %{include_macros} +%{_rpmmacrodir}/macros.dotnet +%endif +%endif + +%files -n dotnet-hostfxr-%{dotnetver} +%dir %{_libdir}/dotnet/host/fxr +%{_libdir}/dotnet/host/fxr/%{hostfxr_version}* + +%files -n dotnet-runtime-%{dotnetver} -f dotnet-runtime-non-dbg-files +%dir %{_libdir}/dotnet/shared +%dir %{_libdir}/dotnet/shared/Microsoft.NETCore.App +%dir %{_libdir}/dotnet/shared/Microsoft.NETCore.App/%{runtime_version}* + +%files -n dotnet-runtime-dbg-%{dotnetver} -f dotnet-runtime-dbg-files + +%files -n aspnetcore-runtime-%{dotnetver} -f aspnetcore-runtime-non-dbg-files +%dir %{_libdir}/dotnet/shared +%dir %{_libdir}/dotnet/shared/Microsoft.AspNetCore.App +%dir %{_libdir}/dotnet/shared/Microsoft.AspNetCore.App/%{aspnetcore_runtime_version}* + +%files -n aspnetcore-runtime-dbg-%{dotnetver} -f aspnetcore-runtime-dbg-files + +%files -n dotnet-templates-%{dotnetver} +%dir %{_libdir}/dotnet/templates +%{_libdir}/dotnet/templates/%{templates_version}* + +%files -n dotnet-sdk-%{dotnetver} -f dotnet-sdk-non-dbg-files +%dir %{_libdir}/dotnet/sdk +%dir %{_libdir}/dotnet/sdk-manifests +%{_libdir}/dotnet/sdk-manifests/%{sdk_feature_band_version}* +%{_libdir}/dotnet/metadata +%ifnarch %{mono_archs} +%{_libdir}/dotnet/library-packs +%endif +%dir %{_libdir}/dotnet/packs +%dir %{_libdir}/dotnet/packs/Microsoft.AspNetCore.App.Runtime.%{runtime_id} +%{_libdir}/dotnet/packs/Microsoft.AspNetCore.App.Runtime.%{runtime_id}/%{aspnetcore_runtime_version}* +%dir %{_libdir}/dotnet/packs/Microsoft.NETCore.App.Runtime.%{runtime_id} +%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Runtime.%{runtime_id}/%{runtime_version}* + +%files -n dotnet-sdk-dbg-%{dotnetver} -f dotnet-sdk-dbg-files + +%ifnarch %{mono_archs} +%files -n dotnet-sdk-aot-%{dotnetver} +%dir %{_libdir}/dotnet/packs +%dir %{_libdir}/dotnet/packs/runtime.%{runtime_id}.Microsoft.DotNet.ILCompiler/ +%{_libdir}/dotnet/packs/runtime.%{runtime_id}.Microsoft.DotNet.ILCompiler/%{runtime_version}* +%dir %{_libdir}/dotnet/packs/Microsoft.NETCore.App.Runtime.NativeAOT.%{runtime_id}/ +%{_libdir}/dotnet/packs/Microsoft.NETCore.App.Runtime.NativeAOT.%{runtime_id}/%{runtime_version}* +%endif + +%files -n dotnet-sdk-%{dotnetver}-source-built-artifacts +%dir %{_libdir}/dotnet +%{_libdir}/dotnet/source-built-artifacts + + + +%changelog +* Sun Sep 14 2025 Omair Majid - 10.0.100~preview.6.25358.103-0.8 +- Update to .NET 10 RC 1 +- Resolves: RHEL-114568 + +* Thu Sep 04 2025 Omair Majid - 10.0.100~preview.6.25358.103-0.7 +- Drop netstandard-targeting-pack-2.1, it's being removed by upstream in RC 1 +- Related: RHEL-98673 + +* Wed Aug 06 2025 Omair Majid - 10.0.100~preview.6.25358.103-0.6 +- Disable bootstrap +- Resolves: RHEL-98673 + +* Fri Aug 01 2025 Omair Majid - 10.0.100~preview.6.25358.103-0.5 +- Initial commit on c9s +- Resolves: RHEL-98673