diff --git a/Directory.Build.props b/Directory.Build.props index ef11d8d95d177f..4d3e8a8408abfe 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -471,4 +471,11 @@ $(RepositoryEngineeringDir)NoTargetsSdk.BeforeTargets.targets $(RepositoryEngineeringDir)TraversalSdk.AfterTargets.targets + + + + $([MSBuild]::NormalizePath('$(ArtifactsBinDir)', 'Microsoft.NETCore.Platforms', 'runtime.json')) + $([MSBuild]::NormalizePath('$(LibrariesProjectRoot)', 'Microsoft.NETCore.Platforms', 'src', 'runtime.json')) + + diff --git a/Directory.Build.targets b/Directory.Build.targets index 71e6f4f13b32fd..c4c006eb266d53 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -217,4 +217,5 @@ Runtime/$(SharedFrameworkNugetVersion)/ + diff --git a/eng/AvoidRestoreCycleOnSelfReference.targets b/eng/AvoidRestoreCycleOnSelfReference.targets deleted file mode 100644 index cb665cb070d988..00000000000000 --- a/eng/AvoidRestoreCycleOnSelfReference.targets +++ /dev/null @@ -1,14 +0,0 @@ - - - - <_PackageIdTemp>$(PackageId) - $(PackageId)_temp - - - - - $(_PackageIdTemp) - - - \ No newline at end of file diff --git a/eng/CodeAnalysis.src.globalconfig b/eng/CodeAnalysis.src.globalconfig index 26c9d2e8cf74e8..d06bf337e234c7 100644 --- a/eng/CodeAnalysis.src.globalconfig +++ b/eng/CodeAnalysis.src.globalconfig @@ -489,6 +489,9 @@ dotnet_diagnostic.CA1868.severity = warning # CA1869: Cache and reuse 'JsonSerializerOptions' instances dotnet_diagnostic.CA1869.severity = warning +# CA1870: Use a cached 'SearchValues' instance +dotnet_diagnostic.CA1870.severity = warning + # CA2000: Dispose objects before losing scope dotnet_diagnostic.CA2000.severity = none diff --git a/eng/CodeAnalysis.test.globalconfig b/eng/CodeAnalysis.test.globalconfig index 0a50a68d677b0d..76afd46a0b7b53 100644 --- a/eng/CodeAnalysis.test.globalconfig +++ b/eng/CodeAnalysis.test.globalconfig @@ -486,6 +486,9 @@ dotnet_diagnostic.CA1868.severity = none # CA1869: Cache and reuse 'JsonSerializerOptions' instances dotnet_diagnostic.CA1869.severity = none +# CA1870: Use a cached 'SearchValues' instance +dotnet_diagnostic.CA1870.severity = none + # CA2000: Dispose objects before losing scope dotnet_diagnostic.CA2000.severity = none diff --git a/eng/SourceBuildPrebuiltBaseline.xml b/eng/SourceBuildPrebuiltBaseline.xml index 06c1cda1782572..0f3958675010e8 100644 --- a/eng/SourceBuildPrebuiltBaseline.xml +++ b/eng/SourceBuildPrebuiltBaseline.xml @@ -19,6 +19,11 @@ + + + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index ceb58d0764fb54..68a296dc447a80 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -85,24 +85,24 @@ 02fe27cd6a9b001c8feb7938e6ef4b3799745759b - + https://github.com/dotnet/cecil - a112f15aa032c029b7d9c77df3427111d93cf407 + 89be445dd4936157533ad96bafb95f701430653a - + https://github.com/dotnet/emsdk - 7da45c33d57a762de5756f2c090e84327dae143f + bebe955e9f7d392fbca594b1c76c54ba2e27027e - + https://github.com/dotnet/source-build-reference-packages - 18302345498a62222dd3c236b3d1d140dbaed43d + b88b567fbf54c5404d039b80cfb86f09a681f604 - + https://github.com/dotnet/source-build-externals - de4dda48d0cf31e13182bc24107b2246c61ed483 + e9d6489787a5ea5400a31dfa34aa6ad6b590de9b @@ -293,34 +293,34 @@ https://github.com/dotnet/llvm-project dc18ea8f36885b70da5e7853aa6b5278ce8d0de4 - + https://github.com/dotnet/runtime - de0ab156194eb64deae0e1018db9a58f7b02f4a3 + ebe6f541ca2adea41f4b1dfc97774af371654bab - + https://github.com/dotnet/runtime - de0ab156194eb64deae0e1018db9a58f7b02f4a3 + ebe6f541ca2adea41f4b1dfc97774af371654bab - + https://github.com/dotnet/runtime - de0ab156194eb64deae0e1018db9a58f7b02f4a3 + ebe6f541ca2adea41f4b1dfc97774af371654bab - + https://github.com/dotnet/runtime - de0ab156194eb64deae0e1018db9a58f7b02f4a3 + ebe6f541ca2adea41f4b1dfc97774af371654bab - + https://github.com/dotnet/runtime - de0ab156194eb64deae0e1018db9a58f7b02f4a3 + ebe6f541ca2adea41f4b1dfc97774af371654bab - + https://github.com/dotnet/runtime - de0ab156194eb64deae0e1018db9a58f7b02f4a3 + ebe6f541ca2adea41f4b1dfc97774af371654bab - + https://github.com/dotnet/runtime - de0ab156194eb64deae0e1018db9a58f7b02f4a3 + ebe6f541ca2adea41f4b1dfc97774af371654bab https://github.com/dotnet/xharness @@ -354,9 +354,9 @@ https://dev.azure.com/dnceng/internal/_git/dotnet-optimization 5b0a8abbba75c63e20e42f778650dd1448aef62c - + https://github.com/dotnet/hotreload-utils - 4b29cfaccdab45442e15f3b84f75bc9c10ee79b3 + 821048c1587d0384826230cdddf292570b8e430f https://github.com/dotnet/runtime-assets @@ -383,9 +383,9 @@ https://github.com/dotnet/roslyn-analyzers 837c22a23433f441fa56d96eb45d13c65408f7c3 - + https://github.com/dotnet/sdk - f8a9e2866134d9d04805da55fcb3984c8b94e008 + 4bc3b410401010fb7844fee0479f9b12f52500b3 @@ -402,9 +402,9 @@ https://github.com/NuGet/NuGet.Client 8fef55f5a55a3b4f2c96cd1a9b5ddc51d4b927f8 - + https://github.com/dotnet/installer - d5bf1c464514e4fa44477a872a3f687bc337ea5a + 1f0982b7f469aa0d693d1ad6744a7fde5263ef1b diff --git a/eng/Versions.props b/eng/Versions.props index e451955a185e0f..f70c21cf3ca6c7 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -80,7 +80,7 @@ 0.2.0 - 9.0.100-alpha.1.23465.4 + 9.0.100-alpha.1.23468.31 8.0.0-beta.23463.1 8.0.0-beta.23463.1 @@ -101,10 +101,10 @@ 6.0.0-preview.1.102 - 9.0.0-alpha.1.23460.2 + 9.0.0-alpha.1.23466.6 6.0.0 - 9.0.0-alpha.1.23460.2 + 9.0.0-alpha.1.23466.6 8.0.0-preview.7.23325.2 16.0.5-alpha.1.23452.1 16.0.5-alpha.1.23452.1 @@ -132,12 +132,12 @@ 5.0.0 5.0.0 7.0.0 - 9.0.0-alpha.1.23460.2 + 9.0.0-alpha.1.23466.6 6.0.0 7.0.0 4.5.4 4.5.0 - 9.0.0-alpha.1.23460.2 + 9.0.0-alpha.1.23466.6 8.0.0-beta.23456.1 8.0.0-beta.23456.1 @@ -189,7 +189,7 @@ 3.12.0 4.1.0 6.0.0 - 13.0.1 + 13.0.3 1.0.2 2.0.4 4.18.4 @@ -205,13 +205,13 @@ 2.45.0 1.1.2-beta1.23323.1 - 8.0.0-preview-20230828.1 + 8.0.0-preview-20230918.1 - 9.0.0-alpha.1.23460.2 + 9.0.0-alpha.1.23466.6 - 0.11.4-alpha.23461.1 + 0.11.4-alpha.23468.2 - 9.0.0-alpha.1.23460.2 + 9.0.0-alpha.1.23466.6 9.0.0-alpha.1.23454.1 @@ -236,7 +236,7 @@ Note: when the name is updated, make sure to update dependency name in eng/pipelines/common/xplat-setup.yml like - DarcDependenciesChanged.Microsoft_NET_Workload_Emscripten_Current_Manifest-8_0_100_Transport --> - 9.0.0-alpha.1.23457.3 + 9.0.0-alpha.1.23465.3 $(MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion) 1.1.87-gba258badda @@ -254,7 +254,7 @@ 3.1.7 1.0.406601 - 9.0.100-alpha.1.23464.17 + 9.0.100-alpha.1.23469.3 $(MicrosoftDotnetSdkInternalVersion) diff --git a/global.json b/global.json index 7ef231a50456d0..d9233ff3dc9fd9 100644 --- a/global.json +++ b/global.json @@ -13,6 +13,6 @@ "Microsoft.DotNet.SharedFramework.Sdk": "8.0.0-beta.23463.1", "Microsoft.Build.NoTargets": "3.7.0", "Microsoft.Build.Traversal": "3.4.0", - "Microsoft.NET.Sdk.IL": "9.0.0-alpha.1.23460.2" + "Microsoft.NET.Sdk.IL": "9.0.0-alpha.1.23466.6" } } diff --git a/src/coreclr/jit/emitxarch.cpp b/src/coreclr/jit/emitxarch.cpp index ba599c9e465ad0..65789413500cd3 100644 --- a/src/coreclr/jit/emitxarch.cpp +++ b/src/coreclr/jit/emitxarch.cpp @@ -5485,6 +5485,13 @@ void emitter::emitInsRMW(instruction ins, emitAttr attr, GenTreeStoreInd* storeI { assert(!src->isContained()); // there must be one non-contained src + if (addr->isContained() && addr->OperIs(GT_LCL_ADDR)) + { + GenTreeLclVarCommon* lclVar = addr->AsLclVarCommon(); + emitIns_S_R(ins, attr, src->GetRegNum(), lclVar->GetLclNum(), lclVar->GetLclOffs()); + return; + } + // ind, reg id = emitNewInstrAmd(attr, offset); emitHandleMemOp(storeInd, id, emitInsModeFormat(ins, IF_ARD_RRD), ins); @@ -8602,9 +8609,14 @@ void emitter::emitIns_SIMD_R_R_R_R( // SSE4.1 blendv* hardcode the mask vector (op3) in XMM0 emitIns_Mov(INS_movaps, attr, REG_XMM0, op3Reg, /* canSkip */ true); - // Ensure we aren't overwriting op2 or oop3 (which should be REG_XMM0) + // Ensure we aren't overwriting op2 or op3 (which should be REG_XMM0) assert((op2Reg != targetReg) || (op1Reg == targetReg)); - assert(targetReg != REG_XMM0); + + // If targetReg == REG_XMM0, it means that op3 was last use and we decided to + // reuse REG_XMM0 for destination i.e. targetReg. In such case, make sure + // that XMM0 value after the (op3Reg -> XMM0) move done above is not + // overwritten by op1Reg. + assert((targetReg != REG_XMM0) || (op1Reg == op3Reg)); emitIns_Mov(INS_movaps, attr, targetReg, op1Reg, /* canSkip */ true); emitIns_R_R(ins, attr, targetReg, op2Reg); diff --git a/src/coreclr/jit/gentree.cpp b/src/coreclr/jit/gentree.cpp index 239ddfaff5b297..d42175f98300ef 100644 --- a/src/coreclr/jit/gentree.cpp +++ b/src/coreclr/jit/gentree.cpp @@ -19636,8 +19636,8 @@ GenTree* Compiler::gtNewSimdBinOpNode( } else { - assert(op2->TypeIs(type, simdBaseType, genActualType(simdBaseType)) || - (op2->TypeIs(TYP_SIMD12) && type == TYP_SIMD16)); + assert((genActualType(op2) == genActualType(type)) || (genActualType(op2) == genActualType(simdBaseType)) || + (op2->TypeIs(TYP_SIMD12) && (type == TYP_SIMD16))); } NamedIntrinsic intrinsic = NI_Illegal; diff --git a/src/coreclr/jit/lower.cpp b/src/coreclr/jit/lower.cpp index 2f0055cfd37dc0..36b6c9481bb750 100644 --- a/src/coreclr/jit/lower.cpp +++ b/src/coreclr/jit/lower.cpp @@ -1558,7 +1558,7 @@ void Lowering::LowerArg(GenTreeCall* call, CallArg* callArg, bool late) // the assert below. assert((jitIntrinsic->GetSimdSize() == 12) || (jitIntrinsic->GetSimdSize() == 16) || - (jitIntrinsic->GetSimdSize() == 32)); + (jitIntrinsic->GetSimdSize() == 32) || (jitIntrinsic->GetSimdSize() == 64)); if (jitIntrinsic->GetSimdSize() == 12) { diff --git a/src/coreclr/jit/lowerxarch.cpp b/src/coreclr/jit/lowerxarch.cpp index 483370dab9f7f2..d68c3e0d2689a2 100644 --- a/src/coreclr/jit/lowerxarch.cpp +++ b/src/coreclr/jit/lowerxarch.cpp @@ -7956,6 +7956,9 @@ bool Lowering::IsContainableHWIntrinsicOp(GenTreeHWIntrinsic* parentNode, GenTre // The memory form of this already takes a pointer and should be treated like a MemoryLoad supportsGeneralLoads = !childNode->OperIsHWIntrinsic(); } + + supportsGeneralLoads = + supportsGeneralLoads && (genTypeSize(childNode) >= genTypeSize(parentNode->GetSimdBaseType())); break; } diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index 2a97fd82bb7aed..39617fb20a27d8 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -10796,8 +10796,6 @@ GenTree* Compiler::fgOptimizeHWIntrinsic(GenTreeHWIntrinsic* node) return node; } #if defined(TARGET_XARCH) - case NI_AVX512F_Add: - case NI_AVX512BW_Add: case NI_AVX512F_And: case NI_AVX512DQ_And: case NI_AVX512F_AndNot: @@ -10839,13 +10837,6 @@ GenTree* Compiler::fgOptimizeHWIntrinsic(GenTreeHWIntrinsic* node) switch (intrinsicId) { - case NI_AVX512F_Add: - case NI_AVX512BW_Add: - { - maskIntrinsicId = NI_AVX512F_AddMask; - break; - } - case NI_AVX512F_And: case NI_AVX512DQ_And: { diff --git a/src/coreclr/jit/switchrecognition.cpp b/src/coreclr/jit/switchrecognition.cpp index a31de6a97bce76..5052e6ff57411b 100644 --- a/src/coreclr/jit/switchrecognition.cpp +++ b/src/coreclr/jit/switchrecognition.cpp @@ -289,8 +289,11 @@ bool Compiler::optSwitchConvert(BasicBlock* firstBlock, int testsCount, ssize_t* maxValue = newMaxValue; } - assert(testIdx <= testsCount); - if (testIdx < SWITCH_MIN_TESTS) + // testIdx is now representing the index of last good test value, + // Update testsCount as it's now potentially smaller than initially. + testsCount = testIdx; + + if (testsCount < SWITCH_MIN_TESTS) { // Make sure we still have at least SWITCH_MIN_TESTS values after we filtered out some of them return false; @@ -304,7 +307,7 @@ bool Compiler::optSwitchConvert(BasicBlock* firstBlock, int testsCount, ssize_t* // Find the last block in the chain const BasicBlock* lastBlock = firstBlock; - for (int i = 0; i < testIdx - 1; i++) + for (int i = 0; i < testsCount - 1; i++) { lastBlock = lastBlock->bbNext; } diff --git a/src/coreclr/jit/valuenum.cpp b/src/coreclr/jit/valuenum.cpp index b4d7985cd97c56..79da0ca4601bd4 100644 --- a/src/coreclr/jit/valuenum.cpp +++ b/src/coreclr/jit/valuenum.cpp @@ -7432,6 +7432,26 @@ ValueNum ValueNumStore::EvalHWIntrinsicFunBinary(var_types type, case NI_AVX512BW_ShiftLeftLogical: #endif { +#ifdef TARGET_XARCH + if (TypeOfVN(arg1VN) == TYP_SIMD16) + { + // The xarch shift instructions support taking the shift amount as + // a simd16, in which case they take the shift amount from the lower + // 64-bits. + + uint64_t shiftAmount = GetConstantSimd16(arg1VN).u64[0]; + + if (genTypeSize(baseType) != 8) + { + arg1VN = VNForIntCon(static_cast(shiftAmount)); + } + else + { + arg1VN = VNForLongCon(static_cast(shiftAmount)); + } + } +#endif // TARGET_XARCH + return EvaluateBinarySimd(this, GT_LSH, /* scalar */ false, type, baseType, arg0VN, arg1VN); } @@ -7445,6 +7465,26 @@ ValueNum ValueNumStore::EvalHWIntrinsicFunBinary(var_types type, case NI_AVX512BW_ShiftRightArithmetic: #endif { +#ifdef TARGET_XARCH + if (TypeOfVN(arg1VN) == TYP_SIMD16) + { + // The xarch shift instructions support taking the shift amount as + // a simd16, in which case they take the shift amount from the lower + // 64-bits. + + uint64_t shiftAmount = GetConstantSimd16(arg1VN).u64[0]; + + if (genTypeSize(baseType) != 8) + { + arg1VN = VNForIntCon(static_cast(shiftAmount)); + } + else + { + arg1VN = VNForLongCon(static_cast(shiftAmount)); + } + } +#endif // TARGET_XARCH + return EvaluateBinarySimd(this, GT_RSH, /* scalar */ false, type, baseType, arg0VN, arg1VN); } @@ -7457,6 +7497,26 @@ ValueNum ValueNumStore::EvalHWIntrinsicFunBinary(var_types type, case NI_AVX512BW_ShiftRightLogical: #endif { +#ifdef TARGET_XARCH + if (TypeOfVN(arg1VN) == TYP_SIMD16) + { + // The xarch shift instructions support taking the shift amount as + // a simd16, in which case they take the shift amount from the lower + // 64-bits. + + uint64_t shiftAmount = GetConstantSimd16(arg1VN).u64[0]; + + if (genTypeSize(baseType) != 8) + { + arg1VN = VNForIntCon(static_cast(shiftAmount)); + } + else + { + arg1VN = VNForLongCon(static_cast(shiftAmount)); + } + } +#endif // TARGET_XARCH + return EvaluateBinarySimd(this, GT_RSZ, /* scalar */ false, type, baseType, arg0VN, arg1VN); } diff --git a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Publish.targets b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Publish.targets index 5b1e1e8769bdad..256b344888cc07 100644 --- a/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Publish.targets +++ b/src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Publish.targets @@ -93,7 +93,10 @@ + + diff --git a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Reflection/Runtime/General/Helpers.cs b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Reflection/Runtime/General/Helpers.cs index 354d56e6a26dee..ced17c84f44b44 100644 --- a/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Reflection/Runtime/General/Helpers.cs +++ b/src/coreclr/nativeaot/System.Private.CoreLib/src/System/Reflection/Runtime/General/Helpers.cs @@ -109,7 +109,12 @@ public static TypeLoadException CreateTypeLoadException(string typeName, string public static string EscapeTypeNameIdentifier(this string identifier) { // Some characters in a type name need to be escaped + + // We're avoiding calling into MemoryExtensions here as it has paths that lead to reflection, + // and that would lead to an infinite loop given that this is the implementation of reflection. +#pragma warning disable CA1870 // Use a cached 'SearchValues' instance if (identifier != null && identifier.IndexOfAny(s_charsToEscape) != -1) +#pragma warning restore CA1870 { StringBuilder sbEscapedName = new StringBuilder(identifier.Length); foreach (char c in identifier) diff --git a/src/libraries/Directory.Build.props b/src/libraries/Directory.Build.props index 9d6f6c385bb4dc..32fc46a35d8d7c 100644 --- a/src/libraries/Directory.Build.props +++ b/src/libraries/Directory.Build.props @@ -6,6 +6,10 @@ we only enable it in specific projects. so to avoid duplicating this property in coreclr, we can first scope it to src/libraries. This property needs to be declared before the ..\..\Directory.Build.props import. --> true + + + false diff --git a/src/libraries/Directory.Build.targets b/src/libraries/Directory.Build.targets index e8b11793d5ef6f..184155c6edce61 100644 --- a/src/libraries/Directory.Build.targets +++ b/src/libraries/Directory.Build.targets @@ -127,7 +127,6 @@ - diff --git a/src/libraries/Microsoft.Extensions.Options.DataAnnotations/src/DataAnnotationValidateOptions.cs b/src/libraries/Microsoft.Extensions.Options.DataAnnotations/src/DataAnnotationValidateOptions.cs index e8f4b606882cf9..5b734edf32738c 100644 --- a/src/libraries/Microsoft.Extensions.Options.DataAnnotations/src/DataAnnotationValidateOptions.cs +++ b/src/libraries/Microsoft.Extensions.Options.DataAnnotations/src/DataAnnotationValidateOptions.cs @@ -95,7 +95,8 @@ private static bool TryValidateOptions(object options, string qualifiedName, Lis foreach (PropertyInfo propertyInfo in options.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)) { - if (propertyInfo.GetMethod is null) + // Indexers are properties which take parameters. Ignore them. + if (propertyInfo.GetMethod is null || propertyInfo.GetMethod.GetParameters().Length > 0) { continue; } diff --git a/src/libraries/Microsoft.Extensions.Options/tests/SourceGeneration.Unit.Tests/OptionsRuntimeTests.cs b/src/libraries/Microsoft.Extensions.Options/tests/SourceGeneration.Unit.Tests/OptionsRuntimeTests.cs index b644eea74120f7..6109bccd296463 100644 --- a/src/libraries/Microsoft.Extensions.Options/tests/SourceGeneration.Unit.Tests/OptionsRuntimeTests.cs +++ b/src/libraries/Microsoft.Extensions.Options/tests/SourceGeneration.Unit.Tests/OptionsRuntimeTests.cs @@ -177,6 +177,30 @@ public void TestValidationWithEnumeration() result2.Failures); } + [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsNotBrowser))] + public void TestObjectsWithIndexerProperties() + { + DataAnnotationValidateOptions dataAnnotationValidateOptions1 = new("MyDictionaryOptions"); + MyDictionaryOptionsOptionsValidator sourceGenOptionsValidator1 = new(); + + var options1 = new MyDictionaryOptions(); + ValidateOptionsResult result1 = sourceGenOptionsValidator1.Validate("MyDictionaryOptions", options1); + ValidateOptionsResult result2 = dataAnnotationValidateOptions1.Validate("MyDictionaryOptions", options1); + + Assert.True(result1.Succeeded); + Assert.True(result2.Succeeded); + + DataAnnotationValidateOptions> dataAnnotationValidateOptions2 = new("MyListOptions"); + MyListOptionsOptionsValidator sourceGenOptionsValidator2 = new(); + + var options2 = new MyListOptions() { Prop = "test" }; + result1 = sourceGenOptionsValidator2.Validate("MyListOptions", options2); + result2 = dataAnnotationValidateOptions2.Validate("MyListOptions", options2); + + Assert.True(result1.Succeeded); + Assert.True(result2.Succeeded); + } + [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsNotBrowser))] public void TestValidationWithCyclicReferences() { @@ -302,6 +326,12 @@ public partial class MySourceGenOptionsValidator : IValidateOptions { } + public class MyDictionaryOptions : Dictionary { [Required] public string Prop { get; set; } = "test"; } + [OptionsValidator] public partial class MyDictionaryOptionsOptionsValidator : IValidateOptions { } + + public class MyListOptions : List { [Required] public T Prop { get; set; } = default; } + [OptionsValidator] public partial class MyListOptionsOptionsValidator : IValidateOptions> { } + #if NET8_0_OR_GREATER public class OptionsUsingNewAttributes { diff --git a/src/libraries/Microsoft.NETCore.Platforms/Microsoft.NETCore.Platforms.sln b/src/libraries/Microsoft.NETCore.Platforms/Microsoft.NETCore.Platforms.sln index ed8fadf41ebf97..736dbcc4b53afe 100644 --- a/src/libraries/Microsoft.NETCore.Platforms/Microsoft.NETCore.Platforms.sln +++ b/src/libraries/Microsoft.NETCore.Platforms/Microsoft.NETCore.Platforms.sln @@ -1,102 +1,24 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestUtilities", "..\Common\tests\TestUtilities\TestUtilities.csproj", "{39BCA125-321F-490F-AD4E-28DCB4406969}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.NETCore.Platforms", "src\Microsoft.NETCore.Platforms.csproj", "{BFFF96CC-06AA-4291-9F93-3E77F23DBB11}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.NETCore.Platforms.Tests", "tests\Microsoft.NETCore.Platforms.Tests.csproj", "{0C60F372-5C73-4BFA-9B91-5659C88F9750}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibraryImportGenerator", "..\System.Runtime.InteropServices\gen\LibraryImportGenerator\LibraryImportGenerator.csproj", "{45449066-3A31-43E5-B705-20D667080A23}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Interop.SourceGeneration", "..\System.Runtime.InteropServices\gen\Microsoft.Interop.SourceGeneration\Microsoft.Interop.SourceGeneration.csproj", "{2E3568B1-EC27-4F02-BC0E-71DD3FD7735B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ILLink.CodeFixProvider", "..\..\tools\illink\src\ILLink.CodeFix\ILLink.CodeFixProvider.csproj", "{BF52D0B1-1AD8-49DB-B910-9F9D7D41292A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ILLink.RoslynAnalyzer", "..\..\tools\illink\src\ILLink.RoslynAnalyzer\ILLink.RoslynAnalyzer.csproj", "{BEFED0BD-AD56-4FAC-B9A7-CCE8BB5F8768}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ILLink.Tasks", "..\..\tools\illink\src\ILLink.Tasks\ILLink.Tasks.csproj", "{41387647-9500-448C-B021-B4837947EF62}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Linker", "..\..\tools\illink\src\linker\Mono.Linker.csproj", "{281E9ED5-5F16-475D-B50B-501633FCC8C6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mono.Linker", "..\..\tools\illink\src\linker\ref\Mono.Linker.csproj", "{20346A2D-06DD-4E3E-96D4-C9BF32697AE3}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{E4827496-6F39-4CA0-8F4A-ACDE9DFEBE5C}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F96FBD24-3BB3-4D02-9884-4D90F94DD3C0}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "gen", "{E8010E1D-FDAF-481D-AA34-3B115B667E4B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gen", "tools\gen", "{2B7F6369-F9CA-493A-A105-B7B7B697A31F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "tools\src", "{A527D4DF-4D57-40AE-B63B-1945F1D4FF3F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ref", "tools\ref", "{EB2B9277-DB89-4554-8499-C3240163E875}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{0F4ABB64-2357-49FB-9BD3-8FEFC2A650E6}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {39BCA125-321F-490F-AD4E-28DCB4406969}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {39BCA125-321F-490F-AD4E-28DCB4406969}.Debug|Any CPU.Build.0 = Debug|Any CPU - {39BCA125-321F-490F-AD4E-28DCB4406969}.Release|Any CPU.ActiveCfg = Release|Any CPU - {39BCA125-321F-490F-AD4E-28DCB4406969}.Release|Any CPU.Build.0 = Release|Any CPU {BFFF96CC-06AA-4291-9F93-3E77F23DBB11}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BFFF96CC-06AA-4291-9F93-3E77F23DBB11}.Debug|Any CPU.Build.0 = Debug|Any CPU {BFFF96CC-06AA-4291-9F93-3E77F23DBB11}.Release|Any CPU.ActiveCfg = Release|Any CPU {BFFF96CC-06AA-4291-9F93-3E77F23DBB11}.Release|Any CPU.Build.0 = Release|Any CPU - {0C60F372-5C73-4BFA-9B91-5659C88F9750}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C60F372-5C73-4BFA-9B91-5659C88F9750}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C60F372-5C73-4BFA-9B91-5659C88F9750}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C60F372-5C73-4BFA-9B91-5659C88F9750}.Release|Any CPU.Build.0 = Release|Any CPU - {45449066-3A31-43E5-B705-20D667080A23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {45449066-3A31-43E5-B705-20D667080A23}.Debug|Any CPU.Build.0 = Debug|Any CPU - {45449066-3A31-43E5-B705-20D667080A23}.Release|Any CPU.ActiveCfg = Release|Any CPU - {45449066-3A31-43E5-B705-20D667080A23}.Release|Any CPU.Build.0 = Release|Any CPU - {2E3568B1-EC27-4F02-BC0E-71DD3FD7735B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2E3568B1-EC27-4F02-BC0E-71DD3FD7735B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2E3568B1-EC27-4F02-BC0E-71DD3FD7735B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2E3568B1-EC27-4F02-BC0E-71DD3FD7735B}.Release|Any CPU.Build.0 = Release|Any CPU - {BF52D0B1-1AD8-49DB-B910-9F9D7D41292A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BF52D0B1-1AD8-49DB-B910-9F9D7D41292A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BF52D0B1-1AD8-49DB-B910-9F9D7D41292A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BF52D0B1-1AD8-49DB-B910-9F9D7D41292A}.Release|Any CPU.Build.0 = Release|Any CPU - {BEFED0BD-AD56-4FAC-B9A7-CCE8BB5F8768}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEFED0BD-AD56-4FAC-B9A7-CCE8BB5F8768}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEFED0BD-AD56-4FAC-B9A7-CCE8BB5F8768}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEFED0BD-AD56-4FAC-B9A7-CCE8BB5F8768}.Release|Any CPU.Build.0 = Release|Any CPU - {41387647-9500-448C-B021-B4837947EF62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {41387647-9500-448C-B021-B4837947EF62}.Debug|Any CPU.Build.0 = Debug|Any CPU - {41387647-9500-448C-B021-B4837947EF62}.Release|Any CPU.ActiveCfg = Release|Any CPU - {41387647-9500-448C-B021-B4837947EF62}.Release|Any CPU.Build.0 = Release|Any CPU - {281E9ED5-5F16-475D-B50B-501633FCC8C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {281E9ED5-5F16-475D-B50B-501633FCC8C6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {281E9ED5-5F16-475D-B50B-501633FCC8C6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {281E9ED5-5F16-475D-B50B-501633FCC8C6}.Release|Any CPU.Build.0 = Release|Any CPU - {20346A2D-06DD-4E3E-96D4-C9BF32697AE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {20346A2D-06DD-4E3E-96D4-C9BF32697AE3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {20346A2D-06DD-4E3E-96D4-C9BF32697AE3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {20346A2D-06DD-4E3E-96D4-C9BF32697AE3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {39BCA125-321F-490F-AD4E-28DCB4406969} = {E4827496-6F39-4CA0-8F4A-ACDE9DFEBE5C} - {0C60F372-5C73-4BFA-9B91-5659C88F9750} = {E4827496-6F39-4CA0-8F4A-ACDE9DFEBE5C} {BFFF96CC-06AA-4291-9F93-3E77F23DBB11} = {F96FBD24-3BB3-4D02-9884-4D90F94DD3C0} - {45449066-3A31-43E5-B705-20D667080A23} = {E8010E1D-FDAF-481D-AA34-3B115B667E4B} - {2E3568B1-EC27-4F02-BC0E-71DD3FD7735B} = {E8010E1D-FDAF-481D-AA34-3B115B667E4B} - {BF52D0B1-1AD8-49DB-B910-9F9D7D41292A} = {2B7F6369-F9CA-493A-A105-B7B7B697A31F} - {BEFED0BD-AD56-4FAC-B9A7-CCE8BB5F8768} = {2B7F6369-F9CA-493A-A105-B7B7B697A31F} - {2B7F6369-F9CA-493A-A105-B7B7B697A31F} = {0F4ABB64-2357-49FB-9BD3-8FEFC2A650E6} - {41387647-9500-448C-B021-B4837947EF62} = {A527D4DF-4D57-40AE-B63B-1945F1D4FF3F} - {281E9ED5-5F16-475D-B50B-501633FCC8C6} = {A527D4DF-4D57-40AE-B63B-1945F1D4FF3F} - {A527D4DF-4D57-40AE-B63B-1945F1D4FF3F} = {0F4ABB64-2357-49FB-9BD3-8FEFC2A650E6} - {20346A2D-06DD-4E3E-96D4-C9BF32697AE3} = {EB2B9277-DB89-4554-8499-C3240163E875} - {EB2B9277-DB89-4554-8499-C3240163E875} = {0F4ABB64-2357-49FB-9BD3-8FEFC2A650E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E946A528-C3E7-48EC-AD6D-AE84ED2B11AC} diff --git a/src/libraries/Microsoft.NETCore.Platforms/readme.md b/src/libraries/Microsoft.NETCore.Platforms/readme.md index 6c76386f17d073..cca951daaab5fa 100644 --- a/src/libraries/Microsoft.NETCore.Platforms/readme.md +++ b/src/libraries/Microsoft.NETCore.Platforms/readme.md @@ -1,5 +1,5 @@ # Runtime IDs -The package `Microsoft.NETCore.Platforms` defines the runtime identifiers (RIDs) used by .NET packages to represent runtime-specific assets in NuGet packages. +The `Microsoft.NETCore.Platforms` transport package contains the portable and non-portable runtime identifier graph files for redistribution in the dotnet/sdk repository. ## What is a RID? A RID is an opaque string that identifies a platform. RIDs have relationships to other RIDs by "importing" the other RID. In that way a RID is a directed graph of compatible RIDs. @@ -76,80 +76,4 @@ runtimes/win/lib/netstandard1.0/foo.dll When resolving for netstandard1.5/win7-x64 will select `lib/netstandard1.5/foo.dll` for the compile asset and `runtimes/win/lib/netstandard1.0/foo.dll` for the runtime asset. ## Adding new RIDs - -### Why do I need to add a new RID? -NuGet's extensibility mechanism for platform-specific assets requires a RID be defined for any platform that needs assets specific to that platform. Unlike TFMs, which have a known relationship in NuGet (eg net4.5 is compatible with net4.0), RIDs are opaque strings which NuGet knows nothing about. The definition and relationship of RIDs comes solely from the `runtime.json` files within the root of the packages referenced by the project. -As such, whenever we want to put a new RID in a project.json in order to get assets specific for that RID we have to define the rid in some package. Typically that package is `Microsoft.NETCore.Platforms` if the RID is "official". If you'd like to prototype you can put the RID in any other package and so long as that package is referenced you can use that RID. - -### Do I really need to add a new RID? -If you're prototyping on a platform that is compatible with an existing platform then you can reuse the RID for that existing platform. New RIDs are only needed when an asset needs to be different on a particular platform. - -`Microsoft.NETCore.Platforms` attempts to define all RIDs that packages may need, and as such will define RIDs for platforms that we don't actually cross compile for. This is to support higher-level packages, 3rd party packages, that may need to cross-compile for that RID. - -### Adding a new OS -Add a new `RuntimeGroup` item in `runtimeGroups.props`. - -For example: -```xml - - linux - x86;x64;arm - 42.0;43.0 - -``` - -This will create a new RID for `myLinuxDistro` where `myLinuxDistro` should be the string used for the `ID=` value in the `/etc/os-release` file. - -Whenever modifying the `runtimeGroups.props` make sure to pack the project via the `dotnet pack` command and inspect if the generated package contains the desired changes. - -RuntimeGroup items have the following format: -- `Identity`: the base string for the RID, without version architecture, or qualifiers. -- `Parent`: the base string for the parent of this RID. This RID will be imported by the baseRID, architecture-specific, and qualifier-specific RIDs (with the latter two appending appropriate architecture and qualifiers). -- `Versions`: A list of strings delimited by semi-colons that represent the versions for this RID. -- `TreatVersionsAsCompatible`: Default is true. When true, version-specific RIDs will import the previous version-specific RID in the Versions list, with the first version importing the version-less RID. When false all version-specific RIDs will import the version-less RID (bypassing previous version-specific RIDs) -- `OmitVersionDelimiter`: Default is false. When true no characters will separate the base RID and version (EG: win7). When false a '.' will separate the base RID and version (EG: osx.10.12). -- `ApplyVersionsToParent`: Default is false. When true, version-specific RIDs will import version-specific Parent RIDs similar to is done for architecture and qualifier (see Parent above). -- `Architectures`: A list of strings delimited by semi-colons that represent the architectures for this RID. -- `AdditionalQualifiers`: A list of strings delimited by semi-colons that represent the additional qualifiers for this RID. Additional qualifers do not stack, each only applies to the qualifier-less RIDs (so as not to cause combinatorial exponential growth of RIDs). - -### Adding a new version to an existing OS -Find the existing `RuntimeGroup` in `runtimeGroups.props` and add the version to the list of `Versions`, separated by a semi-colon. - -If the version you are adding needs to be treated as not-compatible with previous versions and the `RuntimeGroup` has not set `TreatVersionsAsCompatible`=`false` then you may create a new `RuntimeGroup` to represent the new compatibility band. - -### Checking your work -After making a change to `runtimeGroups.props` you can examine the resulting changes in `runtime.json` and `runtime.compatibility.json`. - -`runtime.json` is the graph representation of the RIDs and is what ships in the package. - -`runtime.compatibility.json` is a flattened version of the graph that shows the RID precedence for each RID in the graph. - -### Version compatibility -Version compatibility is represented through imports. If a platform is considered compatible with another version of the same platform, or a specific version of another platform, then it can import that platform. This permits packages to reuse assets that were built for the imported platform on the compatible platform. Compatibility here is a bit nebulous because inevitably different platforms will have observable differences that can cause compatibility problems. For the purposes of RIDs we'll try to represent compatibility as versions of a platform that are explicitly advertised as being compatible with a previous version and/or another platform and don't have any known broad breaking changes. It is usually better to opt to treat platforms as compatible since that enables the scenario of building an asset for a particular version and using that in future versions, otherwise you force people to cross-compile for all future versions the moment they target a specific version. - -## Appendix : details of RID graph generation - -### Naming convention -We use the following convention in all newly-defined RIDs. Some RIDs (win7-x64, win8-x64) predate this convention and don't follow it, but all new RIDs should follow it. -`[os name].[version]-[architecture]-[additional qualifiers]`, for example `osx.10.10-x64` or `ubuntu.14.04-x64` -- `[os name]` can contain any characters other than `.` -- `[version]` can contain any characters other than `-`. Typically a numeric version like 14.04 or 10.0. -- `[architecture]` can contain any characters other than `-`. Typically: `x86`, `x64`, `arm`, `arm64` -- `[additional qualifiers]` can be things like `aot`. Used to further differentiate different platforms. - -For all of these we strive to make them something that can be uniquely discoverable at runtime, so that a RID may be computed from an executing application. As such these properties should be derivable from `/etc/os-release` or similar platform APIs / data. - -### Import convention -Imports should be used when the added RID is considered compatible with an existing RID. - -1. Architecture-specific RIDs should first import the architecture-less RID. EG: `osx.10.11-x64` should first import `osx.10.11`. -2. Architecture-specific RIDs that are compatible with a previous version RID for the same OS should then import the previous version, architecture specific RID. EG: `osx.10.11-x64` should then import `osx.10.10-x64`. If there is no earlier compatible/supported version, then a versionless RID should be imported. EG: `osx.10.10-x64` should import `osx-x64`. -3. Architecture-less RIDs that are compatible with a previous version RID for the same OS should then import the previous version, architecture neutral RID. EG: `osx.10.11` should import `osx.10.10`. If there is no earlier compatible/supported version, then a versionless RID should be imported. EG: `osx.10.10` should import `osx`. -4. Version-less RIDs should import an OS category. EG: `osx-x64` should import `unix-x64`, `osx` should import `unix`. - -### Advanced RuntimeGroup metadata -The following options can be used under special circumstances but break the normal precedence rules we try to establish by generating the RID graph from common logic. These options make it possible to create a RID fallback chain that doesn't match the rest of the RIDs and therefore is hard for developers/package authors to reason about. Only use these options for cases where you know what you are doing and have carefully reviewed the resulting RID fallbacks using the CompatibliltyMap. - -- `OmitRIDs`: A list of strings delimited by semi-colons that represent RIDs calculated from this RuntimeGroup that should be omitted from the RuntimeGraph. These RIDs will not be referenced nor defined. -- `OmitRIDDefinitions`: A list of strings delimited by semi-colons that represent RIDs calculated from this RuntimeGroup that should be omitted from the RuntimeGraph. These RIDs will not be defined by this RuntimeGroup, but will be referenced: useful in case some other RuntimeGroup (or runtime.json template) defines them. -- `OmitRIDReferences`: A list of strings delimited by semi-colons that represent RIDs calculated from this RuntimeGroup that should be omitted from the RuntimeGraph. These RIDs will be defined but not referenced by this RuntimeGroup. +The RID graphs should be only updated with new base OSes, architectures, or C standard libraries. The RID graphs shouldn't be updated with new OS flavor- and version-specific RIDs anymore. Build from source automatically adds the non-portable distro RID encoded via the `OutputRID` property into the RID graph which allows build tools to target that RID. \ No newline at end of file diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/AssemblyResolver.cs b/src/libraries/Microsoft.NETCore.Platforms/src/AssemblyResolver.cs deleted file mode 100644 index 81cbce457a734e..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/src/AssemblyResolver.cs +++ /dev/null @@ -1,111 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Diagnostics; -using System.Diagnostics.CodeAnalysis; -using System.IO; -using System.Reflection; - -namespace Microsoft.NETCore.Platforms.BuildTasks -{ - /// - /// Used to enable app-local assembly unification. - /// - internal static class AssemblyResolver - { - static AssemblyResolver() - { - AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; - } - - /// - /// Call to enable the assembly resolver for the current AppDomain. - /// - public static void Enable() - { - // intentionally empty. This is just meant to ensure the static constructor - // has run. - } - - [UnconditionalSuppressMessage("SingleFile", "IL3000:Avoid accessing Assembly file path when publishing as a single file", - Justification = "The code has a fallback to use AppDomain.CurrentDomain.BaseDirectory so it will work correctly in single-file")] - private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) - { - // apply any existing policy - AssemblyName referenceName = new AssemblyName(AppDomain.CurrentDomain.ApplyPolicy(args.Name)); - - string fileName = referenceName.Name + ".dll"; - string assemblyPath; - string probingPath; - Assembly assm; - - // look next to requesting assembly - assemblyPath = args.RequestingAssembly?.Location; - if (!string.IsNullOrEmpty(assemblyPath)) - { - probingPath = Path.Combine(Path.GetDirectoryName(assemblyPath), fileName); - Debug.WriteLine($"Considering {probingPath} based on RequestingAssembly"); - if (Probe(probingPath, referenceName.Version, out assm)) - { - return assm; - } - } - - // look next to the executing assembly - assemblyPath = Assembly.GetExecutingAssembly().Location; - if (!string.IsNullOrEmpty(assemblyPath)) - { - probingPath = Path.Combine(Path.GetDirectoryName(assemblyPath), fileName); - - Debug.WriteLine($"Considering {probingPath} based on ExecutingAssembly"); - if (Probe(probingPath, referenceName.Version, out assm)) - { - return assm; - } - } - - // look in AppDomain base directory - probingPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName); - Debug.WriteLine($"Considering {probingPath} based on BaseDirectory"); - if (Probe(probingPath, referenceName.Version, out assm)) - { - return assm; - } - - // look in current directory - Debug.WriteLine($"Considering {fileName}"); - if (Probe(fileName, referenceName.Version, out assm)) - { - return assm; - } - - return null; - } - - /// - /// Considers a path to load for satisfying an assembly ref and loads it - /// if the file exists and version is sufficient. - /// - /// Path to consider for load - /// Minimum version to consider - /// loaded assembly - /// true if assembly was loaded - private static bool Probe(string filePath, Version minimumVersion, out Assembly assembly) - { - if (File.Exists(filePath)) - { - AssemblyName name = AssemblyName.GetAssemblyName(filePath); - - if (name.Version >= minimumVersion) - { - assembly = Assembly.Load(name); - return true; - } - } - - assembly = null; - return false; - } - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/BuildTask.Desktop.cs b/src/libraries/Microsoft.NETCore.Platforms/src/BuildTask.Desktop.cs deleted file mode 100644 index 29af5f186cfb41..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/src/BuildTask.Desktop.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -namespace Microsoft.NETCore.Platforms.BuildTasks -{ - public partial class BuildTask - { - static BuildTask() - { - AssemblyResolver.Enable(); - } - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/BuildTask.cs b/src/libraries/Microsoft.NETCore.Platforms/src/BuildTask.cs deleted file mode 100644 index 98e17c3b0c566c..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/src/BuildTask.cs +++ /dev/null @@ -1,151 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using System; - -namespace Microsoft.NETCore.Platforms.BuildTasks -{ - public abstract partial class BuildTask : ITask - { - private Log _log; - - internal Log Log - { - get { return _log ??= new Log(new TaskLoggingHelper(this)); } - } - - public BuildTask() - { - } - - public IBuildEngine BuildEngine - { - get; - set; - } - - public ITaskHost HostObject - { - get; - set; - } - - public abstract bool Execute(); - } - - internal sealed class Log : ILog - { - private readonly TaskLoggingHelper _logger; - public Log(TaskLoggingHelper logger) - { - _logger = logger; - } - - public void LogError(string message, params object[] messageArgs) - { - _logger.LogError(message, messageArgs); - } - - public void LogErrorFromException(Exception exception, bool showStackTrace) - { - _logger.LogErrorFromException(exception, showStackTrace); - } - - public void LogMessage(string message, params object[] messageArgs) - { - _logger.LogMessage(message, messageArgs); - } - - public void LogMessage(LogImportance importance, string message, params object[] messageArgs) - { - _logger.LogMessage((MessageImportance)importance, message, messageArgs); - } - - public void LogWarning(string message, params object[] messageArgs) - { - _logger.LogWarning(message, messageArgs); - } - - public bool HasLoggedErrors { get { return _logger.HasLoggedErrors; } } - } - - public enum LogImportance - { - Low = MessageImportance.Low, - Normal = MessageImportance.Normal, - High = MessageImportance.High - } - - - public interface ILog - { - // - // Summary: - // Logs an error with the specified message. - // - // Parameters: - // message: - // The message. - // - // messageArgs: - // Optional arguments for formatting the message string. - // - // Exceptions: - // T:System.ArgumentNullException: - // message is null. - void LogError(string message, params object[] messageArgs); - - // - // Summary: - // Logs a message with the specified string. - // - // Parameters: - // message: - // The message. - // - // messageArgs: - // The arguments for formatting the message. - // - // Exceptions: - // T:System.ArgumentNullException: - // message is null. - void LogMessage(string message, params object[] messageArgs); - - // - // Summary: - // Logs a message with the specified string and importance. - // - // Parameters: - // importance: - // One of the enumeration values that specifies the importance of the message. - // - // message: - // The message. - // - // messageArgs: - // The arguments for formatting the message. - // - // Exceptions: - // T:System.ArgumentNullException: - // message is null. - void LogMessage(LogImportance importance, string message, params object[] messageArgs); - - // - // Summary: - // Logs a warning with the specified message. - // - // Parameters: - // message: - // The message. - // - // messageArgs: - // Optional arguments for formatting the message string. - // - // Exceptions: - // T:System.ArgumentNullException: - // message is null. - void LogWarning(string message, params object[] messageArgs); - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/Directory.Build.props b/src/libraries/Microsoft.NETCore.Platforms/src/Directory.Build.props new file mode 100644 index 00000000000000..75e6b0abd56ae6 --- /dev/null +++ b/src/libraries/Microsoft.NETCore.Platforms/src/Directory.Build.props @@ -0,0 +1,9 @@ + + + + false + + + + + \ No newline at end of file diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/Extensions.cs b/src/libraries/Microsoft.NETCore.Platforms/src/Extensions.cs deleted file mode 100644 index 2456407d682e7d..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/src/Extensions.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using System.Linq; -using Microsoft.Build.Framework; - -namespace Microsoft.NETCore.Platforms.BuildTasks -{ - public static class Extensions - { - public static string GetString(this ITaskItem taskItem, string metadataName) - { - var metadataValue = taskItem.GetMetadata(metadataName)?.Trim(); - return string.IsNullOrEmpty(metadataValue) ? null : metadataValue; - } - - public static bool GetBoolean(this ITaskItem taskItem, string metadataName, bool defaultValue = false) - { - bool result; - var metadataValue = taskItem.GetMetadata(metadataName); - if (!bool.TryParse(metadataValue, out result)) - { - result = defaultValue; - } - return result; - } - - public static IEnumerable GetStrings(this ITaskItem taskItem, string metadataName) - { - var metadataValue = taskItem.GetMetadata(metadataName)?.Trim(); - if (!string.IsNullOrEmpty(metadataValue)) - { - return metadataValue.Split(';').Where(v => !string.IsNullOrEmpty(v.Trim())).ToArray(); - } - - return Enumerable.Empty(); - } - - public static IEnumerable NullAsEmpty(this IEnumerable source) - { - return source ?? Enumerable.Empty(); - } - - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/GenerateRuntimeGraph.cs b/src/libraries/Microsoft.NETCore.Platforms/src/GenerateRuntimeGraph.cs deleted file mode 100644 index f431e274e8dca3..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/src/GenerateRuntimeGraph.cs +++ /dev/null @@ -1,427 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Xml.Linq; -using Microsoft.Build.Framework; -using Newtonsoft.Json; -using NuGet.RuntimeModel; - -namespace Microsoft.NETCore.Platforms.BuildTasks -{ - public class GenerateRuntimeGraph : BuildTask - { - - /// - /// A set of RuntimeGroups that can be used to generate a runtime graph - /// Identity: the base string for the RID, without version architecture, or qualifiers. - /// Parent: the base string for the parent of this RID. This RID will be imported by the baseRID, architecture-specific, - /// and qualifier-specific RIDs (with the latter two appending appropriate architecture and qualifiers). - /// Versions: A list of strings delimited by semi-colons that represent the versions for this RID. - /// TreatVersionsAsCompatible: Default is true. When true, version-specific RIDs will import the previous - /// version-specific RID in the Versions list, with the first version importing the version-less RID. - /// When false all version-specific RIDs will import the version-less RID (bypassing previous version-specific RIDs) - /// OmitVersionDelimiter: Default is false. When true no characters will separate the base RID and version (EG: win7). - /// When false a '.' will separate the base RID and version (EG: osx.10.12). - /// ApplyVersionsToParent: Default is false. When true, version-specific RIDs will import version-specific Parent RIDs - /// similar to is done for architecture and qualifier (see Parent above). - /// Architectures: A list of strings delimited by semi-colons that represent the architectures for this RID. - /// AdditionalQualifiers: A list of strings delimited by semi-colons that represent the additional qualifiers for this RID. - /// Additional qualifers do not stack, each only applies to the qualifier-less RIDs (so as not to cause combinatorial - /// exponential growth of RIDs). - /// - /// The following options can be used under special circumstances but break the normal precedence rules we try to establish - /// by generating the RID graph from common logic. These options make it possible to create a RID fallback chain that doesn't - /// match the rest of the RIDs and therefore is hard for developers/package authors to reason about. - /// Only use these options for cases where you know what you are doing and have carefully reviewed the resulting RID fallbacks - /// using the CompatibliltyMap. - /// OmitRIDs: A list of strings delimited by semi-colons that represent RIDs calculated from this RuntimeGroup that should - /// be omitted from the RuntimeGraph. These RIDs will not be referenced nor defined. - /// OmitRIDDefinitions: A list of strings delimited by semi-colons that represent RIDs calculated from this RuntimeGroup - /// that should be omitted from the RuntimeGraph. These RIDs will not be defined by this RuntimeGroup, but will be - /// referenced: useful in case some other RuntimeGroup (or runtime.json template) defines them. - /// OmitRIDReferences: A list of strings delimited by semi-colons that represent RIDs calculated from this RuntimeGroup - /// that should be omitted from the RuntimeGraph. These RIDs will be defined but not referenced by this RuntimeGroup. - /// - public ITaskItem[] RuntimeGroups - { - get; - set; - } - - /// - /// Additional runtime identifiers to add to the graph. - /// - public string[] AdditionalRuntimeIdentifiers - { - get; - set; - } - - /// - /// Parent RID to use for any unknown AdditionalRuntimeIdentifier. - /// - public string AdditionalRuntimeIdentifierParent - { - get; - set; - } - - /// - /// Optional source Runtime.json to use as a starting point when merging additional RuntimeGroups - /// - public string SourceRuntimeJson - { - get; - set; - } - - /// - /// Where to write the final runtime.json - /// - public string RuntimeJson - { - get; - set; - } - - /// - /// Optionally, other runtime.jsons which may contain imported RIDs - /// - public string[] ExternalRuntimeJsons - { - get; - set; - } - - /// - /// When defined, specifies the file to write compatibility precedence for each RID in the graph. - /// - public string CompatibilityMap - { - get; - set; - } - - - /// - /// True to write the generated runtime.json to RuntimeJson and compatibility map to CompatibilityMap, otherwise files are read and diffed - /// with generated versions and an error is emitted if they differ. - /// Setting UpdateRuntimeFiles will overwrite files even when the file is marked ReadOnly. - /// - public bool UpdateRuntimeFiles - { - get; - set; - } - - /// - /// When defined, specifies the file to write a DGML representation of the runtime graph. - /// - public string RuntimeDirectedGraph - { - get; - set; - } - - public override bool Execute() - { - if (RuntimeGroups != null && RuntimeGroups.Length != 0 && RuntimeJson == null) - { - Log.LogError($"{nameof(RuntimeJson)} argument must be specified when {nameof(RuntimeGroups)} is specified."); - return false; - } - - RuntimeGraph runtimeGraph; - if (!string.IsNullOrEmpty(SourceRuntimeJson)) - { - if (!File.Exists(SourceRuntimeJson)) - { - Log.LogError($"{nameof(SourceRuntimeJson)} did not exist at {SourceRuntimeJson}."); - return false; - } - - runtimeGraph = JsonRuntimeFormat.ReadRuntimeGraph(SourceRuntimeJson); - } - else - { - runtimeGraph = new RuntimeGraph(); - } - - List runtimeGroups = RuntimeGroups.NullAsEmpty().Select(i => new RuntimeGroup(i)).ToList(); - - AddRuntimeIdentifiers(runtimeGroups); - - foreach (var runtimeGroup in runtimeGroups) - { - runtimeGraph = SafeMerge(runtimeGraph, runtimeGroup); - } - - Dictionary externalRids = new Dictionary(); - if (ExternalRuntimeJsons != null) - { - foreach (var externalRuntimeJson in ExternalRuntimeJsons) - { - RuntimeGraph externalRuntimeGraph = JsonRuntimeFormat.ReadRuntimeGraph(externalRuntimeJson); - - foreach (var runtime in externalRuntimeGraph.Runtimes.Keys) - { - // don't check for duplicates, we merely care what is external - externalRids.Add(runtime, externalRuntimeJson); - } - } - } - - ValidateImports(runtimeGraph, externalRids); - - if (!string.IsNullOrEmpty(RuntimeJson)) - { - if (UpdateRuntimeFiles) - { - EnsureWritable(RuntimeJson); - WriteRuntimeGraph(RuntimeJson, runtimeGraph); - - } - else - { - // validate that existing file matches generated file - if (!File.Exists(RuntimeJson)) - { - Log.LogError($"{nameof(RuntimeJson)} did not exist at {RuntimeJson} and {nameof(UpdateRuntimeFiles)} was not specified."); - } - else - { - var existingRuntimeGraph = JsonRuntimeFormat.ReadRuntimeGraph(RuntimeJson); - - if (!existingRuntimeGraph.Equals(runtimeGraph)) - { - Log.LogError($"The generated {nameof(RuntimeJson)} differs from {RuntimeJson} and {nameof(UpdateRuntimeFiles)} was not specified. Please specify {nameof(UpdateRuntimeFiles)}=true to commit the changes."); - } - } - } - } - - if (!string.IsNullOrEmpty(CompatibilityMap)) - { - var compatibilityMap = GetCompatibilityMap(runtimeGraph); - if (UpdateRuntimeFiles) - { - EnsureWritable(CompatibilityMap); - WriteCompatibilityMap(compatibilityMap, CompatibilityMap); - } - else - { - // validate that existing file matches generated file - if (!File.Exists(CompatibilityMap)) - { - Log.LogError($"{nameof(CompatibilityMap)} did not exist at {CompatibilityMap} and {nameof(UpdateRuntimeFiles)} was not specified."); - } - else - { - var existingCompatibilityMap = ReadCompatibilityMap(CompatibilityMap); - - if (!CompatibilityMapEquals(existingCompatibilityMap, compatibilityMap)) - { - Log.LogError($"The generated {nameof(CompatibilityMap)} differs from {CompatibilityMap} and {nameof(UpdateRuntimeFiles)} was not specified. Please specify {nameof(UpdateRuntimeFiles)}=true to commit the changes."); - } - } - } - } - - if (!string.IsNullOrEmpty(RuntimeDirectedGraph)) - { - WriteRuntimeGraph(runtimeGraph, RuntimeDirectedGraph); - } - - return !Log.HasLoggedErrors; - } - - private static void EnsureWritable(string file) - { - if (File.Exists(file)) - { - var existingAttributes = File.GetAttributes(file); - - if ((existingAttributes & FileAttributes.ReadOnly) != 0) - { - File.SetAttributes(file, existingAttributes &= ~FileAttributes.ReadOnly); - } - } - } - - public static void WriteRuntimeGraph(string filePath, RuntimeGraph runtimeGraph) - { - using (var fileStream = new FileStream(filePath, FileMode.Create)) - using (var textWriter = new StreamWriter(fileStream)) - using (var jsonWriter = new JsonTextWriter(textWriter)) - using (var writer = new JsonObjectWriter(jsonWriter)) - { - jsonWriter.Formatting = Formatting.Indented; - - // workaround https://github.com/NuGet/Home/issues/9532 - writer.WriteObjectStart(); - - JsonRuntimeFormat.WriteRuntimeGraph(writer, runtimeGraph); - - writer.WriteObjectEnd(); - } - } - - private RuntimeGraph SafeMerge(RuntimeGraph existingGraph, RuntimeGroup runtimeGroup) - { - var runtimeGraph = runtimeGroup.GetRuntimeGraph(); - - foreach (var existingRuntimeDescription in existingGraph.Runtimes.Values) - { - RuntimeDescription newRuntimeDescription; - - if (runtimeGraph.Runtimes.TryGetValue(existingRuntimeDescription.RuntimeIdentifier, out newRuntimeDescription)) - { - // overlapping RID, ensure that the imports match (same ordering and content) - if (!existingRuntimeDescription.InheritedRuntimes.SequenceEqual(newRuntimeDescription.InheritedRuntimes)) - { - Log.LogError($"RuntimeGroup {runtimeGroup.BaseRID} defines RID {newRuntimeDescription.RuntimeIdentifier} with imports {string.Join(";", newRuntimeDescription.InheritedRuntimes)} which differ from existing imports {string.Join(";", existingRuntimeDescription.InheritedRuntimes)}. You may avoid this by specifying {nameof(RuntimeGroup.OmitRIDDefinitions)} metadata with {newRuntimeDescription.RuntimeIdentifier}."); - } - } - } - - return RuntimeGraph.Merge(existingGraph, runtimeGraph); - } - - private void ValidateImports(RuntimeGraph runtimeGraph, Dictionary externalRIDs) - { - foreach (var runtimeDescription in runtimeGraph.Runtimes.Values) - { - string externalRuntimeJson; - - if (externalRIDs.TryGetValue(runtimeDescription.RuntimeIdentifier, out externalRuntimeJson)) - { - Log.LogError($"Runtime {runtimeDescription.RuntimeIdentifier} is defined in both this RuntimeGraph and {externalRuntimeJson}."); - } - - foreach (var import in runtimeDescription.InheritedRuntimes) - { - if (!runtimeGraph.Runtimes.ContainsKey(import) && !externalRIDs.ContainsKey(import)) - { - Log.LogError($"Runtime {runtimeDescription.RuntimeIdentifier} imports {import} which is not defined."); - } - } - } - } - - private void AddRuntimeIdentifiers(ICollection runtimeGroups) - { - if (AdditionalRuntimeIdentifiers == null || AdditionalRuntimeIdentifiers.Length == 0) - { - return; - } - - RuntimeGroupCollection runtimeGroupCollection = new RuntimeGroupCollection(runtimeGroups); - - foreach (string additionalRuntimeIdentifier in AdditionalRuntimeIdentifiers) - { - runtimeGroupCollection.AddRuntimeIdentifier(additionalRuntimeIdentifier, AdditionalRuntimeIdentifierParent); - } - } - - private static Dictionary> GetCompatibilityMap(RuntimeGraph graph) - { - Dictionary> compatibilityMap = new Dictionary>(); - - foreach (var rid in graph.Runtimes.Keys.OrderBy(rid => rid, StringComparer.Ordinal)) - { - compatibilityMap.Add(rid, graph.ExpandRuntime(rid)); - } - - return compatibilityMap; - } - - private static IDictionary> ReadCompatibilityMap(string mapFile) - { - var serializer = new JsonSerializer(); - using (var file = File.OpenText(mapFile)) - using (var jsonTextReader = new JsonTextReader(file) { MaxDepth = null }) - { - return serializer.Deserialize>>(jsonTextReader); - } - } - - private static void WriteCompatibilityMap(Dictionary> compatibilityMap, string mapFile) - { - var serializer = new JsonSerializer() - { - Formatting = Formatting.Indented, - StringEscapeHandling = StringEscapeHandling.EscapeNonAscii - }; - - string directory = Path.GetDirectoryName(mapFile); - if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory)) - { - Directory.CreateDirectory(directory); - } - - using (var file = File.CreateText(mapFile)) - { - serializer.Serialize(file, compatibilityMap); - } - } - - private static bool CompatibilityMapEquals(IDictionary> left, Dictionary> right) - { - if (left.Count != right.Count) - { - return false; - } - - foreach (var leftPair in left) - { - IEnumerable rightValue; - - if (!right.TryGetValue(leftPair.Key, out rightValue)) - { - return false; - } - - if (!rightValue.SequenceEqual(leftPair.Value)) - { - return false; - } - } - - return true; - } - - private static readonly XNamespace s_dgmlns = @"http://schemas.microsoft.com/vs/2009/dgml"; - private static void WriteRuntimeGraph(RuntimeGraph graph, string dependencyGraphFilePath) - { - - var doc = new XDocument(new XElement(s_dgmlns + "DirectedGraph")); - var nodesElement = new XElement(s_dgmlns + "Nodes"); - var linksElement = new XElement(s_dgmlns + "Links"); - doc.Root.Add(nodesElement); - doc.Root.Add(linksElement); - - foreach (var runtimeDescription in graph.Runtimes.Values) - { - nodesElement.Add(new XElement(s_dgmlns + "Node", - new XAttribute("Id", runtimeDescription.RuntimeIdentifier))); - - foreach (var import in runtimeDescription.InheritedRuntimes) - { - linksElement.Add(new XElement(s_dgmlns + "Link", - new XAttribute("Source", runtimeDescription.RuntimeIdentifier), - new XAttribute("Target", import))); - } - } - - using (var file = File.Create(dependencyGraphFilePath)) - { - doc.Save(file); - } - } - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/Microsoft.NETCore.Platforms.csproj b/src/libraries/Microsoft.NETCore.Platforms/src/Microsoft.NETCore.Platforms.csproj index 86e98f21dbb1ea..958cf0e65df499 100644 --- a/src/libraries/Microsoft.NETCore.Platforms/src/Microsoft.NETCore.Platforms.csproj +++ b/src/libraries/Microsoft.NETCore.Platforms/src/Microsoft.NETCore.Platforms.csproj @@ -1,86 +1,63 @@ + $(NetCoreAppToolCurrent);$(NetFrameworkToolCurrent) - Microsoft.NETCore.Platforms.BuildTasks + true + false + true + Provides runtime information required to resolve target framework, platform, and runtime specific implementations of .NET packages. + $(NoWarn);NU5128 - disable false false false false - false - - true - false - $(MSBuildProjectName) - true - Provides runtime information required to resolve target framework, platform, and runtime specific implementations of .NETCore packages. - $(NoWarn);NU5128 - true - - $(MSBuildProjectName) - UpdateRuntimeJson;$(BeforePack) <_generateRuntimeGraphTargetFramework Condition="'$(MSBuildRuntimeType)' == 'core'">$(NetCoreAppToolCurrent) - <_generateRuntimeGraphTargetFramework Condition="'$(MSBuildRuntimeType)' != 'core'">net472 + <_generateRuntimeGraphTargetFramework Condition="'$(MSBuildRuntimeType)' != 'core'">$(NetFrameworkToolCurrent) <_generateRuntimeGraphTask>$([MSBuild]::NormalizePath('$(BaseOutputPath)', $(Configuration), '$(_generateRuntimeGraphTargetFramework)', '$(AssemblyName).dll')) - - $(AdditionalRuntimeIdentifiers);$(OutputRID) - - - - + + + + - - - - - - - + - - - - + + + + + + + + - - - - - - - - - - - - - - + + + + + + + diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/PortableRuntimeIdentifierGraph.json b/src/libraries/Microsoft.NETCore.Platforms/src/PortableRuntimeIdentifierGraph.json new file mode 100644 index 00000000000000..f6f7fbf597cfb8 --- /dev/null +++ b/src/libraries/Microsoft.NETCore.Platforms/src/PortableRuntimeIdentifierGraph.json @@ -0,0 +1,475 @@ +{ + "runtimes": { + "android": { + "#import": [ + "linux-bionic" + ] + }, + "android-arm": { + "#import": [ + "android", + "linux-bionic-arm" + ] + }, + "android-arm64": { + "#import": [ + "android", + "linux-bionic-arm64" + ] + }, + "android-x64": { + "#import": [ + "android", + "linux-bionic-x64" + ] + }, + "android-x86": { + "#import": [ + "android", + "linux-bionic-x86" + ] + }, + "any": { + "#import": [ + "base" + ] + }, + "base": { + "#import": [] + }, + "browser": { + "#import": [ + "any" + ] + }, + "browser-wasm": { + "#import": [ + "browser" + ] + }, + "freebsd": { + "#import": [ + "unix" + ] + }, + "freebsd-arm64": { + "#import": [ + "freebsd", + "unix-arm64" + ] + }, + "freebsd-x64": { + "#import": [ + "freebsd", + "unix-x64" + ] + }, + "haiku": { + "#import": [ + "unix" + ] + }, + "haiku-x64": { + "#import": [ + "haiku", + "unix-x64" + ] + }, + "illumos": { + "#import": [ + "unix" + ] + }, + "illumos-x64": { + "#import": [ + "illumos", + "unix-x64" + ] + }, + "ios": { + "#import": [ + "unix" + ] + }, + "ios-arm": { + "#import": [ + "ios", + "unix-arm" + ] + }, + "ios-arm64": { + "#import": [ + "ios", + "unix-arm64" + ] + }, + "ios-x64": { + "#import": [ + "ios", + "unix-x64" + ] + }, + "ios-x86": { + "#import": [ + "ios", + "unix-x86" + ] + }, + "iossimulator": { + "#import": [ + "ios" + ] + }, + "iossimulator-arm64": { + "#import": [ + "iossimulator", + "ios-arm64" + ] + }, + "iossimulator-x64": { + "#import": [ + "iossimulator", + "ios-x64" + ] + }, + "iossimulator-x86": { + "#import": [ + "iossimulator", + "ios-x86" + ] + }, + "linux": { + "#import": [ + "unix" + ] + }, + "linux-arm": { + "#import": [ + "linux", + "unix-arm" + ] + }, + "linux-arm64": { + "#import": [ + "linux", + "unix-arm64" + ] + }, + "linux-armel": { + "#import": [ + "linux", + "unix-armel" + ] + }, + "linux-armv6": { + "#import": [ + "linux", + "unix-armv6" + ] + }, + "linux-bionic": { + "#import": [ + "linux" + ] + }, + "linux-bionic-arm": { + "#import": [ + "linux-bionic", + "linux-arm" + ] + }, + "linux-bionic-arm64": { + "#import": [ + "linux-bionic", + "linux-arm64" + ] + }, + "linux-bionic-x64": { + "#import": [ + "linux-bionic", + "linux-x64" + ] + }, + "linux-bionic-x86": { + "#import": [ + "linux-bionic", + "linux-x86" + ] + }, + "linux-loongarch64": { + "#import": [ + "linux", + "unix-loongarch64" + ] + }, + "linux-mips64": { + "#import": [ + "linux", + "unix-mips64" + ] + }, + "linux-musl": { + "#import": [ + "linux" + ] + }, + "linux-musl-arm": { + "#import": [ + "linux-musl", + "linux-arm" + ] + }, + "linux-musl-arm64": { + "#import": [ + "linux-musl", + "linux-arm64" + ] + }, + "linux-musl-armel": { + "#import": [ + "linux-musl", + "linux-armel" + ] + }, + "linux-musl-armv6": { + "#import": [ + "linux-musl", + "linux-armv6" + ] + }, + "linux-musl-ppc64le": { + "#import": [ + "linux-musl", + "linux-ppc64le" + ] + }, + "linux-musl-riscv64": { + "#import": [ + "linux-musl", + "linux-riscv64" + ] + }, + "linux-musl-s390x": { + "#import": [ + "linux-musl", + "linux-s390x" + ] + }, + "linux-musl-x64": { + "#import": [ + "linux-musl", + "linux-x64" + ] + }, + "linux-musl-x86": { + "#import": [ + "linux-musl", + "linux-x86" + ] + }, + "linux-ppc64le": { + "#import": [ + "linux", + "unix-ppc64le" + ] + }, + "linux-riscv64": { + "#import": [ + "linux", + "unix-riscv64" + ] + }, + "linux-s390x": { + "#import": [ + "linux", + "unix-s390x" + ] + }, + "linux-x64": { + "#import": [ + "linux", + "unix-x64" + ] + }, + "linux-x86": { + "#import": [ + "linux", + "unix-x86" + ] + }, + "maccatalyst": { + "#import": [ + "ios" + ] + }, + "maccatalyst-arm64": { + "#import": [ + "maccatalyst", + "ios-arm64" + ] + }, + "maccatalyst-x64": { + "#import": [ + "maccatalyst", + "ios-x64" + ] + }, + "osx": { + "#import": [ + "unix" + ] + }, + "osx-arm64": { + "#import": [ + "osx", + "unix-arm64" + ] + }, + "osx-x64": { + "#import": [ + "osx", + "unix-x64" + ] + }, + "solaris": { + "#import": [ + "unix" + ] + }, + "solaris-x64": { + "#import": [ + "solaris", + "unix-x64" + ] + }, + "tvos": { + "#import": [ + "unix" + ] + }, + "tvos-arm64": { + "#import": [ + "tvos", + "unix-arm64" + ] + }, + "tvos-x64": { + "#import": [ + "tvos", + "unix-x64" + ] + }, + "tvossimulator": { + "#import": [ + "tvos" + ] + }, + "tvossimulator-arm64": { + "#import": [ + "tvossimulator", + "tvos-arm64" + ] + }, + "tvossimulator-x64": { + "#import": [ + "tvossimulator", + "tvos-x64" + ] + }, + "unix": { + "#import": [ + "any" + ] + }, + "unix-arm": { + "#import": [ + "unix" + ] + }, + "unix-arm64": { + "#import": [ + "unix" + ] + }, + "unix-armel": { + "#import": [ + "unix" + ] + }, + "unix-armv6": { + "#import": [ + "unix" + ] + }, + "unix-loongarch64": { + "#import": [ + "unix" + ] + }, + "unix-mips64": { + "#import": [ + "unix" + ] + }, + "unix-ppc64le": { + "#import": [ + "unix" + ] + }, + "unix-riscv64": { + "#import": [ + "unix" + ] + }, + "unix-s390x": { + "#import": [ + "unix" + ] + }, + "unix-x64": { + "#import": [ + "unix" + ] + }, + "unix-x86": { + "#import": [ + "unix" + ] + }, + "wasi": { + "#import": [ + "any" + ] + }, + "wasi-wasm": { + "#import": [ + "wasi" + ] + }, + "win": { + "#import": [ + "any" + ] + }, + "win-arm": { + "#import": [ + "win" + ] + }, + "win-arm64": { + "#import": [ + "win" + ] + }, + "win-x64": { + "#import": [ + "win" + ] + }, + "win-x86": { + "#import": [ + "win" + ] + } + } + } \ No newline at end of file diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/RID.cs b/src/libraries/Microsoft.NETCore.Platforms/src/RID.cs deleted file mode 100644 index b464d5f0f54e37..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/src/RID.cs +++ /dev/null @@ -1,208 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Diagnostics; -using System.Text; - -namespace Microsoft.NETCore.Platforms.BuildTasks -{ - public class RID - { - internal const char VersionDelimiter = '.'; - internal const char ArchitectureDelimiter = '-'; - internal const char QualifierDelimiter = '-'; - - public string BaseRID { get; set; } - public bool OmitVersionDelimiter { get; set; } - public RuntimeVersion Version { get; set; } - public string Architecture { get; set; } - public string Qualifier { get; set; } - - public override string ToString() - { - StringBuilder builder = new StringBuilder(BaseRID); - - if (HasVersion) - { - if (!OmitVersionDelimiter) - { - builder.Append(VersionDelimiter); - } - builder.Append(Version); - } - - if (HasArchitecture) - { - builder.Append(ArchitectureDelimiter); - builder.Append(Architecture); - } - - if (HasQualifier) - { - builder.Append(QualifierDelimiter); - builder.Append(Qualifier); - } - - return builder.ToString(); - } - - private enum RIDPart : int - { - Base = 0, - Version, - Architecture, - Qualifier, - Max = Qualifier - } - - public static RID Parse(string runtimeIdentifier, bool noQualifier) - { - string[] parts = new string[(int)RIDPart.Max + 1]; - bool omitVersionDelimiter = true; - RIDPart parseState = RIDPart.Base; - - int partStart = 0, partLength; - - // qualifier is indistinguishable from arch so we cannot distinguish it for parsing purposes - Debug.Assert(ArchitectureDelimiter == QualifierDelimiter); - - for (int i = 0; i < runtimeIdentifier.Length; i++) - { - char current = runtimeIdentifier[i]; - partLength = i - partStart; - - switch (parseState) - { - case RIDPart.Base: - // treat any number as the start of the version - if (current == VersionDelimiter || (current >= '0' && current <= '9')) - { - SetPart(); - partStart = i; - if (current == VersionDelimiter) - { - omitVersionDelimiter = false; - partStart = i + 1; - } - parseState = RIDPart.Version; - } - // version might be omitted - else if (current == ArchitectureDelimiter) - { - // The qualifier delimiter and architecture delimiter are the same. - // When there is no qualifier, there will be one delimiter past the base part - // for the architecture. - // So if we see another delimiter later in the string (for the architecture), - // extend the base part instead of starting the architecture part. - if (noQualifier && runtimeIdentifier.IndexOf(ArchitectureDelimiter, i + 1) != -1) - { - break; - } - // ensure there's no version later in the string - if (runtimeIdentifier.IndexOf(VersionDelimiter, i) != -1) - { - break; - } - SetPart(); - partStart = i + 1; // skip delimiter - parseState = RIDPart.Architecture; - } - break; - case RIDPart.Version: - if (current == ArchitectureDelimiter) - { - SetPart(); - partStart = i + 1; // skip delimiter - parseState = RIDPart.Architecture; - } - break; - case RIDPart.Architecture: - if (current == QualifierDelimiter) - { - SetPart(); - partStart = i + 1; // skip delimiter - parseState = RIDPart.Qualifier; - } - break; - default: - break; - } - } - - partLength = runtimeIdentifier.Length - partStart; - if (partLength > 0) - { - SetPart(); - } - - string GetPart(RIDPart part) - { - return parts[(int)part]; - } - - void SetPart() - { - if (partLength == 0) - { - throw new ArgumentException($"Unexpected delimiter at position {partStart} in \"{runtimeIdentifier}\""); - } - - parts[(int)parseState] = runtimeIdentifier.Substring(partStart, partLength); - } - - string version = GetPart(RIDPart.Version); - - if (version == null) - { - omitVersionDelimiter = false; - } - - return new RID() - { - BaseRID = GetPart(RIDPart.Base), - OmitVersionDelimiter = omitVersionDelimiter, - Version = version == null ? null : new RuntimeVersion(version), - Architecture = GetPart(RIDPart.Architecture), - Qualifier = GetPart(RIDPart.Qualifier) - }; - } - - public bool HasVersion => Version != null; - - public bool HasArchitecture => Architecture != null; - - public bool HasQualifier => Qualifier != null; - - public override bool Equals(object obj) - { - return Equals(obj as RID); - } - - public bool Equals(RID obj) - { - return object.ReferenceEquals(obj, this) || - (obj is not null && - BaseRID == obj.BaseRID && - (Version == null || OmitVersionDelimiter == obj.OmitVersionDelimiter) && - Version == obj.Version && - Architecture == obj.Architecture && - Qualifier == obj.Qualifier); - - } - - public override int GetHashCode() - { -#if NETFRAMEWORK - return BaseRID.GetHashCode(); -#else - HashCode hashCode = default; - hashCode.Add(BaseRID); - hashCode.Add(Version); - hashCode.Add(Architecture); - hashCode.Add(Qualifier); - return hashCode.ToHashCode(); -#endif - } - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/RuntimeGroup.cs b/src/libraries/Microsoft.NETCore.Platforms/src/RuntimeGroup.cs deleted file mode 100644 index 9d5c169cb526df..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/src/RuntimeGroup.cs +++ /dev/null @@ -1,298 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Build.Framework; -using NuGet.RuntimeModel; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Microsoft.NETCore.Platforms.BuildTasks -{ - public class RuntimeGroup - { - private const string rootRID = "any"; - - public RuntimeGroup(ITaskItem item) - { - BaseRID = item.ItemSpec; - Parent = item.GetString(nameof(Parent)); - Versions = new HashSet(item.GetStrings(nameof(Versions)).Select(v => new RuntimeVersion(v))); - TreatVersionsAsCompatible = item.GetBoolean(nameof(TreatVersionsAsCompatible), true); - OmitVersionDelimiter = item.GetBoolean(nameof(OmitVersionDelimiter)); - ApplyVersionsToParent = item.GetBoolean(nameof(ApplyVersionsToParent)); - Architectures = new HashSet(item.GetStrings(nameof(Architectures))); - AdditionalQualifiers = new HashSet(item.GetStrings(nameof(AdditionalQualifiers))); - OmitRIDs = new HashSet(item.GetStrings(nameof(OmitRIDs))); - OmitRIDDefinitions = new HashSet(item.GetStrings(nameof(OmitRIDDefinitions))); - OmitRIDReferences = new HashSet(item.GetStrings(nameof(OmitRIDReferences))); - } - - public RuntimeGroup(string baseRID, string parent, bool treatVersionsAsCompatible = true, bool omitVersionDelimiter = false, bool applyVersionsToParent = false, IEnumerable additionalQualifiers = null) - { - BaseRID = baseRID; - Parent = parent; - Versions = new HashSet(); - TreatVersionsAsCompatible = treatVersionsAsCompatible; - OmitVersionDelimiter = omitVersionDelimiter; - ApplyVersionsToParent = applyVersionsToParent; - Architectures = new HashSet(); - AdditionalQualifiers = new HashSet(additionalQualifiers.NullAsEmpty()); - OmitRIDs = new HashSet(); - OmitRIDDefinitions = new HashSet(); - OmitRIDReferences = new HashSet(); - } - - public string BaseRID { get; } - public string Parent { get; } - public ICollection Versions { get; } - public bool TreatVersionsAsCompatible { get; } - public bool OmitVersionDelimiter { get; } - public bool ApplyVersionsToParent { get; } - public ICollection Architectures { get; } - public ICollection AdditionalQualifiers { get; } - public ICollection OmitRIDs { get; } - public ICollection OmitRIDDefinitions { get; } - public ICollection OmitRIDReferences { get; } - - public void ApplyRid(RID rid) - { - if (!rid.BaseRID.Equals(BaseRID, StringComparison.Ordinal)) - { - throw new ArgumentException($"Cannot apply {nameof(RID)} with {nameof(RID.BaseRID)} {rid.BaseRID} to {nameof(RuntimeGroup)} with {nameof(RuntimeGroup.BaseRID)} {BaseRID}.", nameof(rid)); - } - - if (rid.HasArchitecture) - { - Architectures.Add(rid.Architecture); - } - - if (rid.HasVersion) - { - Versions.Add(rid.Version); - } - - if (rid.HasQualifier) - { - AdditionalQualifiers.Add(rid.Qualifier); - } - } - - internal sealed class RIDMapping - { - public RIDMapping(RID runtimeIdentifier) - { - RuntimeIdentifier = runtimeIdentifier; - Imports = Enumerable.Empty(); - } - - public RIDMapping(RID runtimeIdentifier, IEnumerable imports) - { - RuntimeIdentifier = runtimeIdentifier; - Imports = imports; - } - - public RID RuntimeIdentifier { get; } - - public IEnumerable Imports { get; } - } - - - internal RID CreateRuntime(string baseRid, RuntimeVersion version = null, string architecture = null, string qualifier = null) - { - return new RID() - { - BaseRID = baseRid, - Version = version, - OmitVersionDelimiter = OmitVersionDelimiter, - Architecture = architecture, - Qualifier = qualifier - }; - } - - internal IEnumerable GetRIDMappings() - { - // base => - // Parent - yield return Parent == null ? - new RIDMapping(CreateRuntime(BaseRID)) : - new RIDMapping(CreateRuntime(BaseRID), new[] { CreateRuntime(Parent) }); - - foreach (var architecture in Architectures) - { - // base + arch => - // base, - // parent + arch - var imports = new List() - { - CreateRuntime(BaseRID) - }; - - if (!IsNullOrRoot(Parent)) - { - imports.Add(CreateRuntime(Parent, architecture: architecture)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, architecture: architecture), imports); - } - - RuntimeVersion lastVersion = null; - foreach (var version in Versions) - { - // base + version => - // base + lastVersion, - // parent + version (optionally) - var imports = new List() - { - CreateRuntime(BaseRID, version: lastVersion) - }; - - if (ApplyVersionsToParent) - { - imports.Add(CreateRuntime(Parent, version: version)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, version: version), imports); - - foreach (var architecture in Architectures) - { - // base + version + architecture => - // base + version, - // base + lastVersion + architecture, - // parent + version + architecture (optionally) - var archImports = new List() - { - CreateRuntime(BaseRID, version: version), - CreateRuntime(BaseRID, version: lastVersion, architecture: architecture) - }; - - if (ApplyVersionsToParent) - { - archImports.Add(CreateRuntime(Parent, version: version, architecture: architecture)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, version: version, architecture: architecture), archImports); - } - - if (TreatVersionsAsCompatible) - { - lastVersion = version; - } - } - - foreach (var qualifier in AdditionalQualifiers) - { - // base + qual => - // base, - // parent + qual - yield return new RIDMapping(CreateRuntime(BaseRID, qualifier: qualifier), - new[] - { - CreateRuntime(BaseRID), - IsNullOrRoot(Parent) ? CreateRuntime(qualifier) : CreateRuntime(Parent, qualifier:qualifier) - }); - - foreach (var architecture in Architectures) - { - // base + arch + qualifier => - // base + qualifier, - // base + arch - // parent + arch + qualifier - var imports = new List() - { - CreateRuntime(BaseRID, qualifier: qualifier), - CreateRuntime(BaseRID, architecture: architecture) - }; - - if (!IsNullOrRoot(Parent)) - { - imports.Add(CreateRuntime(Parent, architecture: architecture, qualifier: qualifier)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, architecture: architecture, qualifier: qualifier), imports); - } - - lastVersion = null; - foreach (var version in Versions) - { - // base + version + qualifier => - // base + version, - // base + lastVersion + qualifier - // parent + version + qualifier (optionally) - var imports = new List() - { - CreateRuntime(BaseRID, version: version), - CreateRuntime(BaseRID, version: lastVersion, qualifier: qualifier) - }; - - if (ApplyVersionsToParent) - { - imports.Add(CreateRuntime(Parent, version: version, qualifier: qualifier)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, version: version, qualifier: qualifier), imports); - - foreach (var architecture in Architectures) - { - // base + version + architecture + qualifier => - // base + version + qualifier, - // base + version + architecture, - // base + version, - // base + lastVersion + architecture + qualifier, - // parent + version + architecture + qualifier (optionally) - var archImports = new List() - { - CreateRuntime(BaseRID, version: version, qualifier: qualifier), - CreateRuntime(BaseRID, version: version, architecture: architecture), - CreateRuntime(BaseRID, version: version), - CreateRuntime(BaseRID, version: lastVersion, architecture: architecture, qualifier: qualifier) - }; - - if (ApplyVersionsToParent) - { - imports.Add(CreateRuntime(Parent, version: version, architecture: architecture, qualifier: qualifier)); - } - - yield return new RIDMapping(CreateRuntime(BaseRID, version: version, architecture: architecture, qualifier: qualifier), archImports); - } - - if (TreatVersionsAsCompatible) - { - lastVersion = version; - } - } - } - } - - private static bool IsNullOrRoot(string rid) - { - return rid == null || rid == rootRID; - } - - - public IEnumerable GetRuntimeDescriptions() - { - foreach (var mapping in GetRIDMappings()) - { - var rid = mapping.RuntimeIdentifier.ToString(); - - if (OmitRIDs.Contains(rid) || OmitRIDDefinitions.Contains(rid)) - { - continue; - } - - var imports = mapping.Imports - .Select(i => i.ToString()) - .Where(i => !OmitRIDs.Contains(i) && !OmitRIDReferences.Contains(i)) - .ToArray(); - - yield return new RuntimeDescription(rid, imports); - } - } - - public RuntimeGraph GetRuntimeGraph() - { - return new RuntimeGraph(GetRuntimeDescriptions()); - } - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/RuntimeGroupCollection.cs b/src/libraries/Microsoft.NETCore.Platforms/src/RuntimeGroupCollection.cs deleted file mode 100644 index ec4762d71424cd..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/src/RuntimeGroupCollection.cs +++ /dev/null @@ -1,160 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Build.Framework; -using NuGet.RuntimeModel; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; - -namespace Microsoft.NETCore.Platforms.BuildTasks -{ - public class RuntimeGroupCollection - { - private readonly ICollection allRuntimeGroups; - private readonly Dictionary> runtimeGroupsByBaseRID; - private readonly HashSet knownRIDs; - - public RuntimeGroupCollection(ICollection runtimeGroups) - { - allRuntimeGroups = runtimeGroups; - runtimeGroupsByBaseRID = runtimeGroups.GroupBy(rg => rg.BaseRID).ToDictionary(g => g.Key, g => new List(g.AsEnumerable())); - - knownRIDs = new HashSet(allRuntimeGroups.SelectMany(rg => rg.GetRIDMappings()).Select(mapping => mapping.RuntimeIdentifier)); - } - - /// - /// Locate an existing RuntimeGroup to append to. - /// Existing group must have matching baseRID, then we choose based on closest version, - /// and prefer matching arch and qualifier. - /// If no match is found, then a new RID hierarchy is created. - /// - /// - /// - public void AddRuntimeIdentifier(string runtimeIdentifier, string parent) - { - // don't parse qualifier since we don't use them and they are ambiguous with `-` in base RID - RID rid = RID.Parse(runtimeIdentifier, noQualifier: true); - - AddRuntimeIdentifier(rid, parent); - } - - public void AddRuntimeIdentifier(RID rid, string parent) - { - // Do nothing if we already know about the RID - if (knownRIDs.Contains(rid)) - { - return; - } - - RuntimeGroup runtimeGroup = null; - - if (runtimeGroupsByBaseRID.TryGetValue(rid.BaseRID, out var candidateRuntimeGroups)) - { - RuntimeVersion closestVersion = null; - - foreach (var candidate in candidateRuntimeGroups) - { - if (rid.HasVersion) - { - // Find the closest previous version - foreach (var version in candidate.Versions) - { - // a previous version - if (version <= rid.Version) - { - // haven't yet found a match or this is a closer match - if (closestVersion == null || version > closestVersion) - { - closestVersion = version; - runtimeGroup = candidate; - } - else if (version == closestVersion) - { - // found a tie in version, examine other fields - considerCandidate(); - } - } - } - } - - // if we don't have a version, or if we couldn't find any match, consider other fields - if (!rid.HasVersion) - { - considerCandidate(); - } - - // if we don't have a match yet, take this as it matches on baseRID - runtimeGroup ??= candidate; - - void considerCandidate() - { - // is this a better match? - if (!rid.HasArchitecture || candidate.Architectures.Contains(rid.Architecture)) - { - if (!rid.HasQualifier || candidate.AdditionalQualifiers.Contains(rid.Qualifier)) - { - // matched on arch and qualifier. - runtimeGroup = candidate; - } - else if (rid.HasArchitecture && !runtimeGroup.Architectures.Contains(rid.Architecture)) - { - // matched only on arch and existing match doesn't match arch - runtimeGroup = candidate; - } - } - } - } - - Debug.Assert(runtimeGroup != null, "Empty candidates?"); - } - else - { - // This is an unknown base RID, we'll need to add a new group. - if (string.IsNullOrEmpty(parent)) - { - throw new InvalidOperationException($"AdditionalRuntimeIdentifier {rid} was specified, which could not be found in any existing {nameof(RuntimeGroup)}, and no {nameof(parent)} was specified."); - } - - runtimeGroup = new RuntimeGroup(rid.BaseRID, parent); - - AddRuntimeGroup(runtimeGroup); - } - - runtimeGroup.ApplyRid(rid); - - // Compute the portion of the RID graph produced from this modified RuntimeGroup - var ridMappings = runtimeGroup.GetRIDMappings(); - - // Record any newly defined RIDs in our set of known RIDs - foreach (RID definedRID in ridMappings.Select(mapping => mapping.RuntimeIdentifier)) - { - knownRIDs.Add(definedRID); - } - - // Make sure that any RID imported is added as well. This allows users to specify - // a single new RID and we'll add any new RIDs up the parent chain that might be needed. - foreach (RID importedRID in ridMappings.SelectMany(mapping => mapping.Imports)) - { - // This should not introduce any new RuntimeGroups, so we specify parent as null - AddRuntimeIdentifier(importedRID, null); - } - - } - - private void AddRuntimeGroup(RuntimeGroup runtimeGroup) - { - List baseRuntimeGroups; - - if (!runtimeGroupsByBaseRID.TryGetValue(runtimeGroup.BaseRID, out baseRuntimeGroups)) - { - runtimeGroupsByBaseRID[runtimeGroup.BaseRID] = baseRuntimeGroups = new List(); - } - - baseRuntimeGroups.Add(runtimeGroup); - allRuntimeGroups.Add(runtimeGroup); - } - - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/RuntimeVersion.cs b/src/libraries/Microsoft.NETCore.Platforms/src/RuntimeVersion.cs deleted file mode 100644 index ca7b1dbd47406c..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/src/RuntimeVersion.cs +++ /dev/null @@ -1,140 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; - -namespace Microsoft.NETCore.Platforms.BuildTasks -{ - - /// - /// A Version class that also supports a single integer (major only) - /// - public sealed class RuntimeVersion : IComparable, IComparable, IEquatable - { - private readonly string versionString; - private readonly Version version; - private readonly bool hasMinor; - - public RuntimeVersion(string versionString) - { - // intentionally don't support the type of version that omits the separators as it is abiguous. - // for example Windows 8.1 was encoded as win81, where as Windows 10.0 was encoded as win10 - this.versionString = versionString; - string toParse = versionString; -#if NETCOREAPP - if (!toParse.Contains('.')) -#else - if (toParse.IndexOf('.') == -1) -#endif - { - toParse += ".0"; - hasMinor = false; - } - else - { - hasMinor = true; - } - version = Version.Parse(toParse); - } - - public int CompareTo(object obj) - { - if (obj == null) - { - return 1; - } - - if (obj is RuntimeVersion version) - { - return CompareTo(version); - } - - throw new ArgumentException($"Cannot compare {nameof(RuntimeVersion)} to object of type {obj.GetType()}.", nameof(obj)); - } - - public int CompareTo(RuntimeVersion other) - { - if (other == null) - { - return 1; - } - - int versionResult = version.CompareTo(other?.version); - - if (versionResult == 0) - { - if (!hasMinor && other.hasMinor) - { - return -1; - } - - if (hasMinor && !other.hasMinor) - { - return 1; - } - - return string.CompareOrdinal(versionString, other.versionString); - } - - return versionResult; - } - - public bool Equals(RuntimeVersion other) - { - return object.ReferenceEquals(other, this) || - (other != null && - versionString.Equals(other.versionString, StringComparison.Ordinal)); - } - - public override bool Equals(object obj) - { - return Equals(obj as RuntimeVersion); - } - - public override int GetHashCode() - { - return versionString.GetHashCode(); - } - - public override string ToString() - { - return versionString; - } - - public static bool operator ==(RuntimeVersion v1, RuntimeVersion v2) - { - if (v2 is null) - { - return (v1 is null) ? true : false; - } - - return ReferenceEquals(v2, v1) ? true : v2.Equals(v1); - } - - public static bool operator !=(RuntimeVersion v1, RuntimeVersion v2) => !(v1 == v2); - - public static bool operator <(RuntimeVersion v1, RuntimeVersion v2) - { - if (v1 is null) - { - return !(v2 is null); - } - - return v1.CompareTo(v2) < 0; - } - - public static bool operator <=(RuntimeVersion v1, RuntimeVersion v2) - { - if (v1 is null) - { - return true; - } - - return v1.CompareTo(v2) <= 0; - } - - public static bool operator >(RuntimeVersion v1, RuntimeVersion v2) => v2 < v1; - - public static bool operator >=(RuntimeVersion v1, RuntimeVersion v2) => v2 <= v1; - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/UpdateRuntimeIdentifierGraph.cs b/src/libraries/Microsoft.NETCore.Platforms/src/UpdateRuntimeIdentifierGraph.cs new file mode 100644 index 00000000000000..867da09df9b670 --- /dev/null +++ b/src/libraries/Microsoft.NETCore.Platforms/src/UpdateRuntimeIdentifierGraph.cs @@ -0,0 +1,54 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.IO; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Microsoft.NETCore.Platforms +{ + public class UpdateRuntimeIdentifierGraph : Task + { + [Required] + public string? InputFile { get; set; } + + [Required] + public string? OutputFile { get; set; } + + // ItemSpec should be a RID, and "Imports" metadata should be a semicolon-separated list of RIDs that the ItemSpec RID imports + [Required] + public ITaskItem[]? AdditionalRuntimeIdentifiers { get; set; } + + public override bool Execute() + { + JToken json; + + using (StreamReader streamReader = File.OpenText(InputFile!)) + using (JsonTextReader jsonReader = new JsonTextReader(streamReader)) + { + json = JObject.ReadFrom(jsonReader); + } + + JObject runtimes = (JObject)json["runtimes"]!; + foreach (ITaskItem rid in AdditionalRuntimeIdentifiers!) + { + // Skip the RID if it's already in the graph + if (runtimes.ContainsKey(rid.ItemSpec)) + { + continue; + } + + string[] importedRids = rid.GetMetadata("Imports").Split(';'); + runtimes.Add(rid.ItemSpec, new JObject(new JProperty("#import", new JArray(importedRids)))); + } + + using StreamWriter streamWriter = File.CreateText(OutputFile!); + using JsonTextWriter jsonWriter = new(streamWriter) { Formatting = Formatting.Indented }; + json.WriteTo(jsonWriter); + + return true; + } + } +} diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json b/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json deleted file mode 100644 index 085cb7b518ff72..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/src/runtime.compatibility.json +++ /dev/null @@ -1,11768 +0,0 @@ -{ - "alpine": [ - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine-arm": [ - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine-arm64": [ - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine-armv6": [ - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine-ppc64le": [ - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine-s390x": [ - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine-x64": [ - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine-x86": [ - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.10": [ - "alpine.3.10", - "alpine.3.9", - "alpine.3.8", - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.10-arm": [ - "alpine.3.10-arm", - "alpine.3.10", - "alpine.3.9-arm", - "alpine.3.9", - "alpine.3.8-arm", - "alpine.3.8", - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.10-arm64": [ - "alpine.3.10-arm64", - "alpine.3.10", - "alpine.3.9-arm64", - "alpine.3.9", - "alpine.3.8-arm64", - "alpine.3.8", - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.10-armv6": [ - "alpine.3.10-armv6", - "alpine.3.10", - "alpine.3.9-armv6", - "alpine.3.9", - "alpine.3.8-armv6", - "alpine.3.8", - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.10-ppc64le": [ - "alpine.3.10-ppc64le", - "alpine.3.10", - "alpine.3.9-ppc64le", - "alpine.3.9", - "alpine.3.8-ppc64le", - "alpine.3.8", - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.10-s390x": [ - "alpine.3.10-s390x", - "alpine.3.10", - "alpine.3.9-s390x", - "alpine.3.9", - "alpine.3.8-s390x", - "alpine.3.8", - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.10-x64": [ - "alpine.3.10-x64", - "alpine.3.10", - "alpine.3.9-x64", - "alpine.3.9", - "alpine.3.8-x64", - "alpine.3.8", - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.10-x86": [ - "alpine.3.10-x86", - "alpine.3.10", - "alpine.3.9-x86", - "alpine.3.9", - "alpine.3.8-x86", - "alpine.3.8", - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.11": [ - "alpine.3.11", - "alpine.3.10", - "alpine.3.9", - "alpine.3.8", - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.11-arm": [ - "alpine.3.11-arm", - "alpine.3.11", - "alpine.3.10-arm", - "alpine.3.10", - "alpine.3.9-arm", - "alpine.3.9", - "alpine.3.8-arm", - "alpine.3.8", - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.11-arm64": [ - "alpine.3.11-arm64", - "alpine.3.11", - "alpine.3.10-arm64", - "alpine.3.10", - "alpine.3.9-arm64", - "alpine.3.9", - "alpine.3.8-arm64", - "alpine.3.8", - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.11-armv6": [ - "alpine.3.11-armv6", - "alpine.3.11", - "alpine.3.10-armv6", - "alpine.3.10", - "alpine.3.9-armv6", - "alpine.3.9", - "alpine.3.8-armv6", - "alpine.3.8", - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.11-ppc64le": [ - "alpine.3.11-ppc64le", - "alpine.3.11", - "alpine.3.10-ppc64le", - "alpine.3.10", - "alpine.3.9-ppc64le", - "alpine.3.9", - "alpine.3.8-ppc64le", - "alpine.3.8", - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.11-s390x": [ - "alpine.3.11-s390x", - "alpine.3.11", - "alpine.3.10-s390x", - "alpine.3.10", - "alpine.3.9-s390x", - "alpine.3.9", - "alpine.3.8-s390x", - "alpine.3.8", - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.11-x64": [ - "alpine.3.11-x64", - "alpine.3.11", - "alpine.3.10-x64", - "alpine.3.10", - "alpine.3.9-x64", - "alpine.3.9", - "alpine.3.8-x64", - "alpine.3.8", - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.11-x86": [ - "alpine.3.11-x86", - "alpine.3.11", - "alpine.3.10-x86", - "alpine.3.10", - "alpine.3.9-x86", - "alpine.3.9", - "alpine.3.8-x86", - "alpine.3.8", - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.12": [ - "alpine.3.12", - "alpine.3.11", - "alpine.3.10", - "alpine.3.9", - "alpine.3.8", - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.12-arm": [ - "alpine.3.12-arm", - "alpine.3.12", - "alpine.3.11-arm", - "alpine.3.11", - "alpine.3.10-arm", - "alpine.3.10", - "alpine.3.9-arm", - "alpine.3.9", - "alpine.3.8-arm", - "alpine.3.8", - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.12-arm64": [ - "alpine.3.12-arm64", - "alpine.3.12", - "alpine.3.11-arm64", - "alpine.3.11", - "alpine.3.10-arm64", - "alpine.3.10", - "alpine.3.9-arm64", - "alpine.3.9", - "alpine.3.8-arm64", - "alpine.3.8", - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.12-armv6": [ - "alpine.3.12-armv6", - "alpine.3.12", - "alpine.3.11-armv6", - "alpine.3.11", - "alpine.3.10-armv6", - "alpine.3.10", - "alpine.3.9-armv6", - "alpine.3.9", - "alpine.3.8-armv6", - "alpine.3.8", - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.12-ppc64le": [ - "alpine.3.12-ppc64le", - "alpine.3.12", - "alpine.3.11-ppc64le", - "alpine.3.11", - "alpine.3.10-ppc64le", - "alpine.3.10", - "alpine.3.9-ppc64le", - "alpine.3.9", - "alpine.3.8-ppc64le", - "alpine.3.8", - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.12-s390x": [ - "alpine.3.12-s390x", - "alpine.3.12", - "alpine.3.11-s390x", - "alpine.3.11", - "alpine.3.10-s390x", - "alpine.3.10", - "alpine.3.9-s390x", - "alpine.3.9", - "alpine.3.8-s390x", - "alpine.3.8", - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.12-x64": [ - "alpine.3.12-x64", - "alpine.3.12", - "alpine.3.11-x64", - "alpine.3.11", - "alpine.3.10-x64", - "alpine.3.10", - "alpine.3.9-x64", - "alpine.3.9", - "alpine.3.8-x64", - "alpine.3.8", - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.12-x86": [ - "alpine.3.12-x86", - "alpine.3.12", - "alpine.3.11-x86", - "alpine.3.11", - "alpine.3.10-x86", - "alpine.3.10", - "alpine.3.9-x86", - "alpine.3.9", - "alpine.3.8-x86", - "alpine.3.8", - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.13": [ - "alpine.3.13", - "alpine.3.12", - "alpine.3.11", - "alpine.3.10", - "alpine.3.9", - "alpine.3.8", - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.13-arm": [ - "alpine.3.13-arm", - "alpine.3.13", - "alpine.3.12-arm", - "alpine.3.12", - "alpine.3.11-arm", - "alpine.3.11", - "alpine.3.10-arm", - "alpine.3.10", - "alpine.3.9-arm", - "alpine.3.9", - "alpine.3.8-arm", - "alpine.3.8", - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.13-arm64": [ - "alpine.3.13-arm64", - "alpine.3.13", - "alpine.3.12-arm64", - "alpine.3.12", - "alpine.3.11-arm64", - "alpine.3.11", - "alpine.3.10-arm64", - "alpine.3.10", - "alpine.3.9-arm64", - "alpine.3.9", - "alpine.3.8-arm64", - "alpine.3.8", - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.13-armv6": [ - "alpine.3.13-armv6", - "alpine.3.13", - "alpine.3.12-armv6", - "alpine.3.12", - "alpine.3.11-armv6", - "alpine.3.11", - "alpine.3.10-armv6", - "alpine.3.10", - "alpine.3.9-armv6", - "alpine.3.9", - "alpine.3.8-armv6", - "alpine.3.8", - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.13-ppc64le": [ - "alpine.3.13-ppc64le", - "alpine.3.13", - "alpine.3.12-ppc64le", - "alpine.3.12", - "alpine.3.11-ppc64le", - "alpine.3.11", - "alpine.3.10-ppc64le", - "alpine.3.10", - "alpine.3.9-ppc64le", - "alpine.3.9", - "alpine.3.8-ppc64le", - "alpine.3.8", - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.13-s390x": [ - "alpine.3.13-s390x", - "alpine.3.13", - "alpine.3.12-s390x", - "alpine.3.12", - "alpine.3.11-s390x", - "alpine.3.11", - "alpine.3.10-s390x", - "alpine.3.10", - "alpine.3.9-s390x", - "alpine.3.9", - "alpine.3.8-s390x", - "alpine.3.8", - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.13-x64": [ - "alpine.3.13-x64", - "alpine.3.13", - "alpine.3.12-x64", - "alpine.3.12", - "alpine.3.11-x64", - "alpine.3.11", - "alpine.3.10-x64", - "alpine.3.10", - "alpine.3.9-x64", - "alpine.3.9", - "alpine.3.8-x64", - "alpine.3.8", - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.13-x86": [ - "alpine.3.13-x86", - "alpine.3.13", - "alpine.3.12-x86", - "alpine.3.12", - "alpine.3.11-x86", - "alpine.3.11", - "alpine.3.10-x86", - "alpine.3.10", - "alpine.3.9-x86", - "alpine.3.9", - "alpine.3.8-x86", - "alpine.3.8", - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.14": [ - "alpine.3.14", - "alpine.3.13", - "alpine.3.12", - "alpine.3.11", - "alpine.3.10", - "alpine.3.9", - "alpine.3.8", - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.14-arm": [ - "alpine.3.14-arm", - "alpine.3.14", - "alpine.3.13-arm", - "alpine.3.13", - "alpine.3.12-arm", - "alpine.3.12", - "alpine.3.11-arm", - "alpine.3.11", - "alpine.3.10-arm", - "alpine.3.10", - "alpine.3.9-arm", - "alpine.3.9", - "alpine.3.8-arm", - "alpine.3.8", - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.14-arm64": [ - "alpine.3.14-arm64", - "alpine.3.14", - "alpine.3.13-arm64", - "alpine.3.13", - "alpine.3.12-arm64", - "alpine.3.12", - "alpine.3.11-arm64", - "alpine.3.11", - "alpine.3.10-arm64", - "alpine.3.10", - "alpine.3.9-arm64", - "alpine.3.9", - "alpine.3.8-arm64", - "alpine.3.8", - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.14-armv6": [ - "alpine.3.14-armv6", - "alpine.3.14", - "alpine.3.13-armv6", - "alpine.3.13", - "alpine.3.12-armv6", - "alpine.3.12", - "alpine.3.11-armv6", - "alpine.3.11", - "alpine.3.10-armv6", - "alpine.3.10", - "alpine.3.9-armv6", - "alpine.3.9", - "alpine.3.8-armv6", - "alpine.3.8", - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.14-ppc64le": [ - "alpine.3.14-ppc64le", - "alpine.3.14", - "alpine.3.13-ppc64le", - "alpine.3.13", - "alpine.3.12-ppc64le", - "alpine.3.12", - "alpine.3.11-ppc64le", - "alpine.3.11", - "alpine.3.10-ppc64le", - "alpine.3.10", - "alpine.3.9-ppc64le", - "alpine.3.9", - "alpine.3.8-ppc64le", - "alpine.3.8", - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.14-s390x": [ - "alpine.3.14-s390x", - "alpine.3.14", - "alpine.3.13-s390x", - "alpine.3.13", - "alpine.3.12-s390x", - "alpine.3.12", - "alpine.3.11-s390x", - "alpine.3.11", - "alpine.3.10-s390x", - "alpine.3.10", - "alpine.3.9-s390x", - "alpine.3.9", - "alpine.3.8-s390x", - "alpine.3.8", - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.14-x64": [ - "alpine.3.14-x64", - "alpine.3.14", - "alpine.3.13-x64", - "alpine.3.13", - "alpine.3.12-x64", - "alpine.3.12", - "alpine.3.11-x64", - "alpine.3.11", - "alpine.3.10-x64", - "alpine.3.10", - "alpine.3.9-x64", - "alpine.3.9", - "alpine.3.8-x64", - "alpine.3.8", - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.14-x86": [ - "alpine.3.14-x86", - "alpine.3.14", - "alpine.3.13-x86", - "alpine.3.13", - "alpine.3.12-x86", - "alpine.3.12", - "alpine.3.11-x86", - "alpine.3.11", - "alpine.3.10-x86", - "alpine.3.10", - "alpine.3.9-x86", - "alpine.3.9", - "alpine.3.8-x86", - "alpine.3.8", - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.15": [ - "alpine.3.15", - "alpine.3.14", - "alpine.3.13", - "alpine.3.12", - "alpine.3.11", - "alpine.3.10", - "alpine.3.9", - "alpine.3.8", - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.15-arm": [ - "alpine.3.15-arm", - "alpine.3.15", - "alpine.3.14-arm", - "alpine.3.14", - "alpine.3.13-arm", - "alpine.3.13", - "alpine.3.12-arm", - "alpine.3.12", - "alpine.3.11-arm", - "alpine.3.11", - "alpine.3.10-arm", - "alpine.3.10", - "alpine.3.9-arm", - "alpine.3.9", - "alpine.3.8-arm", - "alpine.3.8", - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.15-arm64": [ - "alpine.3.15-arm64", - "alpine.3.15", - "alpine.3.14-arm64", - "alpine.3.14", - "alpine.3.13-arm64", - "alpine.3.13", - "alpine.3.12-arm64", - "alpine.3.12", - "alpine.3.11-arm64", - "alpine.3.11", - "alpine.3.10-arm64", - "alpine.3.10", - "alpine.3.9-arm64", - "alpine.3.9", - "alpine.3.8-arm64", - "alpine.3.8", - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.15-armv6": [ - "alpine.3.15-armv6", - "alpine.3.15", - "alpine.3.14-armv6", - "alpine.3.14", - "alpine.3.13-armv6", - "alpine.3.13", - "alpine.3.12-armv6", - "alpine.3.12", - "alpine.3.11-armv6", - "alpine.3.11", - "alpine.3.10-armv6", - "alpine.3.10", - "alpine.3.9-armv6", - "alpine.3.9", - "alpine.3.8-armv6", - "alpine.3.8", - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.15-ppc64le": [ - "alpine.3.15-ppc64le", - "alpine.3.15", - "alpine.3.14-ppc64le", - "alpine.3.14", - "alpine.3.13-ppc64le", - "alpine.3.13", - "alpine.3.12-ppc64le", - "alpine.3.12", - "alpine.3.11-ppc64le", - "alpine.3.11", - "alpine.3.10-ppc64le", - "alpine.3.10", - "alpine.3.9-ppc64le", - "alpine.3.9", - "alpine.3.8-ppc64le", - "alpine.3.8", - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.15-s390x": [ - "alpine.3.15-s390x", - "alpine.3.15", - "alpine.3.14-s390x", - "alpine.3.14", - "alpine.3.13-s390x", - "alpine.3.13", - "alpine.3.12-s390x", - "alpine.3.12", - "alpine.3.11-s390x", - "alpine.3.11", - "alpine.3.10-s390x", - "alpine.3.10", - "alpine.3.9-s390x", - "alpine.3.9", - "alpine.3.8-s390x", - "alpine.3.8", - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.15-x64": [ - "alpine.3.15-x64", - "alpine.3.15", - "alpine.3.14-x64", - "alpine.3.14", - "alpine.3.13-x64", - "alpine.3.13", - "alpine.3.12-x64", - "alpine.3.12", - "alpine.3.11-x64", - "alpine.3.11", - "alpine.3.10-x64", - "alpine.3.10", - "alpine.3.9-x64", - "alpine.3.9", - "alpine.3.8-x64", - "alpine.3.8", - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.15-x86": [ - "alpine.3.15-x86", - "alpine.3.15", - "alpine.3.14-x86", - "alpine.3.14", - "alpine.3.13-x86", - "alpine.3.13", - "alpine.3.12-x86", - "alpine.3.12", - "alpine.3.11-x86", - "alpine.3.11", - "alpine.3.10-x86", - "alpine.3.10", - "alpine.3.9-x86", - "alpine.3.9", - "alpine.3.8-x86", - "alpine.3.8", - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.16": [ - "alpine.3.16", - "alpine.3.15", - "alpine.3.14", - "alpine.3.13", - "alpine.3.12", - "alpine.3.11", - "alpine.3.10", - "alpine.3.9", - "alpine.3.8", - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.16-arm": [ - "alpine.3.16-arm", - "alpine.3.16", - "alpine.3.15-arm", - "alpine.3.15", - "alpine.3.14-arm", - "alpine.3.14", - "alpine.3.13-arm", - "alpine.3.13", - "alpine.3.12-arm", - "alpine.3.12", - "alpine.3.11-arm", - "alpine.3.11", - "alpine.3.10-arm", - "alpine.3.10", - "alpine.3.9-arm", - "alpine.3.9", - "alpine.3.8-arm", - "alpine.3.8", - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.16-arm64": [ - "alpine.3.16-arm64", - "alpine.3.16", - "alpine.3.15-arm64", - "alpine.3.15", - "alpine.3.14-arm64", - "alpine.3.14", - "alpine.3.13-arm64", - "alpine.3.13", - "alpine.3.12-arm64", - "alpine.3.12", - "alpine.3.11-arm64", - "alpine.3.11", - "alpine.3.10-arm64", - "alpine.3.10", - "alpine.3.9-arm64", - "alpine.3.9", - "alpine.3.8-arm64", - "alpine.3.8", - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.16-armv6": [ - "alpine.3.16-armv6", - "alpine.3.16", - "alpine.3.15-armv6", - "alpine.3.15", - "alpine.3.14-armv6", - "alpine.3.14", - "alpine.3.13-armv6", - "alpine.3.13", - "alpine.3.12-armv6", - "alpine.3.12", - "alpine.3.11-armv6", - "alpine.3.11", - "alpine.3.10-armv6", - "alpine.3.10", - "alpine.3.9-armv6", - "alpine.3.9", - "alpine.3.8-armv6", - "alpine.3.8", - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.16-ppc64le": [ - "alpine.3.16-ppc64le", - "alpine.3.16", - "alpine.3.15-ppc64le", - "alpine.3.15", - "alpine.3.14-ppc64le", - "alpine.3.14", - "alpine.3.13-ppc64le", - "alpine.3.13", - "alpine.3.12-ppc64le", - "alpine.3.12", - "alpine.3.11-ppc64le", - "alpine.3.11", - "alpine.3.10-ppc64le", - "alpine.3.10", - "alpine.3.9-ppc64le", - "alpine.3.9", - "alpine.3.8-ppc64le", - "alpine.3.8", - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.16-s390x": [ - "alpine.3.16-s390x", - "alpine.3.16", - "alpine.3.15-s390x", - "alpine.3.15", - "alpine.3.14-s390x", - "alpine.3.14", - "alpine.3.13-s390x", - "alpine.3.13", - "alpine.3.12-s390x", - "alpine.3.12", - "alpine.3.11-s390x", - "alpine.3.11", - "alpine.3.10-s390x", - "alpine.3.10", - "alpine.3.9-s390x", - "alpine.3.9", - "alpine.3.8-s390x", - "alpine.3.8", - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.16-x64": [ - "alpine.3.16-x64", - "alpine.3.16", - "alpine.3.15-x64", - "alpine.3.15", - "alpine.3.14-x64", - "alpine.3.14", - "alpine.3.13-x64", - "alpine.3.13", - "alpine.3.12-x64", - "alpine.3.12", - "alpine.3.11-x64", - "alpine.3.11", - "alpine.3.10-x64", - "alpine.3.10", - "alpine.3.9-x64", - "alpine.3.9", - "alpine.3.8-x64", - "alpine.3.8", - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.16-x86": [ - "alpine.3.16-x86", - "alpine.3.16", - "alpine.3.15-x86", - "alpine.3.15", - "alpine.3.14-x86", - "alpine.3.14", - "alpine.3.13-x86", - "alpine.3.13", - "alpine.3.12-x86", - "alpine.3.12", - "alpine.3.11-x86", - "alpine.3.11", - "alpine.3.10-x86", - "alpine.3.10", - "alpine.3.9-x86", - "alpine.3.9", - "alpine.3.8-x86", - "alpine.3.8", - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.17": [ - "alpine.3.17", - "alpine.3.16", - "alpine.3.15", - "alpine.3.14", - "alpine.3.13", - "alpine.3.12", - "alpine.3.11", - "alpine.3.10", - "alpine.3.9", - "alpine.3.8", - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.17-arm": [ - "alpine.3.17-arm", - "alpine.3.17", - "alpine.3.16-arm", - "alpine.3.16", - "alpine.3.15-arm", - "alpine.3.15", - "alpine.3.14-arm", - "alpine.3.14", - "alpine.3.13-arm", - "alpine.3.13", - "alpine.3.12-arm", - "alpine.3.12", - "alpine.3.11-arm", - "alpine.3.11", - "alpine.3.10-arm", - "alpine.3.10", - "alpine.3.9-arm", - "alpine.3.9", - "alpine.3.8-arm", - "alpine.3.8", - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.17-arm64": [ - "alpine.3.17-arm64", - "alpine.3.17", - "alpine.3.16-arm64", - "alpine.3.16", - "alpine.3.15-arm64", - "alpine.3.15", - "alpine.3.14-arm64", - "alpine.3.14", - "alpine.3.13-arm64", - "alpine.3.13", - "alpine.3.12-arm64", - "alpine.3.12", - "alpine.3.11-arm64", - "alpine.3.11", - "alpine.3.10-arm64", - "alpine.3.10", - "alpine.3.9-arm64", - "alpine.3.9", - "alpine.3.8-arm64", - "alpine.3.8", - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.17-armv6": [ - "alpine.3.17-armv6", - "alpine.3.17", - "alpine.3.16-armv6", - "alpine.3.16", - "alpine.3.15-armv6", - "alpine.3.15", - "alpine.3.14-armv6", - "alpine.3.14", - "alpine.3.13-armv6", - "alpine.3.13", - "alpine.3.12-armv6", - "alpine.3.12", - "alpine.3.11-armv6", - "alpine.3.11", - "alpine.3.10-armv6", - "alpine.3.10", - "alpine.3.9-armv6", - "alpine.3.9", - "alpine.3.8-armv6", - "alpine.3.8", - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.17-ppc64le": [ - "alpine.3.17-ppc64le", - "alpine.3.17", - "alpine.3.16-ppc64le", - "alpine.3.16", - "alpine.3.15-ppc64le", - "alpine.3.15", - "alpine.3.14-ppc64le", - "alpine.3.14", - "alpine.3.13-ppc64le", - "alpine.3.13", - "alpine.3.12-ppc64le", - "alpine.3.12", - "alpine.3.11-ppc64le", - "alpine.3.11", - "alpine.3.10-ppc64le", - "alpine.3.10", - "alpine.3.9-ppc64le", - "alpine.3.9", - "alpine.3.8-ppc64le", - "alpine.3.8", - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.17-s390x": [ - "alpine.3.17-s390x", - "alpine.3.17", - "alpine.3.16-s390x", - "alpine.3.16", - "alpine.3.15-s390x", - "alpine.3.15", - "alpine.3.14-s390x", - "alpine.3.14", - "alpine.3.13-s390x", - "alpine.3.13", - "alpine.3.12-s390x", - "alpine.3.12", - "alpine.3.11-s390x", - "alpine.3.11", - "alpine.3.10-s390x", - "alpine.3.10", - "alpine.3.9-s390x", - "alpine.3.9", - "alpine.3.8-s390x", - "alpine.3.8", - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.17-x64": [ - "alpine.3.17-x64", - "alpine.3.17", - "alpine.3.16-x64", - "alpine.3.16", - "alpine.3.15-x64", - "alpine.3.15", - "alpine.3.14-x64", - "alpine.3.14", - "alpine.3.13-x64", - "alpine.3.13", - "alpine.3.12-x64", - "alpine.3.12", - "alpine.3.11-x64", - "alpine.3.11", - "alpine.3.10-x64", - "alpine.3.10", - "alpine.3.9-x64", - "alpine.3.9", - "alpine.3.8-x64", - "alpine.3.8", - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.17-x86": [ - "alpine.3.17-x86", - "alpine.3.17", - "alpine.3.16-x86", - "alpine.3.16", - "alpine.3.15-x86", - "alpine.3.15", - "alpine.3.14-x86", - "alpine.3.14", - "alpine.3.13-x86", - "alpine.3.13", - "alpine.3.12-x86", - "alpine.3.12", - "alpine.3.11-x86", - "alpine.3.11", - "alpine.3.10-x86", - "alpine.3.10", - "alpine.3.9-x86", - "alpine.3.9", - "alpine.3.8-x86", - "alpine.3.8", - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.18": [ - "alpine.3.18", - "alpine.3.17", - "alpine.3.16", - "alpine.3.15", - "alpine.3.14", - "alpine.3.13", - "alpine.3.12", - "alpine.3.11", - "alpine.3.10", - "alpine.3.9", - "alpine.3.8", - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.18-arm": [ - "alpine.3.18-arm", - "alpine.3.18", - "alpine.3.17-arm", - "alpine.3.17", - "alpine.3.16-arm", - "alpine.3.16", - "alpine.3.15-arm", - "alpine.3.15", - "alpine.3.14-arm", - "alpine.3.14", - "alpine.3.13-arm", - "alpine.3.13", - "alpine.3.12-arm", - "alpine.3.12", - "alpine.3.11-arm", - "alpine.3.11", - "alpine.3.10-arm", - "alpine.3.10", - "alpine.3.9-arm", - "alpine.3.9", - "alpine.3.8-arm", - "alpine.3.8", - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.18-arm64": [ - "alpine.3.18-arm64", - "alpine.3.18", - "alpine.3.17-arm64", - "alpine.3.17", - "alpine.3.16-arm64", - "alpine.3.16", - "alpine.3.15-arm64", - "alpine.3.15", - "alpine.3.14-arm64", - "alpine.3.14", - "alpine.3.13-arm64", - "alpine.3.13", - "alpine.3.12-arm64", - "alpine.3.12", - "alpine.3.11-arm64", - "alpine.3.11", - "alpine.3.10-arm64", - "alpine.3.10", - "alpine.3.9-arm64", - "alpine.3.9", - "alpine.3.8-arm64", - "alpine.3.8", - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.18-armv6": [ - "alpine.3.18-armv6", - "alpine.3.18", - "alpine.3.17-armv6", - "alpine.3.17", - "alpine.3.16-armv6", - "alpine.3.16", - "alpine.3.15-armv6", - "alpine.3.15", - "alpine.3.14-armv6", - "alpine.3.14", - "alpine.3.13-armv6", - "alpine.3.13", - "alpine.3.12-armv6", - "alpine.3.12", - "alpine.3.11-armv6", - "alpine.3.11", - "alpine.3.10-armv6", - "alpine.3.10", - "alpine.3.9-armv6", - "alpine.3.9", - "alpine.3.8-armv6", - "alpine.3.8", - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.18-ppc64le": [ - "alpine.3.18-ppc64le", - "alpine.3.18", - "alpine.3.17-ppc64le", - "alpine.3.17", - "alpine.3.16-ppc64le", - "alpine.3.16", - "alpine.3.15-ppc64le", - "alpine.3.15", - "alpine.3.14-ppc64le", - "alpine.3.14", - "alpine.3.13-ppc64le", - "alpine.3.13", - "alpine.3.12-ppc64le", - "alpine.3.12", - "alpine.3.11-ppc64le", - "alpine.3.11", - "alpine.3.10-ppc64le", - "alpine.3.10", - "alpine.3.9-ppc64le", - "alpine.3.9", - "alpine.3.8-ppc64le", - "alpine.3.8", - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.18-s390x": [ - "alpine.3.18-s390x", - "alpine.3.18", - "alpine.3.17-s390x", - "alpine.3.17", - "alpine.3.16-s390x", - "alpine.3.16", - "alpine.3.15-s390x", - "alpine.3.15", - "alpine.3.14-s390x", - "alpine.3.14", - "alpine.3.13-s390x", - "alpine.3.13", - "alpine.3.12-s390x", - "alpine.3.12", - "alpine.3.11-s390x", - "alpine.3.11", - "alpine.3.10-s390x", - "alpine.3.10", - "alpine.3.9-s390x", - "alpine.3.9", - "alpine.3.8-s390x", - "alpine.3.8", - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.18-x64": [ - "alpine.3.18-x64", - "alpine.3.18", - "alpine.3.17-x64", - "alpine.3.17", - "alpine.3.16-x64", - "alpine.3.16", - "alpine.3.15-x64", - "alpine.3.15", - "alpine.3.14-x64", - "alpine.3.14", - "alpine.3.13-x64", - "alpine.3.13", - "alpine.3.12-x64", - "alpine.3.12", - "alpine.3.11-x64", - "alpine.3.11", - "alpine.3.10-x64", - "alpine.3.10", - "alpine.3.9-x64", - "alpine.3.9", - "alpine.3.8-x64", - "alpine.3.8", - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.18-x86": [ - "alpine.3.18-x86", - "alpine.3.18", - "alpine.3.17-x86", - "alpine.3.17", - "alpine.3.16-x86", - "alpine.3.16", - "alpine.3.15-x86", - "alpine.3.15", - "alpine.3.14-x86", - "alpine.3.14", - "alpine.3.13-x86", - "alpine.3.13", - "alpine.3.12-x86", - "alpine.3.12", - "alpine.3.11-x86", - "alpine.3.11", - "alpine.3.10-x86", - "alpine.3.10", - "alpine.3.9-x86", - "alpine.3.9", - "alpine.3.8-x86", - "alpine.3.8", - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.6": [ - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.6-arm": [ - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.6-arm64": [ - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.6-armv6": [ - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.6-ppc64le": [ - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.6-s390x": [ - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.6-x64": [ - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.6-x86": [ - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.7": [ - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.7-arm": [ - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.7-arm64": [ - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.7-armv6": [ - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.7-ppc64le": [ - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.7-s390x": [ - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.7-x64": [ - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.7-x86": [ - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.8": [ - "alpine.3.8", - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.8-arm": [ - "alpine.3.8-arm", - "alpine.3.8", - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.8-arm64": [ - "alpine.3.8-arm64", - "alpine.3.8", - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.8-armv6": [ - "alpine.3.8-armv6", - "alpine.3.8", - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.8-ppc64le": [ - "alpine.3.8-ppc64le", - "alpine.3.8", - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.8-s390x": [ - "alpine.3.8-s390x", - "alpine.3.8", - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.8-x64": [ - "alpine.3.8-x64", - "alpine.3.8", - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.8-x86": [ - "alpine.3.8-x86", - "alpine.3.8", - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "alpine.3.9": [ - "alpine.3.9", - "alpine.3.8", - "alpine.3.7", - "alpine.3.6", - "alpine", - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "alpine.3.9-arm": [ - "alpine.3.9-arm", - "alpine.3.9", - "alpine.3.8-arm", - "alpine.3.8", - "alpine.3.7-arm", - "alpine.3.7", - "alpine.3.6-arm", - "alpine.3.6", - "alpine-arm", - "alpine", - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "alpine.3.9-arm64": [ - "alpine.3.9-arm64", - "alpine.3.9", - "alpine.3.8-arm64", - "alpine.3.8", - "alpine.3.7-arm64", - "alpine.3.7", - "alpine.3.6-arm64", - "alpine.3.6", - "alpine-arm64", - "alpine", - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "alpine.3.9-armv6": [ - "alpine.3.9-armv6", - "alpine.3.9", - "alpine.3.8-armv6", - "alpine.3.8", - "alpine.3.7-armv6", - "alpine.3.7", - "alpine.3.6-armv6", - "alpine.3.6", - "alpine-armv6", - "alpine", - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "alpine.3.9-ppc64le": [ - "alpine.3.9-ppc64le", - "alpine.3.9", - "alpine.3.8-ppc64le", - "alpine.3.8", - "alpine.3.7-ppc64le", - "alpine.3.7", - "alpine.3.6-ppc64le", - "alpine.3.6", - "alpine-ppc64le", - "alpine", - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "alpine.3.9-s390x": [ - "alpine.3.9-s390x", - "alpine.3.9", - "alpine.3.8-s390x", - "alpine.3.8", - "alpine.3.7-s390x", - "alpine.3.7", - "alpine.3.6-s390x", - "alpine.3.6", - "alpine-s390x", - "alpine", - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "alpine.3.9-x64": [ - "alpine.3.9-x64", - "alpine.3.9", - "alpine.3.8-x64", - "alpine.3.8", - "alpine.3.7-x64", - "alpine.3.7", - "alpine.3.6-x64", - "alpine.3.6", - "alpine-x64", - "alpine", - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "alpine.3.9-x86": [ - "alpine.3.9-x86", - "alpine.3.9", - "alpine.3.8-x86", - "alpine.3.8", - "alpine.3.7-x86", - "alpine.3.7", - "alpine.3.6-x86", - "alpine.3.6", - "alpine-x86", - "alpine", - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android": [ - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android-arm": [ - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android-arm64": [ - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android-x64": [ - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android-x86": [ - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.21": [ - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.21-arm": [ - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.21-arm64": [ - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.21-x64": [ - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.21-x86": [ - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.22": [ - "android.22", - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.22-arm": [ - "android.22-arm", - "android.22", - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.22-arm64": [ - "android.22-arm64", - "android.22", - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.22-x64": [ - "android.22-x64", - "android.22", - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.22-x86": [ - "android.22-x86", - "android.22", - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.23": [ - "android.23", - "android.22", - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.23-arm": [ - "android.23-arm", - "android.23", - "android.22-arm", - "android.22", - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.23-arm64": [ - "android.23-arm64", - "android.23", - "android.22-arm64", - "android.22", - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.23-x64": [ - "android.23-x64", - "android.23", - "android.22-x64", - "android.22", - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.23-x86": [ - "android.23-x86", - "android.23", - "android.22-x86", - "android.22", - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.24": [ - "android.24", - "android.23", - "android.22", - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.24-arm": [ - "android.24-arm", - "android.24", - "android.23-arm", - "android.23", - "android.22-arm", - "android.22", - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.24-arm64": [ - "android.24-arm64", - "android.24", - "android.23-arm64", - "android.23", - "android.22-arm64", - "android.22", - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.24-x64": [ - "android.24-x64", - "android.24", - "android.23-x64", - "android.23", - "android.22-x64", - "android.22", - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.24-x86": [ - "android.24-x86", - "android.24", - "android.23-x86", - "android.23", - "android.22-x86", - "android.22", - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.25": [ - "android.25", - "android.24", - "android.23", - "android.22", - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.25-arm": [ - "android.25-arm", - "android.25", - "android.24-arm", - "android.24", - "android.23-arm", - "android.23", - "android.22-arm", - "android.22", - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.25-arm64": [ - "android.25-arm64", - "android.25", - "android.24-arm64", - "android.24", - "android.23-arm64", - "android.23", - "android.22-arm64", - "android.22", - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.25-x64": [ - "android.25-x64", - "android.25", - "android.24-x64", - "android.24", - "android.23-x64", - "android.23", - "android.22-x64", - "android.22", - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.25-x86": [ - "android.25-x86", - "android.25", - "android.24-x86", - "android.24", - "android.23-x86", - "android.23", - "android.22-x86", - "android.22", - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.26": [ - "android.26", - "android.25", - "android.24", - "android.23", - "android.22", - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.26-arm": [ - "android.26-arm", - "android.26", - "android.25-arm", - "android.25", - "android.24-arm", - "android.24", - "android.23-arm", - "android.23", - "android.22-arm", - "android.22", - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.26-arm64": [ - "android.26-arm64", - "android.26", - "android.25-arm64", - "android.25", - "android.24-arm64", - "android.24", - "android.23-arm64", - "android.23", - "android.22-arm64", - "android.22", - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.26-x64": [ - "android.26-x64", - "android.26", - "android.25-x64", - "android.25", - "android.24-x64", - "android.24", - "android.23-x64", - "android.23", - "android.22-x64", - "android.22", - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.26-x86": [ - "android.26-x86", - "android.26", - "android.25-x86", - "android.25", - "android.24-x86", - "android.24", - "android.23-x86", - "android.23", - "android.22-x86", - "android.22", - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.27": [ - "android.27", - "android.26", - "android.25", - "android.24", - "android.23", - "android.22", - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.27-arm": [ - "android.27-arm", - "android.27", - "android.26-arm", - "android.26", - "android.25-arm", - "android.25", - "android.24-arm", - "android.24", - "android.23-arm", - "android.23", - "android.22-arm", - "android.22", - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.27-arm64": [ - "android.27-arm64", - "android.27", - "android.26-arm64", - "android.26", - "android.25-arm64", - "android.25", - "android.24-arm64", - "android.24", - "android.23-arm64", - "android.23", - "android.22-arm64", - "android.22", - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.27-x64": [ - "android.27-x64", - "android.27", - "android.26-x64", - "android.26", - "android.25-x64", - "android.25", - "android.24-x64", - "android.24", - "android.23-x64", - "android.23", - "android.22-x64", - "android.22", - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.27-x86": [ - "android.27-x86", - "android.27", - "android.26-x86", - "android.26", - "android.25-x86", - "android.25", - "android.24-x86", - "android.24", - "android.23-x86", - "android.23", - "android.22-x86", - "android.22", - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.28": [ - "android.28", - "android.27", - "android.26", - "android.25", - "android.24", - "android.23", - "android.22", - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.28-arm": [ - "android.28-arm", - "android.28", - "android.27-arm", - "android.27", - "android.26-arm", - "android.26", - "android.25-arm", - "android.25", - "android.24-arm", - "android.24", - "android.23-arm", - "android.23", - "android.22-arm", - "android.22", - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.28-arm64": [ - "android.28-arm64", - "android.28", - "android.27-arm64", - "android.27", - "android.26-arm64", - "android.26", - "android.25-arm64", - "android.25", - "android.24-arm64", - "android.24", - "android.23-arm64", - "android.23", - "android.22-arm64", - "android.22", - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.28-x64": [ - "android.28-x64", - "android.28", - "android.27-x64", - "android.27", - "android.26-x64", - "android.26", - "android.25-x64", - "android.25", - "android.24-x64", - "android.24", - "android.23-x64", - "android.23", - "android.22-x64", - "android.22", - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.28-x86": [ - "android.28-x86", - "android.28", - "android.27-x86", - "android.27", - "android.26-x86", - "android.26", - "android.25-x86", - "android.25", - "android.24-x86", - "android.24", - "android.23-x86", - "android.23", - "android.22-x86", - "android.22", - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.29": [ - "android.29", - "android.28", - "android.27", - "android.26", - "android.25", - "android.24", - "android.23", - "android.22", - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.29-arm": [ - "android.29-arm", - "android.29", - "android.28-arm", - "android.28", - "android.27-arm", - "android.27", - "android.26-arm", - "android.26", - "android.25-arm", - "android.25", - "android.24-arm", - "android.24", - "android.23-arm", - "android.23", - "android.22-arm", - "android.22", - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.29-arm64": [ - "android.29-arm64", - "android.29", - "android.28-arm64", - "android.28", - "android.27-arm64", - "android.27", - "android.26-arm64", - "android.26", - "android.25-arm64", - "android.25", - "android.24-arm64", - "android.24", - "android.23-arm64", - "android.23", - "android.22-arm64", - "android.22", - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.29-x64": [ - "android.29-x64", - "android.29", - "android.28-x64", - "android.28", - "android.27-x64", - "android.27", - "android.26-x64", - "android.26", - "android.25-x64", - "android.25", - "android.24-x64", - "android.24", - "android.23-x64", - "android.23", - "android.22-x64", - "android.22", - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.29-x86": [ - "android.29-x86", - "android.29", - "android.28-x86", - "android.28", - "android.27-x86", - "android.27", - "android.26-x86", - "android.26", - "android.25-x86", - "android.25", - "android.24-x86", - "android.24", - "android.23-x86", - "android.23", - "android.22-x86", - "android.22", - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.30": [ - "android.30", - "android.29", - "android.28", - "android.27", - "android.26", - "android.25", - "android.24", - "android.23", - "android.22", - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.30-arm": [ - "android.30-arm", - "android.30", - "android.29-arm", - "android.29", - "android.28-arm", - "android.28", - "android.27-arm", - "android.27", - "android.26-arm", - "android.26", - "android.25-arm", - "android.25", - "android.24-arm", - "android.24", - "android.23-arm", - "android.23", - "android.22-arm", - "android.22", - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.30-arm64": [ - "android.30-arm64", - "android.30", - "android.29-arm64", - "android.29", - "android.28-arm64", - "android.28", - "android.27-arm64", - "android.27", - "android.26-arm64", - "android.26", - "android.25-arm64", - "android.25", - "android.24-arm64", - "android.24", - "android.23-arm64", - "android.23", - "android.22-arm64", - "android.22", - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.30-x64": [ - "android.30-x64", - "android.30", - "android.29-x64", - "android.29", - "android.28-x64", - "android.28", - "android.27-x64", - "android.27", - "android.26-x64", - "android.26", - "android.25-x64", - "android.25", - "android.24-x64", - "android.24", - "android.23-x64", - "android.23", - "android.22-x64", - "android.22", - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.30-x86": [ - "android.30-x86", - "android.30", - "android.29-x86", - "android.29", - "android.28-x86", - "android.28", - "android.27-x86", - "android.27", - "android.26-x86", - "android.26", - "android.25-x86", - "android.25", - "android.24-x86", - "android.24", - "android.23-x86", - "android.23", - "android.22-x86", - "android.22", - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.31": [ - "android.31", - "android.30", - "android.29", - "android.28", - "android.27", - "android.26", - "android.25", - "android.24", - "android.23", - "android.22", - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.31-arm": [ - "android.31-arm", - "android.31", - "android.30-arm", - "android.30", - "android.29-arm", - "android.29", - "android.28-arm", - "android.28", - "android.27-arm", - "android.27", - "android.26-arm", - "android.26", - "android.25-arm", - "android.25", - "android.24-arm", - "android.24", - "android.23-arm", - "android.23", - "android.22-arm", - "android.22", - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.31-arm64": [ - "android.31-arm64", - "android.31", - "android.30-arm64", - "android.30", - "android.29-arm64", - "android.29", - "android.28-arm64", - "android.28", - "android.27-arm64", - "android.27", - "android.26-arm64", - "android.26", - "android.25-arm64", - "android.25", - "android.24-arm64", - "android.24", - "android.23-arm64", - "android.23", - "android.22-arm64", - "android.22", - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.31-x64": [ - "android.31-x64", - "android.31", - "android.30-x64", - "android.30", - "android.29-x64", - "android.29", - "android.28-x64", - "android.28", - "android.27-x64", - "android.27", - "android.26-x64", - "android.26", - "android.25-x64", - "android.25", - "android.24-x64", - "android.24", - "android.23-x64", - "android.23", - "android.22-x64", - "android.22", - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.31-x86": [ - "android.31-x86", - "android.31", - "android.30-x86", - "android.30", - "android.29-x86", - "android.29", - "android.28-x86", - "android.28", - "android.27-x86", - "android.27", - "android.26-x86", - "android.26", - "android.25-x86", - "android.25", - "android.24-x86", - "android.24", - "android.23-x86", - "android.23", - "android.22-x86", - "android.22", - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "android.32": [ - "android.32", - "android.31", - "android.30", - "android.29", - "android.28", - "android.27", - "android.26", - "android.25", - "android.24", - "android.23", - "android.22", - "android.21", - "android", - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "android.32-arm": [ - "android.32-arm", - "android.32", - "android.31-arm", - "android.31", - "android.30-arm", - "android.30", - "android.29-arm", - "android.29", - "android.28-arm", - "android.28", - "android.27-arm", - "android.27", - "android.26-arm", - "android.26", - "android.25-arm", - "android.25", - "android.24-arm", - "android.24", - "android.23-arm", - "android.23", - "android.22-arm", - "android.22", - "android.21-arm", - "android.21", - "android-arm", - "android", - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "android.32-arm64": [ - "android.32-arm64", - "android.32", - "android.31-arm64", - "android.31", - "android.30-arm64", - "android.30", - "android.29-arm64", - "android.29", - "android.28-arm64", - "android.28", - "android.27-arm64", - "android.27", - "android.26-arm64", - "android.26", - "android.25-arm64", - "android.25", - "android.24-arm64", - "android.24", - "android.23-arm64", - "android.23", - "android.22-arm64", - "android.22", - "android.21-arm64", - "android.21", - "android-arm64", - "android", - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "android.32-x64": [ - "android.32-x64", - "android.32", - "android.31-x64", - "android.31", - "android.30-x64", - "android.30", - "android.29-x64", - "android.29", - "android.28-x64", - "android.28", - "android.27-x64", - "android.27", - "android.26-x64", - "android.26", - "android.25-x64", - "android.25", - "android.24-x64", - "android.24", - "android.23-x64", - "android.23", - "android.22-x64", - "android.22", - "android.21-x64", - "android.21", - "android-x64", - "android", - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "android.32-x86": [ - "android.32-x86", - "android.32", - "android.31-x86", - "android.31", - "android.30-x86", - "android.30", - "android.29-x86", - "android.29", - "android.28-x86", - "android.28", - "android.27-x86", - "android.27", - "android.26-x86", - "android.26", - "android.25-x86", - "android.25", - "android.24-x86", - "android.24", - "android.23-x86", - "android.23", - "android.22-x86", - "android.22", - "android.21-x86", - "android.21", - "android-x86", - "android", - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "any": [ - "any", - "base" - ], - "aot": [ - "aot", - "any", - "base" - ], - "arch": [ - "arch", - "linux", - "unix", - "any", - "base" - ], - "arch-x64": [ - "arch-x64", - "arch", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "base": [ - "base" - ], - "browser": [ - "browser", - "any", - "base" - ], - "browser-wasm": [ - "browser-wasm", - "browser", - "any", - "base" - ], - "centos": [ - "centos", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "centos-arm64": [ - "centos-arm64", - "centos", - "rhel-arm64", - "rhel", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "centos-x64": [ - "centos-x64", - "centos", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "centos.7": [ - "centos.7", - "centos", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "centos.7-x64": [ - "centos.7-x64", - "centos.7", - "centos-x64", - "rhel.7-x64", - "centos", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "centos.8": [ - "centos.8", - "centos", - "rhel.8", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "centos.8-arm64": [ - "centos.8-arm64", - "centos.8", - "centos-arm64", - "rhel.8-arm64", - "centos", - "rhel.8", - "rhel-arm64", - "rhel", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "centos.8-x64": [ - "centos.8-x64", - "centos.8", - "centos-x64", - "rhel.8-x64", - "centos", - "rhel.8", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "centos.9": [ - "centos.9", - "centos", - "rhel.9", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "centos.9-arm64": [ - "centos.9-arm64", - "centos.9", - "centos-arm64", - "rhel.9-arm64", - "centos", - "rhel.9", - "rhel-arm64", - "rhel", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "centos.9-x64": [ - "centos.9-x64", - "centos.9", - "centos-x64", - "rhel.9-x64", - "centos", - "rhel.9", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "debian": [ - "debian", - "linux", - "unix", - "any", - "base" - ], - "debian-arm": [ - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "debian-arm64": [ - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "debian-armel": [ - "debian-armel", - "debian", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "debian-x64": [ - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "debian-x86": [ - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "debian.10": [ - "debian.10", - "debian", - "linux", - "unix", - "any", - "base" - ], - "debian.10-arm": [ - "debian.10-arm", - "debian.10", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "debian.10-arm64": [ - "debian.10-arm64", - "debian.10", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "debian.10-armel": [ - "debian.10-armel", - "debian.10", - "debian-armel", - "debian", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "debian.10-x64": [ - "debian.10-x64", - "debian.10", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "debian.10-x86": [ - "debian.10-x86", - "debian.10", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "debian.11": [ - "debian.11", - "debian", - "linux", - "unix", - "any", - "base" - ], - "debian.11-arm": [ - "debian.11-arm", - "debian.11", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "debian.11-arm64": [ - "debian.11-arm64", - "debian.11", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "debian.11-armel": [ - "debian.11-armel", - "debian.11", - "debian-armel", - "debian", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "debian.11-x64": [ - "debian.11-x64", - "debian.11", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "debian.11-x86": [ - "debian.11-x86", - "debian.11", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "debian.12": [ - "debian.12", - "debian", - "linux", - "unix", - "any", - "base" - ], - "debian.12-arm": [ - "debian.12-arm", - "debian.12", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "debian.12-arm64": [ - "debian.12-arm64", - "debian.12", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "debian.12-armel": [ - "debian.12-armel", - "debian.12", - "debian-armel", - "debian", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "debian.12-x64": [ - "debian.12-x64", - "debian.12", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "debian.12-x86": [ - "debian.12-x86", - "debian.12", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "debian.8": [ - "debian.8", - "debian", - "linux", - "unix", - "any", - "base" - ], - "debian.8-arm": [ - "debian.8-arm", - "debian.8", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "debian.8-arm64": [ - "debian.8-arm64", - "debian.8", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "debian.8-armel": [ - "debian.8-armel", - "debian.8", - "debian-armel", - "debian", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "debian.8-x64": [ - "debian.8-x64", - "debian.8", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "debian.8-x86": [ - "debian.8-x86", - "debian.8", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "debian.9": [ - "debian.9", - "debian", - "linux", - "unix", - "any", - "base" - ], - "debian.9-arm": [ - "debian.9-arm", - "debian.9", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "debian.9-arm64": [ - "debian.9-arm64", - "debian.9", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "debian.9-armel": [ - "debian.9-armel", - "debian.9", - "debian-armel", - "debian", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "debian.9-x64": [ - "debian.9-x64", - "debian.9", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "debian.9-x86": [ - "debian.9-x86", - "debian.9", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "exherbo": [ - "exherbo", - "linux", - "unix", - "any", - "base" - ], - "exherbo-x64": [ - "exherbo-x64", - "exherbo", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora": [ - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora-arm64": [ - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora-x64": [ - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.23": [ - "fedora.23", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.23-arm64": [ - "fedora.23-arm64", - "fedora.23", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.23-x64": [ - "fedora.23-x64", - "fedora.23", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.24": [ - "fedora.24", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.24-arm64": [ - "fedora.24-arm64", - "fedora.24", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.24-x64": [ - "fedora.24-x64", - "fedora.24", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.25": [ - "fedora.25", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.25-arm64": [ - "fedora.25-arm64", - "fedora.25", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.25-x64": [ - "fedora.25-x64", - "fedora.25", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.26": [ - "fedora.26", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.26-arm64": [ - "fedora.26-arm64", - "fedora.26", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.26-x64": [ - "fedora.26-x64", - "fedora.26", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.27": [ - "fedora.27", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.27-arm64": [ - "fedora.27-arm64", - "fedora.27", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.27-x64": [ - "fedora.27-x64", - "fedora.27", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.28": [ - "fedora.28", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.28-arm64": [ - "fedora.28-arm64", - "fedora.28", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.28-x64": [ - "fedora.28-x64", - "fedora.28", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.29": [ - "fedora.29", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.29-arm64": [ - "fedora.29-arm64", - "fedora.29", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.29-x64": [ - "fedora.29-x64", - "fedora.29", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.30": [ - "fedora.30", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.30-arm64": [ - "fedora.30-arm64", - "fedora.30", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.30-x64": [ - "fedora.30-x64", - "fedora.30", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.31": [ - "fedora.31", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.31-arm64": [ - "fedora.31-arm64", - "fedora.31", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.31-x64": [ - "fedora.31-x64", - "fedora.31", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.32": [ - "fedora.32", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.32-arm64": [ - "fedora.32-arm64", - "fedora.32", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.32-x64": [ - "fedora.32-x64", - "fedora.32", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.33": [ - "fedora.33", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.33-arm64": [ - "fedora.33-arm64", - "fedora.33", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.33-x64": [ - "fedora.33-x64", - "fedora.33", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.34": [ - "fedora.34", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.34-arm64": [ - "fedora.34-arm64", - "fedora.34", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.34-x64": [ - "fedora.34-x64", - "fedora.34", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.35": [ - "fedora.35", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.35-arm64": [ - "fedora.35-arm64", - "fedora.35", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.35-x64": [ - "fedora.35-x64", - "fedora.35", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.36": [ - "fedora.36", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.36-arm64": [ - "fedora.36-arm64", - "fedora.36", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.36-x64": [ - "fedora.36-x64", - "fedora.36", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.37": [ - "fedora.37", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.37-arm64": [ - "fedora.37-arm64", - "fedora.37", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.37-x64": [ - "fedora.37-x64", - "fedora.37", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.38": [ - "fedora.38", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.38-arm64": [ - "fedora.38-arm64", - "fedora.38", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.38-x64": [ - "fedora.38-x64", - "fedora.38", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "fedora.39": [ - "fedora.39", - "fedora", - "linux", - "unix", - "any", - "base" - ], - "fedora.39-arm64": [ - "fedora.39-arm64", - "fedora.39", - "fedora-arm64", - "fedora", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "fedora.39-x64": [ - "fedora.39-x64", - "fedora.39", - "fedora-x64", - "fedora", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "freebsd": [ - "freebsd", - "unix", - "any", - "base" - ], - "freebsd-arm64": [ - "freebsd-arm64", - "freebsd", - "unix-arm64", - "unix", - "any", - "base" - ], - "freebsd-x64": [ - "freebsd-x64", - "freebsd", - "unix-x64", - "unix", - "any", - "base" - ], - "freebsd.12": [ - "freebsd.12", - "freebsd", - "unix", - "any", - "base" - ], - "freebsd.12-arm64": [ - "freebsd.12-arm64", - "freebsd.12", - "freebsd-arm64", - "freebsd", - "unix-arm64", - "unix", - "any", - "base" - ], - "freebsd.12-x64": [ - "freebsd.12-x64", - "freebsd.12", - "freebsd-x64", - "freebsd", - "unix-x64", - "unix", - "any", - "base" - ], - "freebsd.13": [ - "freebsd.13", - "freebsd.12", - "freebsd", - "unix", - "any", - "base" - ], - "freebsd.13-arm64": [ - "freebsd.13-arm64", - "freebsd.13", - "freebsd.12-arm64", - "freebsd.12", - "freebsd-arm64", - "freebsd", - "unix-arm64", - "unix", - "any", - "base" - ], - "freebsd.13-x64": [ - "freebsd.13-x64", - "freebsd.13", - "freebsd.12-x64", - "freebsd.12", - "freebsd-x64", - "freebsd", - "unix-x64", - "unix", - "any", - "base" - ], - "gentoo": [ - "gentoo", - "linux", - "unix", - "any", - "base" - ], - "gentoo-x64": [ - "gentoo-x64", - "gentoo", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "illumos": [ - "illumos", - "unix", - "any", - "base" - ], - "illumos-x64": [ - "illumos-x64", - "illumos", - "unix-x64", - "unix", - "any", - "base" - ], - "ios": [ - "ios", - "unix", - "any", - "base" - ], - "ios-arm": [ - "ios-arm", - "ios", - "unix-arm", - "unix", - "any", - "base" - ], - "ios-arm64": [ - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "ios-x64": [ - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "ios-x86": [ - "ios-x86", - "ios", - "unix-x86", - "unix", - "any", - "base" - ], - "ios.10": [ - "ios.10", - "ios", - "unix", - "any", - "base" - ], - "ios.10-arm": [ - "ios.10-arm", - "ios.10", - "ios-arm", - "ios", - "unix-arm", - "unix", - "any", - "base" - ], - "ios.10-arm64": [ - "ios.10-arm64", - "ios.10", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "ios.10-x64": [ - "ios.10-x64", - "ios.10", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "ios.10-x86": [ - "ios.10-x86", - "ios.10", - "ios-x86", - "ios", - "unix-x86", - "unix", - "any", - "base" - ], - "ios.11": [ - "ios.11", - "ios.10", - "ios", - "unix", - "any", - "base" - ], - "ios.11-arm64": [ - "ios.11-arm64", - "ios.11", - "ios.10-arm64", - "ios.10", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "ios.11-x64": [ - "ios.11-x64", - "ios.11", - "ios.10-x64", - "ios.10", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "ios.12": [ - "ios.12", - "ios.11", - "ios.10", - "ios", - "unix", - "any", - "base" - ], - "ios.12-arm64": [ - "ios.12-arm64", - "ios.12", - "ios.11-arm64", - "ios.11", - "ios.10-arm64", - "ios.10", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "ios.12-x64": [ - "ios.12-x64", - "ios.12", - "ios.11-x64", - "ios.11", - "ios.10-x64", - "ios.10", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "ios.13": [ - "ios.13", - "ios.12", - "ios.11", - "ios.10", - "ios", - "unix", - "any", - "base" - ], - "ios.13-arm64": [ - "ios.13-arm64", - "ios.13", - "ios.12-arm64", - "ios.12", - "ios.11-arm64", - "ios.11", - "ios.10-arm64", - "ios.10", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "ios.13-x64": [ - "ios.13-x64", - "ios.13", - "ios.12-x64", - "ios.12", - "ios.11-x64", - "ios.11", - "ios.10-x64", - "ios.10", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "ios.14": [ - "ios.14", - "ios.13", - "ios.12", - "ios.11", - "ios.10", - "ios", - "unix", - "any", - "base" - ], - "ios.14-arm64": [ - "ios.14-arm64", - "ios.14", - "ios.13-arm64", - "ios.13", - "ios.12-arm64", - "ios.12", - "ios.11-arm64", - "ios.11", - "ios.10-arm64", - "ios.10", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "ios.14-x64": [ - "ios.14-x64", - "ios.14", - "ios.13-x64", - "ios.13", - "ios.12-x64", - "ios.12", - "ios.11-x64", - "ios.11", - "ios.10-x64", - "ios.10", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "ios.15": [ - "ios.15", - "ios.14", - "ios.13", - "ios.12", - "ios.11", - "ios.10", - "ios", - "unix", - "any", - "base" - ], - "ios.15-arm64": [ - "ios.15-arm64", - "ios.15", - "ios.14-arm64", - "ios.14", - "ios.13-arm64", - "ios.13", - "ios.12-arm64", - "ios.12", - "ios.11-arm64", - "ios.11", - "ios.10-arm64", - "ios.10", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "ios.15-x64": [ - "ios.15-x64", - "ios.15", - "ios.14-x64", - "ios.14", - "ios.13-x64", - "ios.13", - "ios.12-x64", - "ios.12", - "ios.11-x64", - "ios.11", - "ios.10-x64", - "ios.10", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "iossimulator": [ - "iossimulator", - "ios", - "unix", - "any", - "base" - ], - "iossimulator-arm64": [ - "iossimulator-arm64", - "iossimulator", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "iossimulator-x64": [ - "iossimulator-x64", - "iossimulator", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "iossimulator-x86": [ - "iossimulator-x86", - "iossimulator", - "ios-x86", - "ios", - "unix-x86", - "unix", - "any", - "base" - ], - "iossimulator.10": [ - "iossimulator.10", - "iossimulator", - "ios", - "unix", - "any", - "base" - ], - "iossimulator.10-arm64": [ - "iossimulator.10-arm64", - "iossimulator.10", - "iossimulator-arm64", - "iossimulator", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "iossimulator.10-x64": [ - "iossimulator.10-x64", - "iossimulator.10", - "iossimulator-x64", - "iossimulator", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "iossimulator.10-x86": [ - "iossimulator.10-x86", - "iossimulator.10", - "iossimulator-x86", - "iossimulator", - "ios-x86", - "ios", - "unix-x86", - "unix", - "any", - "base" - ], - "iossimulator.11": [ - "iossimulator.11", - "iossimulator.10", - "iossimulator", - "ios", - "unix", - "any", - "base" - ], - "iossimulator.11-arm64": [ - "iossimulator.11-arm64", - "iossimulator.11", - "iossimulator.10-arm64", - "iossimulator.10", - "iossimulator-arm64", - "iossimulator", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "iossimulator.11-x64": [ - "iossimulator.11-x64", - "iossimulator.11", - "iossimulator.10-x64", - "iossimulator.10", - "iossimulator-x64", - "iossimulator", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "iossimulator.12": [ - "iossimulator.12", - "iossimulator.11", - "iossimulator.10", - "iossimulator", - "ios", - "unix", - "any", - "base" - ], - "iossimulator.12-arm64": [ - "iossimulator.12-arm64", - "iossimulator.12", - "iossimulator.11-arm64", - "iossimulator.11", - "iossimulator.10-arm64", - "iossimulator.10", - "iossimulator-arm64", - "iossimulator", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "iossimulator.12-x64": [ - "iossimulator.12-x64", - "iossimulator.12", - "iossimulator.11-x64", - "iossimulator.11", - "iossimulator.10-x64", - "iossimulator.10", - "iossimulator-x64", - "iossimulator", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "iossimulator.13": [ - "iossimulator.13", - "iossimulator.12", - "iossimulator.11", - "iossimulator.10", - "iossimulator", - "ios", - "unix", - "any", - "base" - ], - "iossimulator.13-arm64": [ - "iossimulator.13-arm64", - "iossimulator.13", - "iossimulator.12-arm64", - "iossimulator.12", - "iossimulator.11-arm64", - "iossimulator.11", - "iossimulator.10-arm64", - "iossimulator.10", - "iossimulator-arm64", - "iossimulator", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "iossimulator.13-x64": [ - "iossimulator.13-x64", - "iossimulator.13", - "iossimulator.12-x64", - "iossimulator.12", - "iossimulator.11-x64", - "iossimulator.11", - "iossimulator.10-x64", - "iossimulator.10", - "iossimulator-x64", - "iossimulator", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "iossimulator.14": [ - "iossimulator.14", - "iossimulator.13", - "iossimulator.12", - "iossimulator.11", - "iossimulator.10", - "iossimulator", - "ios", - "unix", - "any", - "base" - ], - "iossimulator.14-arm64": [ - "iossimulator.14-arm64", - "iossimulator.14", - "iossimulator.13-arm64", - "iossimulator.13", - "iossimulator.12-arm64", - "iossimulator.12", - "iossimulator.11-arm64", - "iossimulator.11", - "iossimulator.10-arm64", - "iossimulator.10", - "iossimulator-arm64", - "iossimulator", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "iossimulator.14-x64": [ - "iossimulator.14-x64", - "iossimulator.14", - "iossimulator.13-x64", - "iossimulator.13", - "iossimulator.12-x64", - "iossimulator.12", - "iossimulator.11-x64", - "iossimulator.11", - "iossimulator.10-x64", - "iossimulator.10", - "iossimulator-x64", - "iossimulator", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "iossimulator.15": [ - "iossimulator.15", - "iossimulator.14", - "iossimulator.13", - "iossimulator.12", - "iossimulator.11", - "iossimulator.10", - "iossimulator", - "ios", - "unix", - "any", - "base" - ], - "iossimulator.15-arm64": [ - "iossimulator.15-arm64", - "iossimulator.15", - "iossimulator.14-arm64", - "iossimulator.14", - "iossimulator.13-arm64", - "iossimulator.13", - "iossimulator.12-arm64", - "iossimulator.12", - "iossimulator.11-arm64", - "iossimulator.11", - "iossimulator.10-arm64", - "iossimulator.10", - "iossimulator-arm64", - "iossimulator", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "iossimulator.15-x64": [ - "iossimulator.15-x64", - "iossimulator.15", - "iossimulator.14-x64", - "iossimulator.14", - "iossimulator.13-x64", - "iossimulator.13", - "iossimulator.12-x64", - "iossimulator.12", - "iossimulator.11-x64", - "iossimulator.11", - "iossimulator.10-x64", - "iossimulator.10", - "iossimulator-x64", - "iossimulator", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "linux": [ - "linux", - "unix", - "any", - "base" - ], - "linux-arm": [ - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "linux-arm64": [ - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "linux-armel": [ - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "linux-armv6": [ - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "linux-bionic": [ - "linux-bionic", - "linux", - "unix", - "any", - "base" - ], - "linux-bionic-arm": [ - "linux-bionic-arm", - "linux-bionic", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "linux-bionic-arm64": [ - "linux-bionic-arm64", - "linux-bionic", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "linux-bionic-x64": [ - "linux-bionic-x64", - "linux-bionic", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linux-bionic-x86": [ - "linux-bionic-x86", - "linux-bionic", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "linux-loongarch64": [ - "linux-loongarch64", - "linux", - "unix-loongarch64", - "unix", - "any", - "base" - ], - "linux-mips64": [ - "linux-mips64", - "linux", - "unix-mips64", - "unix", - "any", - "base" - ], - "linux-musl": [ - "linux-musl", - "linux", - "unix", - "any", - "base" - ], - "linux-musl-arm": [ - "linux-musl-arm", - "linux-musl", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "linux-musl-arm64": [ - "linux-musl-arm64", - "linux-musl", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "linux-musl-armel": [ - "linux-musl-armel", - "linux-musl", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "linux-musl-armv6": [ - "linux-musl-armv6", - "linux-musl", - "linux-armv6", - "linux", - "unix-armv6", - "unix", - "any", - "base" - ], - "linux-musl-ppc64le": [ - "linux-musl-ppc64le", - "linux-musl", - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "linux-musl-riscv64": [ - "linux-musl-riscv64", - "linux-musl", - "linux-riscv64", - "linux", - "unix-riscv64", - "unix", - "any", - "base" - ], - "linux-musl-s390x": [ - "linux-musl-s390x", - "linux-musl", - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "linux-musl-x64": [ - "linux-musl-x64", - "linux-musl", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linux-musl-x86": [ - "linux-musl-x86", - "linux-musl", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "linux-ppc64le": [ - "linux-ppc64le", - "linux", - "unix-ppc64le", - "unix", - "any", - "base" - ], - "linux-riscv64": [ - "linux-riscv64", - "linux", - "unix-riscv64", - "unix", - "any", - "base" - ], - "linux-s390x": [ - "linux-s390x", - "linux", - "unix-s390x", - "unix", - "any", - "base" - ], - "linux-x64": [ - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linux-x86": [ - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "linuxmint.17": [ - "linuxmint.17", - "ubuntu.14.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "linuxmint.17-x64": [ - "linuxmint.17-x64", - "linuxmint.17", - "ubuntu.14.04-x64", - "ubuntu.14.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linuxmint.17.1": [ - "linuxmint.17.1", - "linuxmint.17", - "ubuntu.14.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "linuxmint.17.1-x64": [ - "linuxmint.17.1-x64", - "linuxmint.17.1", - "linuxmint.17-x64", - "linuxmint.17", - "ubuntu.14.04-x64", - "ubuntu.14.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linuxmint.17.2": [ - "linuxmint.17.2", - "linuxmint.17.1", - "linuxmint.17", - "ubuntu.14.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "linuxmint.17.2-x64": [ - "linuxmint.17.2-x64", - "linuxmint.17.2", - "linuxmint.17.1-x64", - "linuxmint.17.1", - "linuxmint.17-x64", - "linuxmint.17", - "ubuntu.14.04-x64", - "ubuntu.14.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linuxmint.17.3": [ - "linuxmint.17.3", - "linuxmint.17.2", - "linuxmint.17.1", - "linuxmint.17", - "ubuntu.14.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "linuxmint.17.3-x64": [ - "linuxmint.17.3-x64", - "linuxmint.17.3", - "linuxmint.17.2-x64", - "linuxmint.17.2", - "linuxmint.17.1-x64", - "linuxmint.17.1", - "linuxmint.17-x64", - "linuxmint.17", - "ubuntu.14.04-x64", - "ubuntu.14.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linuxmint.18": [ - "linuxmint.18", - "ubuntu.16.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "linuxmint.18-x64": [ - "linuxmint.18-x64", - "linuxmint.18", - "ubuntu.16.04-x64", - "ubuntu.16.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linuxmint.18.1": [ - "linuxmint.18.1", - "linuxmint.18", - "ubuntu.16.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "linuxmint.18.1-x64": [ - "linuxmint.18.1-x64", - "linuxmint.18.1", - "linuxmint.18-x64", - "linuxmint.18", - "ubuntu.16.04-x64", - "ubuntu.16.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linuxmint.18.2": [ - "linuxmint.18.2", - "linuxmint.18.1", - "linuxmint.18", - "ubuntu.16.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "linuxmint.18.2-x64": [ - "linuxmint.18.2-x64", - "linuxmint.18.2", - "linuxmint.18.1-x64", - "linuxmint.18.1", - "linuxmint.18-x64", - "linuxmint.18", - "ubuntu.16.04-x64", - "ubuntu.16.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linuxmint.18.3": [ - "linuxmint.18.3", - "linuxmint.18.2", - "linuxmint.18.1", - "linuxmint.18", - "ubuntu.16.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "linuxmint.18.3-x64": [ - "linuxmint.18.3-x64", - "linuxmint.18.3", - "linuxmint.18.2-x64", - "linuxmint.18.2", - "linuxmint.18.1-x64", - "linuxmint.18.1", - "linuxmint.18-x64", - "linuxmint.18", - "ubuntu.16.04-x64", - "ubuntu.16.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linuxmint.19": [ - "linuxmint.19", - "ubuntu.18.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "linuxmint.19-x64": [ - "linuxmint.19-x64", - "linuxmint.19", - "ubuntu.18.04-x64", - "ubuntu.18.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linuxmint.19.1": [ - "linuxmint.19.1", - "linuxmint.19", - "ubuntu.18.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "linuxmint.19.1-x64": [ - "linuxmint.19.1-x64", - "linuxmint.19.1", - "linuxmint.19-x64", - "linuxmint.19", - "ubuntu.18.04-x64", - "ubuntu.18.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "linuxmint.19.2": [ - "linuxmint.19.2", - "linuxmint.19.1", - "linuxmint.19", - "ubuntu.18.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "linuxmint.19.2-x64": [ - "linuxmint.19.2-x64", - "linuxmint.19.2", - "linuxmint.19.1-x64", - "linuxmint.19.1", - "linuxmint.19-x64", - "linuxmint.19", - "ubuntu.18.04-x64", - "ubuntu.18.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "maccatalyst": [ - "maccatalyst", - "ios", - "unix", - "any", - "base" - ], - "maccatalyst-arm64": [ - "maccatalyst-arm64", - "maccatalyst", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "maccatalyst-x64": [ - "maccatalyst-x64", - "maccatalyst", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "maccatalyst.13": [ - "maccatalyst.13", - "maccatalyst", - "ios", - "unix", - "any", - "base" - ], - "maccatalyst.13-arm64": [ - "maccatalyst.13-arm64", - "maccatalyst.13", - "maccatalyst-arm64", - "maccatalyst", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "maccatalyst.13-x64": [ - "maccatalyst.13-x64", - "maccatalyst.13", - "maccatalyst-x64", - "maccatalyst", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "maccatalyst.14": [ - "maccatalyst.14", - "maccatalyst.13", - "maccatalyst", - "ios", - "unix", - "any", - "base" - ], - "maccatalyst.14-arm64": [ - "maccatalyst.14-arm64", - "maccatalyst.14", - "maccatalyst.13-arm64", - "maccatalyst.13", - "maccatalyst-arm64", - "maccatalyst", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "maccatalyst.14-x64": [ - "maccatalyst.14-x64", - "maccatalyst.14", - "maccatalyst.13-x64", - "maccatalyst.13", - "maccatalyst-x64", - "maccatalyst", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "maccatalyst.15": [ - "maccatalyst.15", - "maccatalyst.14", - "maccatalyst.13", - "maccatalyst", - "ios", - "unix", - "any", - "base" - ], - "maccatalyst.15-arm64": [ - "maccatalyst.15-arm64", - "maccatalyst.15", - "maccatalyst.14-arm64", - "maccatalyst.14", - "maccatalyst.13-arm64", - "maccatalyst.13", - "maccatalyst-arm64", - "maccatalyst", - "ios-arm64", - "ios", - "unix-arm64", - "unix", - "any", - "base" - ], - "maccatalyst.15-x64": [ - "maccatalyst.15-x64", - "maccatalyst.15", - "maccatalyst.14-x64", - "maccatalyst.14", - "maccatalyst.13-x64", - "maccatalyst.13", - "maccatalyst-x64", - "maccatalyst", - "ios-x64", - "ios", - "unix-x64", - "unix", - "any", - "base" - ], - "manjaro": [ - "manjaro", - "arch", - "linux", - "unix", - "any", - "base" - ], - "manjaro-x64": [ - "manjaro-x64", - "manjaro", - "arch-x64", - "arch", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "miraclelinux": [ - "miraclelinux", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "miraclelinux-x64": [ - "miraclelinux-x64", - "miraclelinux", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "miraclelinux.8": [ - "miraclelinux.8", - "miraclelinux", - "rhel.8", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "miraclelinux.8-x64": [ - "miraclelinux.8-x64", - "miraclelinux.8", - "miraclelinux-x64", - "rhel.8-x64", - "miraclelinux", - "rhel.8", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "miraclelinux.9": [ - "miraclelinux.9", - "miraclelinux", - "rhel.9", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "miraclelinux.9-x64": [ - "miraclelinux.9-x64", - "miraclelinux.9", - "miraclelinux-x64", - "rhel.9-x64", - "miraclelinux", - "rhel.9", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ol": [ - "ol", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "ol-x64": [ - "ol-x64", - "ol", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ol.7": [ - "ol.7", - "ol", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "ol.7-x64": [ - "ol.7-x64", - "ol.7", - "ol-x64", - "rhel.7-x64", - "ol", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ol.7.0": [ - "ol.7.0", - "ol.7", - "rhel.7.0", - "ol", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "ol.7.0-x64": [ - "ol.7.0-x64", - "ol.7.0", - "ol.7-x64", - "rhel.7.0-x64", - "ol.7", - "rhel.7.0", - "ol-x64", - "rhel.7-x64", - "ol", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ol.7.1": [ - "ol.7.1", - "ol.7.0", - "rhel.7.1", - "ol.7", - "rhel.7.0", - "ol", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "ol.7.1-x64": [ - "ol.7.1-x64", - "ol.7.1", - "ol.7.0-x64", - "rhel.7.1-x64", - "ol.7.0", - "rhel.7.1", - "ol.7-x64", - "rhel.7.0-x64", - "ol.7", - "rhel.7.0", - "ol-x64", - "rhel.7-x64", - "ol", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ol.7.2": [ - "ol.7.2", - "ol.7.1", - "rhel.7.2", - "ol.7.0", - "rhel.7.1", - "ol.7", - "rhel.7.0", - "ol", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "ol.7.2-x64": [ - "ol.7.2-x64", - "ol.7.2", - "ol.7.1-x64", - "rhel.7.2-x64", - "ol.7.1", - "rhel.7.2", - "ol.7.0-x64", - "rhel.7.1-x64", - "ol.7.0", - "rhel.7.1", - "ol.7-x64", - "rhel.7.0-x64", - "ol.7", - "rhel.7.0", - "ol-x64", - "rhel.7-x64", - "ol", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ol.7.3": [ - "ol.7.3", - "ol.7.2", - "rhel.7.3", - "ol.7.1", - "rhel.7.2", - "ol.7.0", - "rhel.7.1", - "ol.7", - "rhel.7.0", - "ol", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "ol.7.3-x64": [ - "ol.7.3-x64", - "ol.7.3", - "ol.7.2-x64", - "rhel.7.3-x64", - "ol.7.2", - "rhel.7.3", - "ol.7.1-x64", - "rhel.7.2-x64", - "ol.7.1", - "rhel.7.2", - "ol.7.0-x64", - "rhel.7.1-x64", - "ol.7.0", - "rhel.7.1", - "ol.7-x64", - "rhel.7.0-x64", - "ol.7", - "rhel.7.0", - "ol-x64", - "rhel.7-x64", - "ol", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ol.7.4": [ - "ol.7.4", - "ol.7.3", - "rhel.7.4", - "ol.7.2", - "rhel.7.3", - "ol.7.1", - "rhel.7.2", - "ol.7.0", - "rhel.7.1", - "ol.7", - "rhel.7.0", - "ol", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "ol.7.4-x64": [ - "ol.7.4-x64", - "ol.7.4", - "ol.7.3-x64", - "rhel.7.4-x64", - "ol.7.3", - "rhel.7.4", - "ol.7.2-x64", - "rhel.7.3-x64", - "ol.7.2", - "rhel.7.3", - "ol.7.1-x64", - "rhel.7.2-x64", - "ol.7.1", - "rhel.7.2", - "ol.7.0-x64", - "rhel.7.1-x64", - "ol.7.0", - "rhel.7.1", - "ol.7-x64", - "rhel.7.0-x64", - "ol.7", - "rhel.7.0", - "ol-x64", - "rhel.7-x64", - "ol", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ol.7.5": [ - "ol.7.5", - "ol.7.4", - "rhel.7.5", - "ol.7.3", - "rhel.7.4", - "ol.7.2", - "rhel.7.3", - "ol.7.1", - "rhel.7.2", - "ol.7.0", - "rhel.7.1", - "ol.7", - "rhel.7.0", - "ol", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "ol.7.5-x64": [ - "ol.7.5-x64", - "ol.7.5", - "ol.7.4-x64", - "rhel.7.5-x64", - "ol.7.4", - "rhel.7.5", - "ol.7.3-x64", - "rhel.7.4-x64", - "ol.7.3", - "rhel.7.4", - "ol.7.2-x64", - "rhel.7.3-x64", - "ol.7.2", - "rhel.7.3", - "ol.7.1-x64", - "rhel.7.2-x64", - "ol.7.1", - "rhel.7.2", - "ol.7.0-x64", - "rhel.7.1-x64", - "ol.7.0", - "rhel.7.1", - "ol.7-x64", - "rhel.7.0-x64", - "ol.7", - "rhel.7.0", - "ol-x64", - "rhel.7-x64", - "ol", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ol.7.6": [ - "ol.7.6", - "ol.7.5", - "rhel.7.6", - "ol.7.4", - "rhel.7.5", - "ol.7.3", - "rhel.7.4", - "ol.7.2", - "rhel.7.3", - "ol.7.1", - "rhel.7.2", - "ol.7.0", - "rhel.7.1", - "ol.7", - "rhel.7.0", - "ol", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "ol.7.6-x64": [ - "ol.7.6-x64", - "ol.7.6", - "ol.7.5-x64", - "rhel.7.6-x64", - "ol.7.5", - "rhel.7.6", - "ol.7.4-x64", - "rhel.7.5-x64", - "ol.7.4", - "rhel.7.5", - "ol.7.3-x64", - "rhel.7.4-x64", - "ol.7.3", - "rhel.7.4", - "ol.7.2-x64", - "rhel.7.3-x64", - "ol.7.2", - "rhel.7.3", - "ol.7.1-x64", - "rhel.7.2-x64", - "ol.7.1", - "rhel.7.2", - "ol.7.0-x64", - "rhel.7.1-x64", - "ol.7.0", - "rhel.7.1", - "ol.7-x64", - "rhel.7.0-x64", - "ol.7", - "rhel.7.0", - "ol-x64", - "rhel.7-x64", - "ol", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ol.8": [ - "ol.8", - "ol", - "rhel.8", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "ol.8-x64": [ - "ol.8-x64", - "ol.8", - "ol-x64", - "rhel.8-x64", - "ol", - "rhel.8", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ol.8.0": [ - "ol.8.0", - "ol.8", - "rhel.8.0", - "ol", - "rhel.8", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "ol.8.0-x64": [ - "ol.8.0-x64", - "ol.8.0", - "ol.8-x64", - "rhel.8.0-x64", - "ol.8", - "rhel.8.0", - "ol-x64", - "rhel.8-x64", - "ol", - "rhel.8", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "omnios": [ - "omnios", - "illumos", - "unix", - "any", - "base" - ], - "omnios-x64": [ - "omnios-x64", - "omnios", - "illumos-x64", - "illumos", - "unix-x64", - "unix", - "any", - "base" - ], - "omnios.15": [ - "omnios.15", - "omnios", - "illumos", - "unix", - "any", - "base" - ], - "omnios.15-x64": [ - "omnios.15-x64", - "omnios.15", - "omnios-x64", - "omnios", - "illumos-x64", - "illumos", - "unix-x64", - "unix", - "any", - "base" - ], - "openindiana": [ - "openindiana", - "illumos", - "unix", - "any", - "base" - ], - "openindiana-x64": [ - "openindiana-x64", - "openindiana", - "illumos-x64", - "illumos", - "unix-x64", - "unix", - "any", - "base" - ], - "opensuse": [ - "opensuse", - "linux", - "unix", - "any", - "base" - ], - "opensuse-x64": [ - "opensuse-x64", - "opensuse", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "opensuse.13.2": [ - "opensuse.13.2", - "opensuse", - "linux", - "unix", - "any", - "base" - ], - "opensuse.13.2-x64": [ - "opensuse.13.2-x64", - "opensuse.13.2", - "opensuse-x64", - "opensuse", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "opensuse.15.0": [ - "opensuse.15.0", - "opensuse", - "linux", - "unix", - "any", - "base" - ], - "opensuse.15.0-x64": [ - "opensuse.15.0-x64", - "opensuse.15.0", - "opensuse-x64", - "opensuse", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "opensuse.15.1": [ - "opensuse.15.1", - "opensuse", - "linux", - "unix", - "any", - "base" - ], - "opensuse.15.1-x64": [ - "opensuse.15.1-x64", - "opensuse.15.1", - "opensuse-x64", - "opensuse", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "opensuse.42.1": [ - "opensuse.42.1", - "opensuse", - "linux", - "unix", - "any", - "base" - ], - "opensuse.42.1-x64": [ - "opensuse.42.1-x64", - "opensuse.42.1", - "opensuse-x64", - "opensuse", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "opensuse.42.2": [ - "opensuse.42.2", - "opensuse", - "linux", - "unix", - "any", - "base" - ], - "opensuse.42.2-x64": [ - "opensuse.42.2-x64", - "opensuse.42.2", - "opensuse-x64", - "opensuse", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "opensuse.42.3": [ - "opensuse.42.3", - "opensuse", - "linux", - "unix", - "any", - "base" - ], - "opensuse.42.3-x64": [ - "opensuse.42.3-x64", - "opensuse.42.3", - "opensuse-x64", - "opensuse", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "osx": [ - "osx", - "unix", - "any", - "base" - ], - "osx-arm64": [ - "osx-arm64", - "osx", - "unix-arm64", - "unix", - "any", - "base" - ], - "osx-x64": [ - "osx-x64", - "osx", - "unix-x64", - "unix", - "any", - "base" - ], - "osx.10.10": [ - "osx.10.10", - "osx", - "unix", - "any", - "base" - ], - "osx.10.10-arm64": [ - "osx.10.10-arm64", - "osx.10.10", - "osx-arm64", - "osx", - "unix-arm64", - "unix", - "any", - "base" - ], - "osx.10.10-x64": [ - "osx.10.10-x64", - "osx.10.10", - "osx-x64", - "osx", - "unix-x64", - "unix", - "any", - "base" - ], - "osx.10.11": [ - "osx.10.11", - "osx.10.10", - "osx", - "unix", - "any", - "base" - ], - "osx.10.11-arm64": [ - "osx.10.11-arm64", - "osx.10.11", - "osx.10.10-arm64", - "osx.10.10", - "osx-arm64", - "osx", - "unix-arm64", - "unix", - "any", - "base" - ], - "osx.10.11-x64": [ - "osx.10.11-x64", - "osx.10.11", - "osx.10.10-x64", - "osx.10.10", - "osx-x64", - "osx", - "unix-x64", - "unix", - "any", - "base" - ], - "osx.10.12": [ - "osx.10.12", - "osx.10.11", - "osx.10.10", - "osx", - "unix", - "any", - "base" - ], - "osx.10.12-arm64": [ - "osx.10.12-arm64", - "osx.10.12", - "osx.10.11-arm64", - "osx.10.11", - "osx.10.10-arm64", - "osx.10.10", - "osx-arm64", - "osx", - "unix-arm64", - "unix", - "any", - "base" - ], - "osx.10.12-x64": [ - "osx.10.12-x64", - "osx.10.12", - "osx.10.11-x64", - "osx.10.11", - "osx.10.10-x64", - "osx.10.10", - "osx-x64", - "osx", - "unix-x64", - "unix", - "any", - "base" - ], - "osx.10.13": [ - "osx.10.13", - "osx.10.12", - "osx.10.11", - "osx.10.10", - "osx", - "unix", - "any", - "base" - ], - "osx.10.13-arm64": [ - "osx.10.13-arm64", - "osx.10.13", - "osx.10.12-arm64", - "osx.10.12", - "osx.10.11-arm64", - "osx.10.11", - "osx.10.10-arm64", - "osx.10.10", - "osx-arm64", - "osx", - "unix-arm64", - "unix", - "any", - "base" - ], - "osx.10.13-x64": [ - "osx.10.13-x64", - "osx.10.13", - "osx.10.12-x64", - "osx.10.12", - "osx.10.11-x64", - "osx.10.11", - "osx.10.10-x64", - "osx.10.10", - "osx-x64", - "osx", - "unix-x64", - "unix", - "any", - "base" - ], - "osx.10.14": [ - "osx.10.14", - "osx.10.13", - "osx.10.12", - "osx.10.11", - "osx.10.10", - "osx", - "unix", - "any", - "base" - ], - "osx.10.14-arm64": [ - "osx.10.14-arm64", - "osx.10.14", - "osx.10.13-arm64", - "osx.10.13", - "osx.10.12-arm64", - "osx.10.12", - "osx.10.11-arm64", - "osx.10.11", - "osx.10.10-arm64", - "osx.10.10", - "osx-arm64", - "osx", - "unix-arm64", - "unix", - "any", - "base" - ], - "osx.10.14-x64": [ - "osx.10.14-x64", - "osx.10.14", - "osx.10.13-x64", - "osx.10.13", - "osx.10.12-x64", - "osx.10.12", - "osx.10.11-x64", - "osx.10.11", - "osx.10.10-x64", - "osx.10.10", - "osx-x64", - "osx", - "unix-x64", - "unix", - "any", - "base" - ], - "osx.10.15": [ - "osx.10.15", - "osx.10.14", - "osx.10.13", - "osx.10.12", - "osx.10.11", - "osx.10.10", - "osx", - "unix", - "any", - "base" - ], - "osx.10.15-arm64": [ - "osx.10.15-arm64", - "osx.10.15", - "osx.10.14-arm64", - "osx.10.14", - "osx.10.13-arm64", - "osx.10.13", - "osx.10.12-arm64", - "osx.10.12", - "osx.10.11-arm64", - "osx.10.11", - "osx.10.10-arm64", - "osx.10.10", - "osx-arm64", - "osx", - "unix-arm64", - "unix", - "any", - "base" - ], - "osx.10.15-x64": [ - "osx.10.15-x64", - "osx.10.15", - "osx.10.14-x64", - "osx.10.14", - "osx.10.13-x64", - "osx.10.13", - "osx.10.12-x64", - "osx.10.12", - "osx.10.11-x64", - "osx.10.11", - "osx.10.10-x64", - "osx.10.10", - "osx-x64", - "osx", - "unix-x64", - "unix", - "any", - "base" - ], - "osx.10.16": [ - "osx.10.16", - "osx.10.15", - "osx.10.14", - "osx.10.13", - "osx.10.12", - "osx.10.11", - "osx.10.10", - "osx", - "unix", - "any", - "base" - ], - "osx.10.16-arm64": [ - "osx.10.16-arm64", - "osx.10.16", - "osx.10.15-arm64", - "osx.10.15", - "osx.10.14-arm64", - "osx.10.14", - "osx.10.13-arm64", - "osx.10.13", - "osx.10.12-arm64", - "osx.10.12", - "osx.10.11-arm64", - "osx.10.11", - "osx.10.10-arm64", - "osx.10.10", - "osx-arm64", - "osx", - "unix-arm64", - "unix", - "any", - "base" - ], - "osx.10.16-x64": [ - "osx.10.16-x64", - "osx.10.16", - "osx.10.15-x64", - "osx.10.15", - "osx.10.14-x64", - "osx.10.14", - "osx.10.13-x64", - "osx.10.13", - "osx.10.12-x64", - "osx.10.12", - "osx.10.11-x64", - "osx.10.11", - "osx.10.10-x64", - "osx.10.10", - "osx-x64", - "osx", - "unix-x64", - "unix", - "any", - "base" - ], - "osx.11.0": [ - "osx.11.0", - "osx.10.16", - "osx.10.15", - "osx.10.14", - "osx.10.13", - "osx.10.12", - "osx.10.11", - "osx.10.10", - "osx", - "unix", - "any", - "base" - ], - "osx.11.0-arm64": [ - "osx.11.0-arm64", - "osx.11.0", - "osx.10.16-arm64", - "osx.10.16", - "osx.10.15-arm64", - "osx.10.15", - "osx.10.14-arm64", - "osx.10.14", - "osx.10.13-arm64", - "osx.10.13", - "osx.10.12-arm64", - "osx.10.12", - "osx.10.11-arm64", - "osx.10.11", - "osx.10.10-arm64", - "osx.10.10", - "osx-arm64", - "osx", - "unix-arm64", - "unix", - "any", - "base" - ], - "osx.11.0-x64": [ - "osx.11.0-x64", - "osx.11.0", - "osx.10.16-x64", - "osx.10.16", - "osx.10.15-x64", - "osx.10.15", - "osx.10.14-x64", - "osx.10.14", - "osx.10.13-x64", - "osx.10.13", - "osx.10.12-x64", - "osx.10.12", - "osx.10.11-x64", - "osx.10.11", - "osx.10.10-x64", - "osx.10.10", - "osx-x64", - "osx", - "unix-x64", - "unix", - "any", - "base" - ], - "osx.12": [ - "osx.12", - "osx.11.0", - "osx.10.16", - "osx.10.15", - "osx.10.14", - "osx.10.13", - "osx.10.12", - "osx.10.11", - "osx.10.10", - "osx", - "unix", - "any", - "base" - ], - "osx.12-arm64": [ - "osx.12-arm64", - "osx.12", - "osx.11.0-arm64", - "osx.11.0", - "osx.10.16-arm64", - "osx.10.16", - "osx.10.15-arm64", - "osx.10.15", - "osx.10.14-arm64", - "osx.10.14", - "osx.10.13-arm64", - "osx.10.13", - "osx.10.12-arm64", - "osx.10.12", - "osx.10.11-arm64", - "osx.10.11", - "osx.10.10-arm64", - "osx.10.10", - "osx-arm64", - "osx", - "unix-arm64", - "unix", - "any", - "base" - ], - "osx.12-x64": [ - "osx.12-x64", - "osx.12", - "osx.11.0-x64", - "osx.11.0", - "osx.10.16-x64", - "osx.10.16", - "osx.10.15-x64", - "osx.10.15", - "osx.10.14-x64", - "osx.10.14", - "osx.10.13-x64", - "osx.10.13", - "osx.10.12-x64", - "osx.10.12", - "osx.10.11-x64", - "osx.10.11", - "osx.10.10-x64", - "osx.10.10", - "osx-x64", - "osx", - "unix-x64", - "unix", - "any", - "base" - ], - "osx.13": [ - "osx.13", - "osx.12", - "osx.11.0", - "osx.10.16", - "osx.10.15", - "osx.10.14", - "osx.10.13", - "osx.10.12", - "osx.10.11", - "osx.10.10", - "osx", - "unix", - "any", - "base" - ], - "osx.13-arm64": [ - "osx.13-arm64", - "osx.13", - "osx.12-arm64", - "osx.12", - "osx.11.0-arm64", - "osx.11.0", - "osx.10.16-arm64", - "osx.10.16", - "osx.10.15-arm64", - "osx.10.15", - "osx.10.14-arm64", - "osx.10.14", - "osx.10.13-arm64", - "osx.10.13", - "osx.10.12-arm64", - "osx.10.12", - "osx.10.11-arm64", - "osx.10.11", - "osx.10.10-arm64", - "osx.10.10", - "osx-arm64", - "osx", - "unix-arm64", - "unix", - "any", - "base" - ], - "osx.13-x64": [ - "osx.13-x64", - "osx.13", - "osx.12-x64", - "osx.12", - "osx.11.0-x64", - "osx.11.0", - "osx.10.16-x64", - "osx.10.16", - "osx.10.15-x64", - "osx.10.15", - "osx.10.14-x64", - "osx.10.14", - "osx.10.13-x64", - "osx.10.13", - "osx.10.12-x64", - "osx.10.12", - "osx.10.11-x64", - "osx.10.11", - "osx.10.10-x64", - "osx.10.10", - "osx-x64", - "osx", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel": [ - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel-arm64": [ - "rhel-arm64", - "rhel", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "rhel-x64": [ - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.6": [ - "rhel.6", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.6-x64": [ - "rhel.6-x64", - "rhel.6", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.7": [ - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.7-x64": [ - "rhel.7-x64", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.7.0": [ - "rhel.7.0", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.7.0-x64": [ - "rhel.7.0-x64", - "rhel.7.0", - "rhel.7-x64", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.7.1": [ - "rhel.7.1", - "rhel.7.0", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.7.1-x64": [ - "rhel.7.1-x64", - "rhel.7.1", - "rhel.7.0-x64", - "rhel.7.0", - "rhel.7-x64", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.7.2": [ - "rhel.7.2", - "rhel.7.1", - "rhel.7.0", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.7.2-x64": [ - "rhel.7.2-x64", - "rhel.7.2", - "rhel.7.1-x64", - "rhel.7.1", - "rhel.7.0-x64", - "rhel.7.0", - "rhel.7-x64", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.7.3": [ - "rhel.7.3", - "rhel.7.2", - "rhel.7.1", - "rhel.7.0", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.7.3-x64": [ - "rhel.7.3-x64", - "rhel.7.3", - "rhel.7.2-x64", - "rhel.7.2", - "rhel.7.1-x64", - "rhel.7.1", - "rhel.7.0-x64", - "rhel.7.0", - "rhel.7-x64", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.7.4": [ - "rhel.7.4", - "rhel.7.3", - "rhel.7.2", - "rhel.7.1", - "rhel.7.0", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.7.4-x64": [ - "rhel.7.4-x64", - "rhel.7.4", - "rhel.7.3-x64", - "rhel.7.3", - "rhel.7.2-x64", - "rhel.7.2", - "rhel.7.1-x64", - "rhel.7.1", - "rhel.7.0-x64", - "rhel.7.0", - "rhel.7-x64", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.7.5": [ - "rhel.7.5", - "rhel.7.4", - "rhel.7.3", - "rhel.7.2", - "rhel.7.1", - "rhel.7.0", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.7.5-x64": [ - "rhel.7.5-x64", - "rhel.7.5", - "rhel.7.4-x64", - "rhel.7.4", - "rhel.7.3-x64", - "rhel.7.3", - "rhel.7.2-x64", - "rhel.7.2", - "rhel.7.1-x64", - "rhel.7.1", - "rhel.7.0-x64", - "rhel.7.0", - "rhel.7-x64", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.7.6": [ - "rhel.7.6", - "rhel.7.5", - "rhel.7.4", - "rhel.7.3", - "rhel.7.2", - "rhel.7.1", - "rhel.7.0", - "rhel.7", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.7.6-x64": [ - "rhel.7.6-x64", - "rhel.7.6", - "rhel.7.5-x64", - "rhel.7.5", - "rhel.7.4-x64", - "rhel.7.4", - "rhel.7.3-x64", - "rhel.7.3", - "rhel.7.2-x64", - "rhel.7.2", - "rhel.7.1-x64", - "rhel.7.1", - "rhel.7.0-x64", - "rhel.7.0", - "rhel.7-x64", - "rhel.7", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.8": [ - "rhel.8", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.8-arm64": [ - "rhel.8-arm64", - "rhel.8", - "rhel-arm64", - "rhel", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "rhel.8-x64": [ - "rhel.8-x64", - "rhel.8", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.8.0": [ - "rhel.8.0", - "rhel.8", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.8.0-arm64": [ - "rhel.8.0-arm64", - "rhel.8.0", - "rhel.8-arm64", - "rhel.8", - "rhel-arm64", - "rhel", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "rhel.8.0-x64": [ - "rhel.8.0-x64", - "rhel.8.0", - "rhel.8-x64", - "rhel.8", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.8.1": [ - "rhel.8.1", - "rhel.8.0", - "rhel.8", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.8.1-arm64": [ - "rhel.8.1-arm64", - "rhel.8.1", - "rhel.8.0-arm64", - "rhel.8.0", - "rhel.8-arm64", - "rhel.8", - "rhel-arm64", - "rhel", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "rhel.8.1-x64": [ - "rhel.8.1-x64", - "rhel.8.1", - "rhel.8.0-x64", - "rhel.8.0", - "rhel.8-x64", - "rhel.8", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rhel.9": [ - "rhel.9", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rhel.9-arm64": [ - "rhel.9-arm64", - "rhel.9", - "rhel-arm64", - "rhel", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "rhel.9-x64": [ - "rhel.9-x64", - "rhel.9", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rocky": [ - "rocky", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rocky-arm64": [ - "rocky-arm64", - "rocky", - "rhel-arm64", - "rhel", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "rocky-x64": [ - "rocky-x64", - "rocky", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rocky.8": [ - "rocky.8", - "rocky", - "rhel.8", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rocky.8-arm64": [ - "rocky.8-arm64", - "rocky.8", - "rocky-arm64", - "rhel.8-arm64", - "rocky", - "rhel.8", - "rhel-arm64", - "rhel", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "rocky.8-x64": [ - "rocky.8-x64", - "rocky.8", - "rocky-x64", - "rhel.8-x64", - "rocky", - "rhel.8", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "rocky.9": [ - "rocky.9", - "rocky", - "rhel.9", - "rhel", - "linux", - "unix", - "any", - "base" - ], - "rocky.9-arm64": [ - "rocky.9-arm64", - "rocky.9", - "rocky-arm64", - "rhel.9-arm64", - "rocky", - "rhel.9", - "rhel-arm64", - "rhel", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "rocky.9-x64": [ - "rocky.9-x64", - "rocky.9", - "rocky-x64", - "rhel.9-x64", - "rocky", - "rhel.9", - "rhel-x64", - "rhel", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "sles": [ - "sles", - "linux", - "unix", - "any", - "base" - ], - "sles-x64": [ - "sles-x64", - "sles", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "sles.12": [ - "sles.12", - "sles", - "linux", - "unix", - "any", - "base" - ], - "sles.12-x64": [ - "sles.12-x64", - "sles.12", - "sles-x64", - "sles", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "sles.12.1": [ - "sles.12.1", - "sles.12", - "sles", - "linux", - "unix", - "any", - "base" - ], - "sles.12.1-x64": [ - "sles.12.1-x64", - "sles.12.1", - "sles.12-x64", - "sles.12", - "sles-x64", - "sles", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "sles.12.2": [ - "sles.12.2", - "sles.12.1", - "sles.12", - "sles", - "linux", - "unix", - "any", - "base" - ], - "sles.12.2-x64": [ - "sles.12.2-x64", - "sles.12.2", - "sles.12.1-x64", - "sles.12.1", - "sles.12-x64", - "sles.12", - "sles-x64", - "sles", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "sles.12.3": [ - "sles.12.3", - "sles.12.2", - "sles.12.1", - "sles.12", - "sles", - "linux", - "unix", - "any", - "base" - ], - "sles.12.3-x64": [ - "sles.12.3-x64", - "sles.12.3", - "sles.12.2-x64", - "sles.12.2", - "sles.12.1-x64", - "sles.12.1", - "sles.12-x64", - "sles.12", - "sles-x64", - "sles", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "sles.12.4": [ - "sles.12.4", - "sles.12.3", - "sles.12.2", - "sles.12.1", - "sles.12", - "sles", - "linux", - "unix", - "any", - "base" - ], - "sles.12.4-x64": [ - "sles.12.4-x64", - "sles.12.4", - "sles.12.3-x64", - "sles.12.3", - "sles.12.2-x64", - "sles.12.2", - "sles.12.1-x64", - "sles.12.1", - "sles.12-x64", - "sles.12", - "sles-x64", - "sles", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "sles.15": [ - "sles.15", - "sles.12.4", - "sles.12.3", - "sles.12.2", - "sles.12.1", - "sles.12", - "sles", - "linux", - "unix", - "any", - "base" - ], - "sles.15-x64": [ - "sles.15-x64", - "sles.15", - "sles.12.4-x64", - "sles.12.4", - "sles.12.3-x64", - "sles.12.3", - "sles.12.2-x64", - "sles.12.2", - "sles.12.1-x64", - "sles.12.1", - "sles.12-x64", - "sles.12", - "sles-x64", - "sles", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "sles.15.1": [ - "sles.15.1", - "sles.15", - "sles.12.4", - "sles.12.3", - "sles.12.2", - "sles.12.1", - "sles.12", - "sles", - "linux", - "unix", - "any", - "base" - ], - "sles.15.1-x64": [ - "sles.15.1-x64", - "sles.15.1", - "sles.15-x64", - "sles.15", - "sles.12.4-x64", - "sles.12.4", - "sles.12.3-x64", - "sles.12.3", - "sles.12.2-x64", - "sles.12.2", - "sles.12.1-x64", - "sles.12.1", - "sles.12-x64", - "sles.12", - "sles-x64", - "sles", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "smartos": [ - "smartos", - "illumos", - "unix", - "any", - "base" - ], - "smartos-x64": [ - "smartos-x64", - "smartos", - "illumos-x64", - "illumos", - "unix-x64", - "unix", - "any", - "base" - ], - "smartos.2020": [ - "smartos.2020", - "smartos", - "illumos", - "unix", - "any", - "base" - ], - "smartos.2020-x64": [ - "smartos.2020-x64", - "smartos.2020", - "smartos-x64", - "smartos", - "illumos-x64", - "illumos", - "unix-x64", - "unix", - "any", - "base" - ], - "smartos.2021": [ - "smartos.2021", - "smartos.2020", - "smartos", - "illumos", - "unix", - "any", - "base" - ], - "smartos.2021-x64": [ - "smartos.2021-x64", - "smartos.2021", - "smartos.2020-x64", - "smartos.2020", - "smartos-x64", - "smartos", - "illumos-x64", - "illumos", - "unix-x64", - "unix", - "any", - "base" - ], - "solaris": [ - "solaris", - "unix", - "any", - "base" - ], - "solaris-x64": [ - "solaris-x64", - "solaris", - "unix-x64", - "unix", - "any", - "base" - ], - "solaris.11": [ - "solaris.11", - "solaris", - "unix", - "any", - "base" - ], - "solaris.11-x64": [ - "solaris.11-x64", - "solaris.11", - "solaris-x64", - "solaris", - "unix-x64", - "unix", - "any", - "base" - ], - "tizen": [ - "tizen", - "linux", - "unix", - "any", - "base" - ], - "tizen-arm64": [ - "tizen-arm64", - "tizen", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "tizen-armel": [ - "tizen-armel", - "tizen", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "tizen-x86": [ - "tizen-x86", - "tizen", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "tizen.4.0.0": [ - "tizen.4.0.0", - "tizen", - "linux", - "unix", - "any", - "base" - ], - "tizen.4.0.0-arm64": [ - "tizen.4.0.0-arm64", - "tizen.4.0.0", - "tizen-arm64", - "tizen", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "tizen.4.0.0-armel": [ - "tizen.4.0.0-armel", - "tizen.4.0.0", - "tizen-armel", - "tizen", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "tizen.4.0.0-x86": [ - "tizen.4.0.0-x86", - "tizen.4.0.0", - "tizen-x86", - "tizen", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "tizen.5.0.0": [ - "tizen.5.0.0", - "tizen.4.0.0", - "tizen", - "linux", - "unix", - "any", - "base" - ], - "tizen.5.0.0-arm64": [ - "tizen.5.0.0-arm64", - "tizen.5.0.0", - "tizen.4.0.0-arm64", - "tizen.4.0.0", - "tizen-arm64", - "tizen", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "tizen.5.0.0-armel": [ - "tizen.5.0.0-armel", - "tizen.5.0.0", - "tizen.4.0.0-armel", - "tizen.4.0.0", - "tizen-armel", - "tizen", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "tizen.5.0.0-x86": [ - "tizen.5.0.0-x86", - "tizen.5.0.0", - "tizen.4.0.0-x86", - "tizen.4.0.0", - "tizen-x86", - "tizen", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "tizen.5.5.0": [ - "tizen.5.5.0", - "tizen.5.0.0", - "tizen.4.0.0", - "tizen", - "linux", - "unix", - "any", - "base" - ], - "tizen.5.5.0-arm64": [ - "tizen.5.5.0-arm64", - "tizen.5.5.0", - "tizen.5.0.0-arm64", - "tizen.5.0.0", - "tizen.4.0.0-arm64", - "tizen.4.0.0", - "tizen-arm64", - "tizen", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "tizen.5.5.0-armel": [ - "tizen.5.5.0-armel", - "tizen.5.5.0", - "tizen.5.0.0-armel", - "tizen.5.0.0", - "tizen.4.0.0-armel", - "tizen.4.0.0", - "tizen-armel", - "tizen", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "tizen.5.5.0-x86": [ - "tizen.5.5.0-x86", - "tizen.5.5.0", - "tizen.5.0.0-x86", - "tizen.5.0.0", - "tizen.4.0.0-x86", - "tizen.4.0.0", - "tizen-x86", - "tizen", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "tizen.6.0.0": [ - "tizen.6.0.0", - "tizen.5.5.0", - "tizen.5.0.0", - "tizen.4.0.0", - "tizen", - "linux", - "unix", - "any", - "base" - ], - "tizen.6.0.0-arm64": [ - "tizen.6.0.0-arm64", - "tizen.6.0.0", - "tizen.5.5.0-arm64", - "tizen.5.5.0", - "tizen.5.0.0-arm64", - "tizen.5.0.0", - "tizen.4.0.0-arm64", - "tizen.4.0.0", - "tizen-arm64", - "tizen", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "tizen.6.0.0-armel": [ - "tizen.6.0.0-armel", - "tizen.6.0.0", - "tizen.5.5.0-armel", - "tizen.5.5.0", - "tizen.5.0.0-armel", - "tizen.5.0.0", - "tizen.4.0.0-armel", - "tizen.4.0.0", - "tizen-armel", - "tizen", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "tizen.6.0.0-x86": [ - "tizen.6.0.0-x86", - "tizen.6.0.0", - "tizen.5.5.0-x86", - "tizen.5.5.0", - "tizen.5.0.0-x86", - "tizen.5.0.0", - "tizen.4.0.0-x86", - "tizen.4.0.0", - "tizen-x86", - "tizen", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "tizen.6.5.0": [ - "tizen.6.5.0", - "tizen.6.0.0", - "tizen.5.5.0", - "tizen.5.0.0", - "tizen.4.0.0", - "tizen", - "linux", - "unix", - "any", - "base" - ], - "tizen.6.5.0-arm64": [ - "tizen.6.5.0-arm64", - "tizen.6.5.0", - "tizen.6.0.0-arm64", - "tizen.6.0.0", - "tizen.5.5.0-arm64", - "tizen.5.5.0", - "tizen.5.0.0-arm64", - "tizen.5.0.0", - "tizen.4.0.0-arm64", - "tizen.4.0.0", - "tizen-arm64", - "tizen", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "tizen.6.5.0-armel": [ - "tizen.6.5.0-armel", - "tizen.6.5.0", - "tizen.6.0.0-armel", - "tizen.6.0.0", - "tizen.5.5.0-armel", - "tizen.5.5.0", - "tizen.5.0.0-armel", - "tizen.5.0.0", - "tizen.4.0.0-armel", - "tizen.4.0.0", - "tizen-armel", - "tizen", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "tizen.6.5.0-x86": [ - "tizen.6.5.0-x86", - "tizen.6.5.0", - "tizen.6.0.0-x86", - "tizen.6.0.0", - "tizen.5.5.0-x86", - "tizen.5.5.0", - "tizen.5.0.0-x86", - "tizen.5.0.0", - "tizen.4.0.0-x86", - "tizen.4.0.0", - "tizen-x86", - "tizen", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "tizen.7.0.0": [ - "tizen.7.0.0", - "tizen.6.5.0", - "tizen.6.0.0", - "tizen.5.5.0", - "tizen.5.0.0", - "tizen.4.0.0", - "tizen", - "linux", - "unix", - "any", - "base" - ], - "tizen.7.0.0-arm64": [ - "tizen.7.0.0-arm64", - "tizen.7.0.0", - "tizen.6.5.0-arm64", - "tizen.6.5.0", - "tizen.6.0.0-arm64", - "tizen.6.0.0", - "tizen.5.5.0-arm64", - "tizen.5.5.0", - "tizen.5.0.0-arm64", - "tizen.5.0.0", - "tizen.4.0.0-arm64", - "tizen.4.0.0", - "tizen-arm64", - "tizen", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "tizen.7.0.0-armel": [ - "tizen.7.0.0-armel", - "tizen.7.0.0", - "tizen.6.5.0-armel", - "tizen.6.5.0", - "tizen.6.0.0-armel", - "tizen.6.0.0", - "tizen.5.5.0-armel", - "tizen.5.5.0", - "tizen.5.0.0-armel", - "tizen.5.0.0", - "tizen.4.0.0-armel", - "tizen.4.0.0", - "tizen-armel", - "tizen", - "linux-armel", - "linux", - "unix-armel", - "unix", - "any", - "base" - ], - "tizen.7.0.0-x86": [ - "tizen.7.0.0-x86", - "tizen.7.0.0", - "tizen.6.5.0-x86", - "tizen.6.5.0", - "tizen.6.0.0-x86", - "tizen.6.0.0", - "tizen.5.5.0-x86", - "tizen.5.5.0", - "tizen.5.0.0-x86", - "tizen.5.0.0", - "tizen.4.0.0-x86", - "tizen.4.0.0", - "tizen-x86", - "tizen", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "tvos": [ - "tvos", - "unix", - "any", - "base" - ], - "tvos-arm64": [ - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvos-x64": [ - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvos.10": [ - "tvos.10", - "tvos", - "unix", - "any", - "base" - ], - "tvos.10-arm64": [ - "tvos.10-arm64", - "tvos.10", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvos.10-x64": [ - "tvos.10-x64", - "tvos.10", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvos.11": [ - "tvos.11", - "tvos.10", - "tvos", - "unix", - "any", - "base" - ], - "tvos.11-arm64": [ - "tvos.11-arm64", - "tvos.11", - "tvos.10-arm64", - "tvos.10", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvos.11-x64": [ - "tvos.11-x64", - "tvos.11", - "tvos.10-x64", - "tvos.10", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvos.12": [ - "tvos.12", - "tvos.11", - "tvos.10", - "tvos", - "unix", - "any", - "base" - ], - "tvos.12-arm64": [ - "tvos.12-arm64", - "tvos.12", - "tvos.11-arm64", - "tvos.11", - "tvos.10-arm64", - "tvos.10", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvos.12-x64": [ - "tvos.12-x64", - "tvos.12", - "tvos.11-x64", - "tvos.11", - "tvos.10-x64", - "tvos.10", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvos.13": [ - "tvos.13", - "tvos.12", - "tvos.11", - "tvos.10", - "tvos", - "unix", - "any", - "base" - ], - "tvos.13-arm64": [ - "tvos.13-arm64", - "tvos.13", - "tvos.12-arm64", - "tvos.12", - "tvos.11-arm64", - "tvos.11", - "tvos.10-arm64", - "tvos.10", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvos.13-x64": [ - "tvos.13-x64", - "tvos.13", - "tvos.12-x64", - "tvos.12", - "tvos.11-x64", - "tvos.11", - "tvos.10-x64", - "tvos.10", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvos.14": [ - "tvos.14", - "tvos.13", - "tvos.12", - "tvos.11", - "tvos.10", - "tvos", - "unix", - "any", - "base" - ], - "tvos.14-arm64": [ - "tvos.14-arm64", - "tvos.14", - "tvos.13-arm64", - "tvos.13", - "tvos.12-arm64", - "tvos.12", - "tvos.11-arm64", - "tvos.11", - "tvos.10-arm64", - "tvos.10", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvos.14-x64": [ - "tvos.14-x64", - "tvos.14", - "tvos.13-x64", - "tvos.13", - "tvos.12-x64", - "tvos.12", - "tvos.11-x64", - "tvos.11", - "tvos.10-x64", - "tvos.10", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvos.15": [ - "tvos.15", - "tvos.14", - "tvos.13", - "tvos.12", - "tvos.11", - "tvos.10", - "tvos", - "unix", - "any", - "base" - ], - "tvos.15-arm64": [ - "tvos.15-arm64", - "tvos.15", - "tvos.14-arm64", - "tvos.14", - "tvos.13-arm64", - "tvos.13", - "tvos.12-arm64", - "tvos.12", - "tvos.11-arm64", - "tvos.11", - "tvos.10-arm64", - "tvos.10", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvos.15-x64": [ - "tvos.15-x64", - "tvos.15", - "tvos.14-x64", - "tvos.14", - "tvos.13-x64", - "tvos.13", - "tvos.12-x64", - "tvos.12", - "tvos.11-x64", - "tvos.11", - "tvos.10-x64", - "tvos.10", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvossimulator": [ - "tvossimulator", - "tvos", - "unix", - "any", - "base" - ], - "tvossimulator-arm64": [ - "tvossimulator-arm64", - "tvossimulator", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvossimulator-x64": [ - "tvossimulator-x64", - "tvossimulator", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvossimulator.10": [ - "tvossimulator.10", - "tvossimulator", - "tvos", - "unix", - "any", - "base" - ], - "tvossimulator.10-arm64": [ - "tvossimulator.10-arm64", - "tvossimulator.10", - "tvossimulator-arm64", - "tvossimulator", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvossimulator.10-x64": [ - "tvossimulator.10-x64", - "tvossimulator.10", - "tvossimulator-x64", - "tvossimulator", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvossimulator.11": [ - "tvossimulator.11", - "tvossimulator.10", - "tvossimulator", - "tvos", - "unix", - "any", - "base" - ], - "tvossimulator.11-arm64": [ - "tvossimulator.11-arm64", - "tvossimulator.11", - "tvossimulator.10-arm64", - "tvossimulator.10", - "tvossimulator-arm64", - "tvossimulator", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvossimulator.11-x64": [ - "tvossimulator.11-x64", - "tvossimulator.11", - "tvossimulator.10-x64", - "tvossimulator.10", - "tvossimulator-x64", - "tvossimulator", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvossimulator.12": [ - "tvossimulator.12", - "tvossimulator.11", - "tvossimulator.10", - "tvossimulator", - "tvos", - "unix", - "any", - "base" - ], - "tvossimulator.12-arm64": [ - "tvossimulator.12-arm64", - "tvossimulator.12", - "tvossimulator.11-arm64", - "tvossimulator.11", - "tvossimulator.10-arm64", - "tvossimulator.10", - "tvossimulator-arm64", - "tvossimulator", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvossimulator.12-x64": [ - "tvossimulator.12-x64", - "tvossimulator.12", - "tvossimulator.11-x64", - "tvossimulator.11", - "tvossimulator.10-x64", - "tvossimulator.10", - "tvossimulator-x64", - "tvossimulator", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvossimulator.13": [ - "tvossimulator.13", - "tvossimulator.12", - "tvossimulator.11", - "tvossimulator.10", - "tvossimulator", - "tvos", - "unix", - "any", - "base" - ], - "tvossimulator.13-arm64": [ - "tvossimulator.13-arm64", - "tvossimulator.13", - "tvossimulator.12-arm64", - "tvossimulator.12", - "tvossimulator.11-arm64", - "tvossimulator.11", - "tvossimulator.10-arm64", - "tvossimulator.10", - "tvossimulator-arm64", - "tvossimulator", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvossimulator.13-x64": [ - "tvossimulator.13-x64", - "tvossimulator.13", - "tvossimulator.12-x64", - "tvossimulator.12", - "tvossimulator.11-x64", - "tvossimulator.11", - "tvossimulator.10-x64", - "tvossimulator.10", - "tvossimulator-x64", - "tvossimulator", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvossimulator.14": [ - "tvossimulator.14", - "tvossimulator.13", - "tvossimulator.12", - "tvossimulator.11", - "tvossimulator.10", - "tvossimulator", - "tvos", - "unix", - "any", - "base" - ], - "tvossimulator.14-arm64": [ - "tvossimulator.14-arm64", - "tvossimulator.14", - "tvossimulator.13-arm64", - "tvossimulator.13", - "tvossimulator.12-arm64", - "tvossimulator.12", - "tvossimulator.11-arm64", - "tvossimulator.11", - "tvossimulator.10-arm64", - "tvossimulator.10", - "tvossimulator-arm64", - "tvossimulator", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvossimulator.14-x64": [ - "tvossimulator.14-x64", - "tvossimulator.14", - "tvossimulator.13-x64", - "tvossimulator.13", - "tvossimulator.12-x64", - "tvossimulator.12", - "tvossimulator.11-x64", - "tvossimulator.11", - "tvossimulator.10-x64", - "tvossimulator.10", - "tvossimulator-x64", - "tvossimulator", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "tvossimulator.15": [ - "tvossimulator.15", - "tvossimulator.14", - "tvossimulator.13", - "tvossimulator.12", - "tvossimulator.11", - "tvossimulator.10", - "tvossimulator", - "tvos", - "unix", - "any", - "base" - ], - "tvossimulator.15-arm64": [ - "tvossimulator.15-arm64", - "tvossimulator.15", - "tvossimulator.14-arm64", - "tvossimulator.14", - "tvossimulator.13-arm64", - "tvossimulator.13", - "tvossimulator.12-arm64", - "tvossimulator.12", - "tvossimulator.11-arm64", - "tvossimulator.11", - "tvossimulator.10-arm64", - "tvossimulator.10", - "tvossimulator-arm64", - "tvossimulator", - "tvos-arm64", - "tvos", - "unix-arm64", - "unix", - "any", - "base" - ], - "tvossimulator.15-x64": [ - "tvossimulator.15-x64", - "tvossimulator.15", - "tvossimulator.14-x64", - "tvossimulator.14", - "tvossimulator.13-x64", - "tvossimulator.13", - "tvossimulator.12-x64", - "tvossimulator.12", - "tvossimulator.11-x64", - "tvossimulator.11", - "tvossimulator.10-x64", - "tvossimulator.10", - "tvossimulator-x64", - "tvossimulator", - "tvos-x64", - "tvos", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu": [ - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu-arm": [ - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu-arm64": [ - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu-x64": [ - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu-x86": [ - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.14.04": [ - "ubuntu.14.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.14.04-arm": [ - "ubuntu.14.04-arm", - "ubuntu.14.04", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.14.04-x64": [ - "ubuntu.14.04-x64", - "ubuntu.14.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.14.04-x86": [ - "ubuntu.14.04-x86", - "ubuntu.14.04", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.14.10": [ - "ubuntu.14.10", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.14.10-arm": [ - "ubuntu.14.10-arm", - "ubuntu.14.10", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.14.10-x64": [ - "ubuntu.14.10-x64", - "ubuntu.14.10", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.14.10-x86": [ - "ubuntu.14.10-x86", - "ubuntu.14.10", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.15.04": [ - "ubuntu.15.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.15.04-arm": [ - "ubuntu.15.04-arm", - "ubuntu.15.04", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.15.04-x64": [ - "ubuntu.15.04-x64", - "ubuntu.15.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.15.04-x86": [ - "ubuntu.15.04-x86", - "ubuntu.15.04", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.15.10": [ - "ubuntu.15.10", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.15.10-arm": [ - "ubuntu.15.10-arm", - "ubuntu.15.10", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.15.10-x64": [ - "ubuntu.15.10-x64", - "ubuntu.15.10", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.15.10-x86": [ - "ubuntu.15.10-x86", - "ubuntu.15.10", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.16.04": [ - "ubuntu.16.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.16.04-arm": [ - "ubuntu.16.04-arm", - "ubuntu.16.04", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.16.04-arm64": [ - "ubuntu.16.04-arm64", - "ubuntu.16.04", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.16.04-x64": [ - "ubuntu.16.04-x64", - "ubuntu.16.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.16.04-x86": [ - "ubuntu.16.04-x86", - "ubuntu.16.04", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.16.10": [ - "ubuntu.16.10", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.16.10-arm": [ - "ubuntu.16.10-arm", - "ubuntu.16.10", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.16.10-arm64": [ - "ubuntu.16.10-arm64", - "ubuntu.16.10", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.16.10-x64": [ - "ubuntu.16.10-x64", - "ubuntu.16.10", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.16.10-x86": [ - "ubuntu.16.10-x86", - "ubuntu.16.10", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.17.04": [ - "ubuntu.17.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.17.04-arm": [ - "ubuntu.17.04-arm", - "ubuntu.17.04", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.17.04-arm64": [ - "ubuntu.17.04-arm64", - "ubuntu.17.04", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.17.04-x64": [ - "ubuntu.17.04-x64", - "ubuntu.17.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.17.04-x86": [ - "ubuntu.17.04-x86", - "ubuntu.17.04", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.17.10": [ - "ubuntu.17.10", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.17.10-arm": [ - "ubuntu.17.10-arm", - "ubuntu.17.10", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.17.10-arm64": [ - "ubuntu.17.10-arm64", - "ubuntu.17.10", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.17.10-x64": [ - "ubuntu.17.10-x64", - "ubuntu.17.10", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.17.10-x86": [ - "ubuntu.17.10-x86", - "ubuntu.17.10", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.18.04": [ - "ubuntu.18.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.18.04-arm": [ - "ubuntu.18.04-arm", - "ubuntu.18.04", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.18.04-arm64": [ - "ubuntu.18.04-arm64", - "ubuntu.18.04", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.18.04-x64": [ - "ubuntu.18.04-x64", - "ubuntu.18.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.18.04-x86": [ - "ubuntu.18.04-x86", - "ubuntu.18.04", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.18.10": [ - "ubuntu.18.10", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.18.10-arm": [ - "ubuntu.18.10-arm", - "ubuntu.18.10", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.18.10-arm64": [ - "ubuntu.18.10-arm64", - "ubuntu.18.10", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.18.10-x64": [ - "ubuntu.18.10-x64", - "ubuntu.18.10", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.18.10-x86": [ - "ubuntu.18.10-x86", - "ubuntu.18.10", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.19.04": [ - "ubuntu.19.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.19.04-arm": [ - "ubuntu.19.04-arm", - "ubuntu.19.04", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.19.04-arm64": [ - "ubuntu.19.04-arm64", - "ubuntu.19.04", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.19.04-x64": [ - "ubuntu.19.04-x64", - "ubuntu.19.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.19.04-x86": [ - "ubuntu.19.04-x86", - "ubuntu.19.04", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.19.10": [ - "ubuntu.19.10", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.19.10-arm": [ - "ubuntu.19.10-arm", - "ubuntu.19.10", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.19.10-arm64": [ - "ubuntu.19.10-arm64", - "ubuntu.19.10", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.19.10-x64": [ - "ubuntu.19.10-x64", - "ubuntu.19.10", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.19.10-x86": [ - "ubuntu.19.10-x86", - "ubuntu.19.10", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.20.04": [ - "ubuntu.20.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.20.04-arm": [ - "ubuntu.20.04-arm", - "ubuntu.20.04", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.20.04-arm64": [ - "ubuntu.20.04-arm64", - "ubuntu.20.04", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.20.04-x64": [ - "ubuntu.20.04-x64", - "ubuntu.20.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.20.04-x86": [ - "ubuntu.20.04-x86", - "ubuntu.20.04", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.20.10": [ - "ubuntu.20.10", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.20.10-arm": [ - "ubuntu.20.10-arm", - "ubuntu.20.10", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.20.10-arm64": [ - "ubuntu.20.10-arm64", - "ubuntu.20.10", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.20.10-x64": [ - "ubuntu.20.10-x64", - "ubuntu.20.10", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.20.10-x86": [ - "ubuntu.20.10-x86", - "ubuntu.20.10", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.21.04": [ - "ubuntu.21.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.21.04-arm": [ - "ubuntu.21.04-arm", - "ubuntu.21.04", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.21.04-arm64": [ - "ubuntu.21.04-arm64", - "ubuntu.21.04", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.21.04-x64": [ - "ubuntu.21.04-x64", - "ubuntu.21.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.21.04-x86": [ - "ubuntu.21.04-x86", - "ubuntu.21.04", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.21.10": [ - "ubuntu.21.10", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.21.10-arm": [ - "ubuntu.21.10-arm", - "ubuntu.21.10", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.21.10-arm64": [ - "ubuntu.21.10-arm64", - "ubuntu.21.10", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.21.10-x64": [ - "ubuntu.21.10-x64", - "ubuntu.21.10", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.21.10-x86": [ - "ubuntu.21.10-x86", - "ubuntu.21.10", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.22.04": [ - "ubuntu.22.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.22.04-arm": [ - "ubuntu.22.04-arm", - "ubuntu.22.04", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.22.04-arm64": [ - "ubuntu.22.04-arm64", - "ubuntu.22.04", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.22.04-x64": [ - "ubuntu.22.04-x64", - "ubuntu.22.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.22.04-x86": [ - "ubuntu.22.04-x86", - "ubuntu.22.04", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.22.10": [ - "ubuntu.22.10", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.22.10-arm": [ - "ubuntu.22.10-arm", - "ubuntu.22.10", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.22.10-arm64": [ - "ubuntu.22.10-arm64", - "ubuntu.22.10", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.22.10-x64": [ - "ubuntu.22.10-x64", - "ubuntu.22.10", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.22.10-x86": [ - "ubuntu.22.10-x86", - "ubuntu.22.10", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.23.04": [ - "ubuntu.23.04", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.23.04-arm": [ - "ubuntu.23.04-arm", - "ubuntu.23.04", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.23.04-arm64": [ - "ubuntu.23.04-arm64", - "ubuntu.23.04", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.23.04-x64": [ - "ubuntu.23.04-x64", - "ubuntu.23.04", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.23.04-x86": [ - "ubuntu.23.04-x86", - "ubuntu.23.04", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "ubuntu.23.10": [ - "ubuntu.23.10", - "ubuntu", - "debian", - "linux", - "unix", - "any", - "base" - ], - "ubuntu.23.10-arm": [ - "ubuntu.23.10-arm", - "ubuntu.23.10", - "ubuntu-arm", - "ubuntu", - "debian-arm", - "debian", - "linux-arm", - "linux", - "unix-arm", - "unix", - "any", - "base" - ], - "ubuntu.23.10-arm64": [ - "ubuntu.23.10-arm64", - "ubuntu.23.10", - "ubuntu-arm64", - "ubuntu", - "debian-arm64", - "debian", - "linux-arm64", - "linux", - "unix-arm64", - "unix", - "any", - "base" - ], - "ubuntu.23.10-x64": [ - "ubuntu.23.10-x64", - "ubuntu.23.10", - "ubuntu-x64", - "ubuntu", - "debian-x64", - "debian", - "linux-x64", - "linux", - "unix-x64", - "unix", - "any", - "base" - ], - "ubuntu.23.10-x86": [ - "ubuntu.23.10-x86", - "ubuntu.23.10", - "ubuntu-x86", - "ubuntu", - "debian-x86", - "debian", - "linux-x86", - "linux", - "unix-x86", - "unix", - "any", - "base" - ], - "unix": [ - "unix", - "any", - "base" - ], - "unix-arm": [ - "unix-arm", - "unix", - "any", - "base" - ], - "unix-arm64": [ - "unix-arm64", - "unix", - "any", - "base" - ], - "unix-armel": [ - "unix-armel", - "unix", - "any", - "base" - ], - "unix-armv6": [ - "unix-armv6", - "unix", - "any", - "base" - ], - "unix-loongarch64": [ - "unix-loongarch64", - "unix", - "any", - "base" - ], - "unix-mips64": [ - "unix-mips64", - "unix", - "any", - "base" - ], - "unix-ppc64le": [ - "unix-ppc64le", - "unix", - "any", - "base" - ], - "unix-riscv64": [ - "unix-riscv64", - "unix", - "any", - "base" - ], - "unix-s390x": [ - "unix-s390x", - "unix", - "any", - "base" - ], - "unix-x64": [ - "unix-x64", - "unix", - "any", - "base" - ], - "unix-x86": [ - "unix-x86", - "unix", - "any", - "base" - ], - "wasi": [ - "wasi", - "any", - "base" - ], - "wasi-wasm": [ - "wasi-wasm", - "wasi", - "any", - "base" - ], - "win": [ - "win", - "any", - "base" - ], - "win-aot": [ - "win-aot", - "win", - "aot", - "any", - "base" - ], - "win-arm": [ - "win-arm", - "win", - "any", - "base" - ], - "win-arm-aot": [ - "win-arm-aot", - "win-aot", - "win-arm", - "win", - "aot", - "any", - "base" - ], - "win-arm64": [ - "win-arm64", - "win", - "any", - "base" - ], - "win-arm64-aot": [ - "win-arm64-aot", - "win-aot", - "win-arm64", - "win", - "aot", - "any", - "base" - ], - "win-x64": [ - "win-x64", - "win", - "any", - "base" - ], - "win-x64-aot": [ - "win-x64-aot", - "win-aot", - "win-x64", - "win", - "aot", - "any", - "base" - ], - "win-x86": [ - "win-x86", - "win", - "any", - "base" - ], - "win-x86-aot": [ - "win-x86-aot", - "win-aot", - "win-x86", - "win", - "aot", - "any", - "base" - ], - "win10": [ - "win10", - "win81", - "win8", - "win7", - "win", - "any", - "base" - ], - "win10-aot": [ - "win10-aot", - "win10", - "win81-aot", - "win81", - "win8-aot", - "win8", - "win7-aot", - "win7", - "win-aot", - "win", - "aot", - "any", - "base" - ], - "win10-arm": [ - "win10-arm", - "win10", - "win81-arm", - "win81", - "win8-arm", - "win8", - "win7-arm", - "win7", - "win-arm", - "win", - "any", - "base" - ], - "win10-arm-aot": [ - "win10-arm-aot", - "win10-aot", - "win10-arm", - "win10", - "win81-arm-aot", - "win81-aot", - "win81-arm", - "win81", - "win8-arm-aot", - "win8-aot", - "win8-arm", - "win8", - "win7-arm-aot", - "win7-aot", - "win7-arm", - "win7", - "win-arm-aot", - "win-aot", - "win-arm", - "win", - "aot", - "any", - "base" - ], - "win10-arm64": [ - "win10-arm64", - "win10", - "win81-arm64", - "win81", - "win8-arm64", - "win8", - "win7-arm64", - "win7", - "win-arm64", - "win", - "any", - "base" - ], - "win10-arm64-aot": [ - "win10-arm64-aot", - "win10-aot", - "win10-arm64", - "win10", - "win81-arm64-aot", - "win81-aot", - "win81-arm64", - "win81", - "win8-arm64-aot", - "win8-aot", - "win8-arm64", - "win8", - "win7-arm64-aot", - "win7-aot", - "win7-arm64", - "win7", - "win-arm64-aot", - "win-aot", - "win-arm64", - "win", - "aot", - "any", - "base" - ], - "win10-x64": [ - "win10-x64", - "win10", - "win81-x64", - "win81", - "win8-x64", - "win8", - "win7-x64", - "win7", - "win-x64", - "win", - "any", - "base" - ], - "win10-x64-aot": [ - "win10-x64-aot", - "win10-aot", - "win10-x64", - "win10", - "win81-x64-aot", - "win81-aot", - "win81-x64", - "win81", - "win8-x64-aot", - "win8-aot", - "win8-x64", - "win8", - "win7-x64-aot", - "win7-aot", - "win7-x64", - "win7", - "win-x64-aot", - "win-aot", - "win-x64", - "win", - "aot", - "any", - "base" - ], - "win10-x86": [ - "win10-x86", - "win10", - "win81-x86", - "win81", - "win8-x86", - "win8", - "win7-x86", - "win7", - "win-x86", - "win", - "any", - "base" - ], - "win10-x86-aot": [ - "win10-x86-aot", - "win10-aot", - "win10-x86", - "win10", - "win81-x86-aot", - "win81-aot", - "win81-x86", - "win81", - "win8-x86-aot", - "win8-aot", - "win8-x86", - "win8", - "win7-x86-aot", - "win7-aot", - "win7-x86", - "win7", - "win-x86-aot", - "win-aot", - "win-x86", - "win", - "aot", - "any", - "base" - ], - "win7": [ - "win7", - "win", - "any", - "base" - ], - "win7-aot": [ - "win7-aot", - "win7", - "win-aot", - "win", - "aot", - "any", - "base" - ], - "win7-arm": [ - "win7-arm", - "win7", - "win-arm", - "win", - "any", - "base" - ], - "win7-arm-aot": [ - "win7-arm-aot", - "win7-aot", - "win7-arm", - "win7", - "win-arm-aot", - "win-aot", - "win-arm", - "win", - "aot", - "any", - "base" - ], - "win7-arm64": [ - "win7-arm64", - "win7", - "win-arm64", - "win", - "any", - "base" - ], - "win7-arm64-aot": [ - "win7-arm64-aot", - "win7-aot", - "win7-arm64", - "win7", - "win-arm64-aot", - "win-aot", - "win-arm64", - "win", - "aot", - "any", - "base" - ], - "win7-x64": [ - "win7-x64", - "win7", - "win-x64", - "win", - "any", - "base" - ], - "win7-x64-aot": [ - "win7-x64-aot", - "win7-aot", - "win7-x64", - "win7", - "win-x64-aot", - "win-aot", - "win-x64", - "win", - "aot", - "any", - "base" - ], - "win7-x86": [ - "win7-x86", - "win7", - "win-x86", - "win", - "any", - "base" - ], - "win7-x86-aot": [ - "win7-x86-aot", - "win7-aot", - "win7-x86", - "win7", - "win-x86-aot", - "win-aot", - "win-x86", - "win", - "aot", - "any", - "base" - ], - "win8": [ - "win8", - "win7", - "win", - "any", - "base" - ], - "win8-aot": [ - "win8-aot", - "win8", - "win7-aot", - "win7", - "win-aot", - "win", - "aot", - "any", - "base" - ], - "win8-arm": [ - "win8-arm", - "win8", - "win7-arm", - "win7", - "win-arm", - "win", - "any", - "base" - ], - "win8-arm-aot": [ - "win8-arm-aot", - "win8-aot", - "win8-arm", - "win8", - "win7-arm-aot", - "win7-aot", - "win7-arm", - "win7", - "win-arm-aot", - "win-aot", - "win-arm", - "win", - "aot", - "any", - "base" - ], - "win8-arm64": [ - "win8-arm64", - "win8", - "win7-arm64", - "win7", - "win-arm64", - "win", - "any", - "base" - ], - "win8-arm64-aot": [ - "win8-arm64-aot", - "win8-aot", - "win8-arm64", - "win8", - "win7-arm64-aot", - "win7-aot", - "win7-arm64", - "win7", - "win-arm64-aot", - "win-aot", - "win-arm64", - "win", - "aot", - "any", - "base" - ], - "win8-x64": [ - "win8-x64", - "win8", - "win7-x64", - "win7", - "win-x64", - "win", - "any", - "base" - ], - "win8-x64-aot": [ - "win8-x64-aot", - "win8-aot", - "win8-x64", - "win8", - "win7-x64-aot", - "win7-aot", - "win7-x64", - "win7", - "win-x64-aot", - "win-aot", - "win-x64", - "win", - "aot", - "any", - "base" - ], - "win8-x86": [ - "win8-x86", - "win8", - "win7-x86", - "win7", - "win-x86", - "win", - "any", - "base" - ], - "win8-x86-aot": [ - "win8-x86-aot", - "win8-aot", - "win8-x86", - "win8", - "win7-x86-aot", - "win7-aot", - "win7-x86", - "win7", - "win-x86-aot", - "win-aot", - "win-x86", - "win", - "aot", - "any", - "base" - ], - "win81": [ - "win81", - "win8", - "win7", - "win", - "any", - "base" - ], - "win81-aot": [ - "win81-aot", - "win81", - "win8-aot", - "win8", - "win7-aot", - "win7", - "win-aot", - "win", - "aot", - "any", - "base" - ], - "win81-arm": [ - "win81-arm", - "win81", - "win8-arm", - "win8", - "win7-arm", - "win7", - "win-arm", - "win", - "any", - "base" - ], - "win81-arm-aot": [ - "win81-arm-aot", - "win81-aot", - "win81-arm", - "win81", - "win8-arm-aot", - "win8-aot", - "win8-arm", - "win8", - "win7-arm-aot", - "win7-aot", - "win7-arm", - "win7", - "win-arm-aot", - "win-aot", - "win-arm", - "win", - "aot", - "any", - "base" - ], - "win81-arm64": [ - "win81-arm64", - "win81", - "win8-arm64", - "win8", - "win7-arm64", - "win7", - "win-arm64", - "win", - "any", - "base" - ], - "win81-arm64-aot": [ - "win81-arm64-aot", - "win81-aot", - "win81-arm64", - "win81", - "win8-arm64-aot", - "win8-aot", - "win8-arm64", - "win8", - "win7-arm64-aot", - "win7-aot", - "win7-arm64", - "win7", - "win-arm64-aot", - "win-aot", - "win-arm64", - "win", - "aot", - "any", - "base" - ], - "win81-x64": [ - "win81-x64", - "win81", - "win8-x64", - "win8", - "win7-x64", - "win7", - "win-x64", - "win", - "any", - "base" - ], - "win81-x64-aot": [ - "win81-x64-aot", - "win81-aot", - "win81-x64", - "win81", - "win8-x64-aot", - "win8-aot", - "win8-x64", - "win8", - "win7-x64-aot", - "win7-aot", - "win7-x64", - "win7", - "win-x64-aot", - "win-aot", - "win-x64", - "win", - "aot", - "any", - "base" - ], - "win81-x86": [ - "win81-x86", - "win81", - "win8-x86", - "win8", - "win7-x86", - "win7", - "win-x86", - "win", - "any", - "base" - ], - "win81-x86-aot": [ - "win81-x86-aot", - "win81-aot", - "win81-x86", - "win81", - "win8-x86-aot", - "win8-aot", - "win8-x86", - "win8", - "win7-x86-aot", - "win7-aot", - "win7-x86", - "win7", - "win-x86-aot", - "win-aot", - "win-x86", - "win", - "aot", - "any", - "base" - ] -} \ No newline at end of file diff --git a/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props b/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props deleted file mode 100644 index 05bdf782326b58..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/src/runtimeGroups.props +++ /dev/null @@ -1,296 +0,0 @@ - - - - - any - x64;x86;arm;armv6;armel;arm64;loongarch64;mips64;s390x;ppc64le;riscv64 - - - unix - x64;x86;arm;armv6;armel;arm64;loongarch64;mips64;s390x;ppc64le;riscv64 - - - linux - x64;x86;arm;armv6;armel;arm64;s390x;ppc64le;riscv64 - - - - linux-musl - x64;x86;arm;armv6;arm64;s390x;ppc64le - 3.6;3.7;3.8;3.9;3.10;3.11;3.12;3.13;3.14;3.15;3.16;3.17;3.18 - - - - linux - x64;x86;arm;arm64 - - - linux-bionic - x64;x86;arm;arm64 - 21;22;23;24;25;26;27;28;29;30;31;32 - - - - linux - x64 - - - - arch - x64 - - - - any - wasm - - - - any - wasm - - - - ios - x64;arm64 - 13;14;15 - - - - rhel - x64 - 7 - true - false - - - rhel - x64;arm64 - 8;9 - true - false - - - - linux - x64;x86;arm;armel;arm64 - 8;9;10;11;12 - false - - - - linux - x64 - - - - linux - x64;arm64 - 23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39 - false - - - - linux - x64 - - - - unix - arm;x86 - 10 - - - unix - arm64;x64 - 10;11;12;13;14;15 - - - - ios - x86 - 10 - - - ios - arm64;x64 - 10;11;12;13;14;15 - - - - unix - arm64;x64 - 10;11;12;13;14;15 - - - - tvos - arm64;x64 - 10;11;12;13;14;15 - - - - - ubuntu.14.04 - x64 - 1;2;3 - - - ubuntu.16.04 - x64 - 1;2;3 - - - ubuntu.18.04 - x64 - 1;2 - - - - rhel - x64 - 8;9 - true - false - - - - rhel - x64 - 7;7.0;7.1;7.2;7.3;7.4;7.5;7.6 - true - - - rhel - x64 - 8;8.0 - true - - - - - linux - x64 - 13.2;15.0;15.1;42.1;42.2;42.3 - false - - - - unix - x64;arm64 - 10.10;10.11;10.12;10.13;10.14;10.15;10.16;11.0;12;13 - - - - unix - x64;arm64 - 12;13 - - - - unix - x64 - 11 - - - - unix - x64 - - - - illumos - x64 - 15 - - - - illumos - x64 - - - - illumos - x64 - 2020;2021 - - - - - linux - x64 - 6 - - - - linux - x64 - 7;7.0;7.1;7.2;7.3;7.4;7.5;7.6 - - - linux - x64;arm64 - 8;8.0;8.1 - - - linux - x64;arm64 - 9 - - - - rhel - x64;arm64 - 8;9 - true - false - - - - linux - x64 - 12;12.1;12.2;12.3;12.4;15;15.1 - - - - linux - x86;armel;arm64 - 4.0.0;5.0.0;5.5.0;6.0.0;6.5.0;7.0.0 - - - - debian - x64;x86;arm - 14.04;14.10;15.04;15.10 - false - - - debian - x64;x86;arm;arm64 - 16.04;16.10;17.04;17.10;18.04;18.10;19.04;19.10;20.04;20.10;21.04;21.10;22.04;22.10;23.04;23.10 - false - - - - any - true - aot - x64;x86;arm;arm64 - 7;8;81;10 - - - - - - - - base - - - - - any - - - - diff --git a/src/libraries/Microsoft.NETCore.Platforms/tests/AssemblyInfo.cs b/src/libraries/Microsoft.NETCore.Platforms/tests/AssemblyInfo.cs deleted file mode 100644 index f5a33895866d57..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/tests/AssemblyInfo.cs +++ /dev/null @@ -1,6 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Xunit; - -[assembly: SkipOnPlatform(TestPlatforms.Browser, "MSBuild is not supported on Browser")] \ No newline at end of file diff --git a/src/libraries/Microsoft.NETCore.Platforms/tests/GenerateRuntimeGraphTests.cs b/src/libraries/Microsoft.NETCore.Platforms/tests/GenerateRuntimeGraphTests.cs deleted file mode 100644 index 63e83a819bd81e..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/tests/GenerateRuntimeGraphTests.cs +++ /dev/null @@ -1,264 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.IO; -using System.Linq; -using System.Runtime.CompilerServices; -using Microsoft.Build.Evaluation; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using NuGet.RuntimeModel; -using Xunit; -using Xunit.Abstractions; - -namespace Microsoft.NETCore.Platforms.BuildTasks.Tests -{ - // MSBuild engine is not compatible with single file - [ConditionalClass(typeof(PlatformDetection), nameof(PlatformDetection.HasAssemblyFiles))] - public class GenerateRuntimeGraphTests - { - private Log _log; - private TestBuildEngine _engine; - - private string defaultRootPath = (PlatformDetection.IsiOS || PlatformDetection.IstvOS) ? Path.GetTempPath() : string.Empty; - private string defaultRuntimeFile = "runtime.json"; - - public GenerateRuntimeGraphTests(ITestOutputHelper output) - { - _log = new Log(output); - _engine = new TestBuildEngine(_log); - - if (PlatformDetection.IsiOS || PlatformDetection.IstvOS) - { - var runtimeJsonPath = Path.Combine(defaultRootPath, defaultRuntimeFile); - File.Copy(defaultRuntimeFile, runtimeJsonPath, true); - - defaultRuntimeFile = runtimeJsonPath; - } - } - - private static ITaskItem[] DefaultRuntimeGroupItems { get; } = GetDefaultRuntimeGroupItems(); - - private static ITaskItem[] GetDefaultRuntimeGroupItems() - { - Project runtimeGroupProps = new Project("runtimeGroups.props"); - - ITaskItem[] runtimeGroups = runtimeGroupProps.GetItems("RuntimeGroupWithQualifiers") - .Select(i => CreateItem(i)).ToArray(); - - Assert.NotEmpty(runtimeGroups); - - return runtimeGroups; - } - - private static ITaskItem CreateItem(ProjectItem projectItem) - { - TaskItem item = new TaskItem(projectItem.EvaluatedInclude); - foreach (var metadatum in projectItem.Metadata) - { - item.SetMetadata(metadatum.Name, metadatum.EvaluatedValue); - } - return item; - } - - [Fact] - [ActiveIssue("https://github.com/dotnet/runtime/issues/77889", TestPlatforms.iOS | TestPlatforms.tvOS)] - public void CanCreateRuntimeGraph() - { - // will generate and compare to existing file. - GenerateRuntimeGraph task = new GenerateRuntimeGraph() - { - BuildEngine = _engine, - RuntimeGroups = DefaultRuntimeGroupItems, - RuntimeJson = defaultRuntimeFile, - UpdateRuntimeFiles = false - }; - task.Execute(); - - _log.AssertNoErrorsOrWarnings(); - } - - - [Fact] - [ActiveIssue("https://github.com/dotnet/runtime/issues/77889", TestPlatforms.iOS | TestPlatforms.tvOS)] - public void CanIgnoreExistingInferRids() - { - // will generate and compare to existing file. - GenerateRuntimeGraph task = new GenerateRuntimeGraph() - { - BuildEngine = _engine, - RuntimeGroups = DefaultRuntimeGroupItems, - RuntimeJson = defaultRuntimeFile, - AdditionalRuntimeIdentifiers = new[] { "rhel.9-x64", "centos.9-arm64", "win-x64" }, - UpdateRuntimeFiles = false - }; - - _log.Reset(); - task.Execute(); - _log.AssertNoErrorsOrWarnings(); - } - - /// - /// Runs GenerateRuntimeGraph task specifying AdditionalRuntimeIdentifiers then asserts that the - /// generated runtime.json has the expected additions (and no more). - /// - /// additional RIDs - /// entries that are expected to be added to the RuntimeGraph - /// parent to use when adding a new RID - /// a unique prefix to use for the generated - private void AssertRuntimeGraphAdditions(string[] additionalRIDs, RuntimeDescription[] expectedAdditions, string additionalRIDParent = null, [CallerMemberName] string runtimeFilePrefix = null) - { - string runtimeFile = Path.Combine(defaultRootPath, runtimeFilePrefix + ".runtime.json"); - - GenerateRuntimeGraph task = new GenerateRuntimeGraph() - { - BuildEngine = _engine, - RuntimeGroups = DefaultRuntimeGroupItems, - RuntimeJson = runtimeFile, - AdditionalRuntimeIdentifiers = additionalRIDs, - AdditionalRuntimeIdentifierParent = additionalRIDParent, - UpdateRuntimeFiles = true - }; - - _log.Reset(); - task.Execute(); - _log.AssertNoErrorsOrWarnings(); - - RuntimeGraph expected = RuntimeGraph.Merge( - JsonRuntimeFormat.ReadRuntimeGraph(defaultRuntimeFile), - new RuntimeGraph(expectedAdditions)); - - RuntimeGraph actual = JsonRuntimeFormat.ReadRuntimeGraph(runtimeFile); - - // Should this assert fail, it's helpful to diff defaultRuntimeFile and runtimeFile to see the additions. - Assert.Equal(expected, actual); - } - - [Fact] - [ActiveIssue("https://github.com/dotnet/runtime/issues/77889", TestPlatforms.iOS | TestPlatforms.tvOS)] - public void CanAddVersionsToExistingGroups() - { - var additionalRIDs = new[] { "ubuntu.22.04-arm64" }; - var expectedAdditions = new[] - { - new RuntimeDescription("ubuntu.22.04", new[] { "ubuntu" }), - new RuntimeDescription("ubuntu.22.04-x64", new[] { "ubuntu.22.04", "ubuntu-x64" }), - new RuntimeDescription("ubuntu.22.04-x86", new[] { "ubuntu.22.04", "ubuntu-x86" }), - new RuntimeDescription("ubuntu.22.04-arm", new[] { "ubuntu.22.04", "ubuntu-arm" }), - new RuntimeDescription("ubuntu.22.04-arm64", new[] { "ubuntu.22.04", "ubuntu-arm64" }) - }; - - AssertRuntimeGraphAdditions(additionalRIDs, expectedAdditions); - } - - [Fact] - [ActiveIssue("https://github.com/dotnet/runtime/issues/77889", TestPlatforms.iOS | TestPlatforms.tvOS)] - public void CanAddParentVersionsToExistingGroups() - { - var additionalRIDs = new[] { "centos.9.2-arm64" }; - var expectedAdditions = new[] - { - new RuntimeDescription("centos.9.2", new[] { "centos", "rhel.9.2" }), - new RuntimeDescription("centos.9.2-x64", new[] { "centos.9.2", "centos-x64", "rhel.9.2-x64" }), - new RuntimeDescription("centos.9.2-arm64", new[] { "centos.9.2", "centos-arm64", "rhel.9.2-arm64" }), - - // rhel RIDs are implicitly created since centos imports versioned RHEL RIDs - new RuntimeDescription("rhel.9.2", new[] { "rhel.9" }), - new RuntimeDescription("rhel.9.2-x64", new[] { "rhel.9.2", "rhel.9-x64" }), - new RuntimeDescription("rhel.9.2-arm64", new[] { "rhel.9.2", "rhel.9-arm64" }) - }; - - AssertRuntimeGraphAdditions(additionalRIDs, expectedAdditions); - } - - [Fact] - [ActiveIssue("https://github.com/dotnet/runtime/issues/77889", TestPlatforms.iOS | TestPlatforms.tvOS)] - public void CanAddMajorVersionsToExistingGroups() - { - - var additionalRIDs = new[] { "rhel.10-x64" }; - var expectedAdditions = new[] - { - // Note that rhel doesn't treat major versions as compatible, however we do since it's closest and we don't represent this policy in the RuntimeGroups explicitly. - // We could add a rule that wouldn't insert a new major version if we see existing groups are split by major version. - new RuntimeDescription("rhel.10", new[] { "rhel.9" }), - new RuntimeDescription("rhel.10-x64", new[] { "rhel.10", "rhel.9-x64" }), - new RuntimeDescription("rhel.10-arm64", new[] { "rhel.10", "rhel.9-arm64" }) - }; - - AssertRuntimeGraphAdditions(additionalRIDs, expectedAdditions); - } - - [Fact] - [ActiveIssue("https://github.com/dotnet/runtime/issues/77889", TestPlatforms.iOS | TestPlatforms.tvOS)] - public void CanAddArchitectureToExistingGroups() - { - var additionalRIDs = new[] { "win10-x128" }; - var expectedAdditions = new[] - { - new RuntimeDescription("win10-x128", new[] { "win10", "win81-x128" }), - new RuntimeDescription("win10-x128-aot", new[] { "win10-aot", "win10-x128", "win10", "win81-x128-aot" }), - new RuntimeDescription("win81-x128-aot", new[] { "win81-aot", "win81-x128", "win81", "win8-x128-aot" }), - new RuntimeDescription("win81-x128", new[] { "win81", "win8-x128" }), - new RuntimeDescription("win8-x128-aot", new[] { "win8-aot", "win8-x128", "win8", "win7-x128-aot" }), - new RuntimeDescription("win8-x128", new[] { "win8", "win7-x128" }), - new RuntimeDescription("win7-x128-aot", new[] { "win7-aot", "win7-x128", "win7", "win-x128-aot" }), - new RuntimeDescription("win7-x128", new[] { "win7", "win-x128" }), - new RuntimeDescription("win-x128-aot", new[] { "win-aot", "win-x128" }), - new RuntimeDescription("win-x128", new[] { "win" }) - }; - - AssertRuntimeGraphAdditions(additionalRIDs, expectedAdditions); - } - - - [Fact] - [ActiveIssue("https://github.com/dotnet/runtime/issues/77889", TestPlatforms.iOS | TestPlatforms.tvOS)] - public void CanAddArchitectureAndVersionToExistingGroups() - { - var additionalRIDs = new[] { "osx.13-powerpc" }; - var expectedAdditions = new[] - { - new RuntimeDescription("osx.13-powerpc", new[] { "osx.13", "osx.12-powerpc" }), - new RuntimeDescription("osx.13-arm64", new[] { "osx.13", "osx.12-arm64" }), - new RuntimeDescription("osx.13-x64", new[] { "osx.13", "osx.12-x64" }), - new RuntimeDescription("osx.13", new[] { "osx.12" }), - // our RID model doesn't give priority to architecture, so the new architecture is applied to all past versions - new RuntimeDescription("osx.12-powerpc", new[] { "osx.12", "osx.11.0-powerpc" }), - new RuntimeDescription("osx.11.0-powerpc", new[] { "osx.11.0", "osx.10.16-powerpc" }), - new RuntimeDescription("osx.10.16-powerpc", new[] { "osx.10.16", "osx.10.15-powerpc" }), - new RuntimeDescription("osx.10.15-powerpc", new[] { "osx.10.15", "osx.10.14-powerpc" }), - new RuntimeDescription("osx.10.14-powerpc", new[] { "osx.10.14", "osx.10.13-powerpc" }), - new RuntimeDescription("osx.10.13-powerpc", new[] { "osx.10.13", "osx.10.12-powerpc" }), - new RuntimeDescription("osx.10.12-powerpc", new[] { "osx.10.12", "osx.10.11-powerpc" }), - new RuntimeDescription("osx.10.11-powerpc", new[] { "osx.10.11", "osx.10.10-powerpc" }), - new RuntimeDescription("osx.10.10-powerpc", new[] { "osx.10.10", "osx-powerpc" }), - new RuntimeDescription("unix-powerpc", new[] { "unix" }), - new RuntimeDescription("osx-powerpc", new[] { "osx", "unix-powerpc" }), - }; - - AssertRuntimeGraphAdditions(additionalRIDs, expectedAdditions); - } - - [Fact] - [ActiveIssue("https://github.com/dotnet/runtime/issues/77889", TestPlatforms.iOS | TestPlatforms.tvOS)] - public void CanAddNewGroups() - { - var additionalRIDs = new[] { "yolinux.42.0-quantum" }; - var expectedAdditions = new[] - { - new RuntimeDescription("unix-quantum", new[] { "unix" }), - new RuntimeDescription("linux-quantum", new[] { "linux", "unix-quantum" }), - new RuntimeDescription("linux-musl-quantum", new[] { "linux-musl", "linux-quantum" }), - new RuntimeDescription("yolinux", new[] { "linux-musl" }), - new RuntimeDescription("yolinux-quantum", new[] { "yolinux", "linux-musl-quantum" }), - new RuntimeDescription("yolinux.42.0", new[] { "yolinux" }), - new RuntimeDescription("yolinux.42.0-quantum", new[] { "yolinux.42.0", "yolinux-quantum" }) - }; - - AssertRuntimeGraphAdditions(additionalRIDs, expectedAdditions, "linux-musl"); - } - - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/tests/Log.cs b/src/libraries/Microsoft.NETCore.Platforms/tests/Log.cs deleted file mode 100644 index d1e7368ec0882b..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/tests/Log.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Xunit; -using Xunit.Abstractions; - -namespace Microsoft.NETCore.Platforms.BuildTasks.Tests -{ - internal class Log : ILog - { - private readonly ITestOutputHelper _output; - - public Log(ITestOutputHelper output) - { - _output = output; - Reset(); - } - - public int ErrorsLogged { get; set; } - public int WarningsLogged { get; set; } - - public void LogError(string message, params object[] messageArgs) - { - ErrorsLogged++; - _output.WriteLine("Error: " + message, messageArgs); - } - - public void LogMessage(string message, params object[] messageArgs) - { - _output.WriteLine(message, messageArgs); - } - - public void LogMessage(LogImportance importance, string message, params object[] messageArgs) - { - _output.WriteLine(message, messageArgs); - } - - public void LogWarning(string message, params object[] messageArgs) - { - WarningsLogged++; - _output.WriteLine("Warning: " + message, messageArgs); - } - - public void Reset() - { - ErrorsLogged = 0; - WarningsLogged = 0; - } - - public void AssertNoErrorsOrWarnings() - { - Assert.Equal(0, ErrorsLogged); - Assert.Equal(0, WarningsLogged); - } - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/tests/Microsoft.NETCore.Platforms.Tests.csproj b/src/libraries/Microsoft.NETCore.Platforms/tests/Microsoft.NETCore.Platforms.Tests.csproj deleted file mode 100644 index d4b11af0a96d6a..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/tests/Microsoft.NETCore.Platforms.Tests.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - $(NetCoreAppCurrent);$(NetFrameworkToolCurrent) - true - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/libraries/Microsoft.NETCore.Platforms/tests/RidTests.cs b/src/libraries/Microsoft.NETCore.Platforms/tests/RidTests.cs deleted file mode 100644 index 8dee0ebeda17a4..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/tests/RidTests.cs +++ /dev/null @@ -1,66 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using Xunit; - -namespace Microsoft.NETCore.Platforms.BuildTasks.Tests -{ - public class RidTests - { - public static IEnumerable ValidRIDData() - { - yield return new object[] { "win10-x64", new RID() { BaseRID = "win", OmitVersionDelimiter = true, Version = new RuntimeVersion("10"), Architecture = "x64" }, null }; - yield return new object[] { "win10", new RID() { BaseRID = "win", OmitVersionDelimiter = true, Version = new RuntimeVersion("10")}, null }; - yield return new object[] { "linux", new RID() { BaseRID = "linux" }, null }; - yield return new object[] { "linux-x64", new RID() { BaseRID = "linux", Architecture = "x64" }, null }; - yield return new object[] { "linux-x64", new RID() { BaseRID = "linux", Architecture = "x64" }, null }; - yield return new object[] { "debian.10-x64", new RID() { BaseRID = "debian", Version = new RuntimeVersion("10"), Architecture = "x64" }, null }; - yield return new object[] { "linuxmint.19.2-x64", new RID() { BaseRID = "linuxmint", Version = new RuntimeVersion("19.2"), Architecture = "x64" }, null }; - yield return new object[] { "ubuntu.14.04-x64", new RID() { BaseRID = "ubuntu", Version = new RuntimeVersion("14.04"), Architecture = "x64" }, null }; - yield return new object[] { "foo-bar.42-arm", new RID() { BaseRID = "foo-bar", Version = new RuntimeVersion("42"), Architecture = "arm" }, null }; - yield return new object[] { "foo-bar-arm", new RID() { BaseRID = "foo", Architecture = "bar", Qualifier = "arm" }, // demonstrates ambiguity, avoid using `-` in base - new RID() { BaseRID = "foo-bar", Architecture = "arm" } }; - yield return new object[] { "linux-musl-x64", new RID() { BaseRID = "linux", Architecture = "musl", Qualifier = "x64" }, // yes, we already have ambiguous RIDs - new RID() { BaseRID = "linux-musl", Architecture = "x64" } }; - } - - [Theory] - [MemberData(nameof(ValidRIDData))] - internal void ParseCorrectly(string input, RID expected, RID? expectedNoQualifier) - { - _ = expectedNoQualifier; // unused - - RID actual = RID.Parse(input, noQualifier: false); - - Assert.Equal(expected, actual); - } - - [Theory] - [MemberData(nameof(ValidRIDData))] - internal void ParseCorrectlyNoQualifier(string input, RID expected, RID? expectedNoQualifier) - { - expectedNoQualifier ??= expected; - - RID actual = RID.Parse(input, noQualifier: true); - - Assert.Equal(expectedNoQualifier, actual); - } - - [Theory] - [MemberData(nameof(ValidRIDData))] - internal void ToStringAsExpected(string expected, RID rid, RID? expectedNoQualifierRid) - { - string actual = rid.ToString(); - - Assert.Equal(expected, actual); - - if (expectedNoQualifierRid is not null) - { - actual = expectedNoQualifierRid.ToString(); - - Assert.Equal(expected, actual); - } - } - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/tests/RuntimeVersionTests.cs b/src/libraries/Microsoft.NETCore.Platforms/tests/RuntimeVersionTests.cs deleted file mode 100644 index 2822974acfacc4..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/tests/RuntimeVersionTests.cs +++ /dev/null @@ -1,233 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using Xunit; - -namespace Microsoft.NETCore.Platforms.BuildTasks.Tests -{ - public class RuntimeVersionTests - { - public enum Comparison - { - LessThan, - Equal, - GreaterThan - } - - public static IEnumerable ComparisonData() - { - yield return new object[] { "0.0", "00.0", Comparison.LessThan }; - yield return new object[] { "2.0", "1.0", Comparison.GreaterThan }; - yield return new object[] { "2", "1.0", Comparison.GreaterThan }; - yield return new object[] { "2", "1", Comparison.GreaterThan }; - yield return new object[] { "10", "10.0", Comparison.LessThan }; - yield return new object[] { "10", "10.00", Comparison.LessThan }; - yield return new object[] { "10.0", "10.0", Comparison.Equal }; - yield return new object[] { "10.0", null, Comparison.GreaterThan }; - yield return new object[] { "8", "8", Comparison.Equal }; - } - - [MemberData(nameof(ComparisonData))] - [Theory] - public static void CompareTo(string vs1, string vs2, Comparison expected) - { - RuntimeVersion v1 = new RuntimeVersion(vs1); - RuntimeVersion v2 = vs2 == null ? null : new RuntimeVersion(vs2); - int actual = v1.CompareTo(v2); - int invActual = v2?.CompareTo(v1) ?? -1; - - switch (expected) - { - case Comparison.LessThan: - Assert.True(actual < 0); - Assert.True(invActual > 0); - break; - case Comparison.Equal: - Assert.Equal(0, actual); - Assert.Equal(0, invActual); - break; - case Comparison.GreaterThan: - Assert.True(actual > 0); - Assert.True(invActual < 0); - break; - } - } - - [MemberData(nameof(ComparisonData))] - [Theory] - public static void GreaterThan(string vs1, string vs2, Comparison expected) - { - RuntimeVersion v1 = new RuntimeVersion(vs1); - RuntimeVersion v2 = vs2 == null ? null : new RuntimeVersion(vs2); - bool actual = v1 > v2; - bool invActual = v2 > v1; - - switch (expected) - { - case Comparison.LessThan: - Assert.False(actual); - Assert.True(invActual); - break; - case Comparison.Equal: - Assert.False(actual); - Assert.False(invActual); - break; - case Comparison.GreaterThan: - Assert.True(actual); - Assert.False(invActual); - break; - } - } - - [MemberData(nameof(ComparisonData))] - [Theory] - public static void GreaterThanOrEqual(string vs1, string vs2, Comparison expected) - { - RuntimeVersion v1 = new RuntimeVersion(vs1); - RuntimeVersion v2 = vs2 == null ? null : new RuntimeVersion(vs2); - bool actual = v1 >= v2; - bool invActual = v2 >= v1; - - switch (expected) - { - case Comparison.LessThan: - Assert.False(actual); - Assert.True(invActual); - break; - case Comparison.Equal: - Assert.True(actual); - Assert.True(invActual); - break; - case Comparison.GreaterThan: - Assert.True(actual); - Assert.False(invActual); - break; - } - } - - [MemberData(nameof(ComparisonData))] - [Theory] - public static void LessThan(string vs1, string vs2, Comparison expected) - { - RuntimeVersion v1 = new RuntimeVersion(vs1); - RuntimeVersion v2 = vs2 == null ? null : new RuntimeVersion(vs2); - bool actual = v1 < v2; - bool invActual = v2 < v1; - - switch (expected) - { - case Comparison.LessThan: - Assert.True(actual); - Assert.False(invActual); - break; - case Comparison.Equal: - Assert.False(actual); - Assert.False(invActual); - break; - case Comparison.GreaterThan: - Assert.False(actual); - Assert.True(invActual); - break; - } - } - - [MemberData(nameof(ComparisonData))] - [Theory] - public static void LessThanOrEqual(string vs1, string vs2, Comparison expected) - { - RuntimeVersion v1 = new RuntimeVersion(vs1); - RuntimeVersion v2 = vs2 == null ? null : new RuntimeVersion(vs2); - bool actual = v1 <= v2; - bool invActual = v2 <= v1; - - switch (expected) - { - case Comparison.LessThan: - Assert.True(actual); - Assert.False(invActual); - break; - case Comparison.Equal: - Assert.True(actual); - Assert.True(invActual); - break; - case Comparison.GreaterThan: - Assert.False(actual); - Assert.True(invActual); - break; - } - } - - [MemberData(nameof(ComparisonData))] - [Theory] - public static void Equal(string vs1, string vs2, Comparison expected) - { - RuntimeVersion v1 = new RuntimeVersion(vs1); - RuntimeVersion v2 = vs2 == null ? null : new RuntimeVersion(vs2); - bool actual = v1 == v2; - bool invActual = v2 == v1; - - switch (expected) - { - case Comparison.LessThan: - Assert.False(actual); - Assert.False(invActual); - break; - case Comparison.Equal: - Assert.True(actual); - Assert.True(invActual); - break; - case Comparison.GreaterThan: - Assert.False(actual); - Assert.False(invActual); - break; - } - } - - [MemberData(nameof(ComparisonData))] - [Theory] - public static void GetHashCodeUnique(string vs1, string vs2, Comparison expected) - { - RuntimeVersion v1 = new RuntimeVersion(vs1); - RuntimeVersion v2 = vs2 == null ? null : new RuntimeVersion(vs2); - int h1 = v1.GetHashCode(); - int h2 = v2?.GetHashCode() ?? 0; - - switch (expected) - { - case Comparison.LessThan: - Assert.NotEqual(h1, h2); - break; - case Comparison.Equal: - Assert.Equal(h1, h2); - break; - case Comparison.GreaterThan: - Assert.NotEqual(h1, h2); - break; - } - } - public static IEnumerable ValidVersions() - { - yield return new object[] { "0" }; - yield return new object[] { "00" }; - yield return new object[] { "000" }; - yield return new object[] { "1" }; - yield return new object[] { "1.0" }; - yield return new object[] { "1.1" }; - yield return new object[] { "1.01" }; - yield return new object[] { "1.2.3.4" }; - yield return new object[] { "1.02.03.04" }; - } - - - [MemberData(nameof(ValidVersions))] - [Theory] - public static void RoundTripToString(string expected) - { - RuntimeVersion version = new RuntimeVersion(expected); - string actual = version.ToString(); - Assert.Equal(expected, actual); - } - - } -} diff --git a/src/libraries/Microsoft.NETCore.Platforms/tests/TestBuildEngine.cs b/src/libraries/Microsoft.NETCore.Platforms/tests/TestBuildEngine.cs deleted file mode 100644 index 67dfefbe8c8c9b..00000000000000 --- a/src/libraries/Microsoft.NETCore.Platforms/tests/TestBuildEngine.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using Microsoft.Build.Framework; -using System; -using System.Collections; - -namespace Microsoft.NETCore.Platforms.BuildTasks.Tests -{ - public class TestBuildEngine : IBuildEngine - { - private ILog _log; - - public TestBuildEngine(ILog log) - { - ColumnNumberOfTaskNode = 0; - ContinueOnError = true; - LineNumberOfTaskNode = 0; - ProjectFileOfTaskNode = "test"; - _log = log; - } - - public int ColumnNumberOfTaskNode { get; set; } - - public bool ContinueOnError { get; set; } - - public int LineNumberOfTaskNode { get; set; } - - public string ProjectFileOfTaskNode { get; set; } - - public bool BuildProjectFile(string projectFileName, string[] targetNames, IDictionary globalProperties, IDictionary targetOutputs) - { - throw new NotImplementedException(); - } - - public void LogCustomEvent(CustomBuildEventArgs e) - { - _log.LogMessage(e.Message); - } - - public void LogErrorEvent(BuildErrorEventArgs e) - { - _log.LogError(e.Message); - } - - public void LogMessageEvent(BuildMessageEventArgs e) - { - _log.LogMessage((LogImportance)e.Importance, e.Message); - } - - public void LogWarningEvent(BuildWarningEventArgs e) - { - _log.LogWarning(e.Message); - } - } -} diff --git a/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/BaseConfigurationRecord.cs b/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/BaseConfigurationRecord.cs index c0495b2aee27fc..f72769050e5134 100644 --- a/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/BaseConfigurationRecord.cs +++ b/src/libraries/System.Configuration.ConfigurationManager/src/System/Configuration/BaseConfigurationRecord.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Buffers; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; @@ -18,6 +19,12 @@ namespace System.Configuration [DebuggerDisplay("ConfigPath = {ConfigPath}")] internal abstract class BaseConfigurationRecord : IInternalConfigRecord { +#if NET8_0_OR_GREATER + private static readonly SearchValues s_invalidSubPathChars = SearchValues.Create(InvalidSubPathCharactersString); +#else + private static ReadOnlySpan s_invalidSubPathChars => InvalidSubPathCharactersString.AsSpan(); +#endif + protected const string NewLine = "\r\n"; internal const string KeywordTrue = "true"; @@ -128,7 +135,6 @@ internal abstract class BaseConfigurationRecord : IInternalConfigRecord // Comparer used in sorting IndirectInputs. private static readonly IComparer s_indirectInputsComparer = new IndirectLocationInputComparer(); - private static readonly char[] s_invalidSubPathCharactersArray = InvalidSubPathCharactersString.ToCharArray(); protected Hashtable _children; // configName -> record private object _configContext; // Context for config level @@ -3090,7 +3096,7 @@ internal static string NormalizeLocationSubPath(string subPath, IConfigErrorInfo throw new ConfigurationErrorsException(SR.Config_location_path_invalid_last_character, errorInfo); // combination of URI reserved characters and OS invalid filename characters, minus / (allowed reserved character) - if (subPath.IndexOfAny(s_invalidSubPathCharactersArray) != -1) + if (subPath.AsSpan().IndexOfAny(s_invalidSubPathChars) >= 0) throw new ConfigurationErrorsException(SR.Config_location_path_invalid_character, errorInfo); return subPath; diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicConnection.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicConnection.cs index f1117a5fa7cd71..3b49667e9b32a9 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicConnection.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicConnection.cs @@ -382,6 +382,9 @@ public async ValueTask OpenOutboundStreamAsync(QuicStreamType type, { await stream.DisposeAsync().ConfigureAwait(false); } + + // Propagate ODE if disposed in the meantime. + ObjectDisposedException.ThrowIf(_disposed == 1, this); // Propagate connection error if present. if (_acceptQueue.Reader.Completion.IsFaulted) { @@ -485,7 +488,7 @@ private unsafe int HandleEventShutdownInitiatedByPeer(ref SHUTDOWN_INITIATED_BY_ } private unsafe int HandleEventShutdownComplete() { - Exception exception = ExceptionDispatchInfo.SetCurrentStackTrace(ThrowHelper.GetOperationAbortedException()); + Exception exception = ExceptionDispatchInfo.SetCurrentStackTrace(_disposed == 1 ? new ObjectDisposedException(GetType().FullName) : ThrowHelper.GetOperationAbortedException()); _acceptQueue.Writer.TryComplete(exception); _connectedTcs.TrySetException(exception); _shutdownTcs.TrySetResult(); @@ -622,7 +625,7 @@ public async ValueTask DisposeAsync() } // Flush the queue and dispose all remaining streams. - _acceptQueue.Writer.TryComplete(ExceptionDispatchInfo.SetCurrentStackTrace(ThrowHelper.GetOperationAbortedException())); + _acceptQueue.Writer.TryComplete(ExceptionDispatchInfo.SetCurrentStackTrace(new ObjectDisposedException(GetType().FullName))); while (_acceptQueue.Reader.TryRead(out QuicStream? stream)) { await stream.DisposeAsync().ConfigureAwait(false); diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicListener.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicListener.cs index 8a9eb59d3f1782..8ecbfb9901eb25 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicListener.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicListener.cs @@ -377,8 +377,8 @@ public async ValueTask DisposeAsync() _handle.Dispose(); // Flush the queue and dispose all remaining connections. - _disposeCts.Cancel(); - _acceptQueue.Writer.TryComplete(ExceptionDispatchInfo.SetCurrentStackTrace(ThrowHelper.GetOperationAbortedException())); + await _disposeCts.CancelAsync().ConfigureAwait(false); + _acceptQueue.Writer.TryComplete(ExceptionDispatchInfo.SetCurrentStackTrace(new ObjectDisposedException(GetType().FullName))); while (_acceptQueue.Reader.TryRead(out object? item)) { if (item is QuicConnection connection) diff --git a/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicConnectionTests.cs b/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicConnectionTests.cs index dba45d813945ff..61d42b2525480d 100644 --- a/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicConnectionTests.cs +++ b/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicConnectionTests.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Net.Sockets; using System.Security.Cryptography.X509Certificates; using System.Threading; @@ -88,7 +87,6 @@ await RunClientServer( await AssertThrowsQuicExceptionAsync(QuicError.OperationAborted, () => connectTask); // Subsequent attempts should fail - // TODO: Which exception is correct? await AssertThrowsQuicExceptionAsync(QuicError.OperationAborted, async () => await serverConnection.AcceptInboundStreamAsync()); await Assert.ThrowsAsync(() => OpenAndUseStreamAsync(serverConnection)); }); @@ -117,11 +115,10 @@ await RunClientServer( sync.Release(); // Pending ops should fail - await AssertThrowsQuicExceptionAsync(QuicError.OperationAborted, () => acceptTask); - await AssertThrowsQuicExceptionAsync(QuicError.OperationAborted, () => connectTask); + await Assert.ThrowsAsync(async () => await acceptTask); + await Assert.ThrowsAsync(async () => await connectTask); // Subsequent attempts should fail - // TODO: Should these be QuicOperationAbortedException, to match above? Or vice-versa? await Assert.ThrowsAsync(async () => await serverConnection.AcceptInboundStreamAsync()); await Assert.ThrowsAsync(async () => await OpenAndUseStreamAsync(serverConnection)); }); @@ -312,6 +309,21 @@ await RunClientServer( _ => Task.CompletedTask); } + [Fact] + public async Task AcceptStreamAsync_ConnectionDisposed_Throws() + { + (QuicConnection clientConnection, QuicConnection serverConnection) = await CreateConnectedQuicConnection(); + + // One task issues before the disposal. + ValueTask acceptTask1 = serverConnection.AcceptInboundStreamAsync(); + await serverConnection.DisposeAsync(); + // Another task issued after the disposal. + ValueTask acceptTask2 = serverConnection.AcceptInboundStreamAsync(); + + var accept1Exception = await Assert.ThrowsAsync(async () => await acceptTask1); + var accept2Exception = await Assert.ThrowsAsync(async () => await acceptTask2); + } + [Theory] [InlineData(true)] [InlineData(false)] diff --git a/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicListenerTests.cs b/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicListenerTests.cs index 94fbf03fe7ea53..cda0b06a03888b 100644 --- a/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicListenerTests.cs +++ b/src/libraries/System.Net.Quic/tests/FunctionalTests/QuicListenerTests.cs @@ -196,10 +196,8 @@ public async Task AcceptConnectionAsync_ListenerDisposed_Throws() await listener.DisposeAsync(); serverDisposed.SetResult(); - var accept1Exception = await AssertThrowsQuicExceptionAsync(QuicError.OperationAborted, async () => await acceptTask1); - var accept2Exception = await AssertThrowsQuicExceptionAsync(QuicError.OperationAborted, async () => await acceptTask2); - - Assert.Equal(accept1Exception, accept2Exception); + var accept1Exception = await Assert.ThrowsAsync(async () => await acceptTask1); + var accept2Exception = await Assert.ThrowsAsync(async () => await acceptTask2); // Connect attempt should be stopped with "UserCanceled". var connectException = await Assert.ThrowsAsync(async () => await connectTask); diff --git a/src/libraries/System.Numerics.Tensors/ref/System.Numerics.Tensors.csproj b/src/libraries/System.Numerics.Tensors/ref/System.Numerics.Tensors.csproj index 89bdef6ea38ed9..a8090a6f6995dc 100644 --- a/src/libraries/System.Numerics.Tensors/ref/System.Numerics.Tensors.csproj +++ b/src/libraries/System.Numerics.Tensors/ref/System.Numerics.Tensors.csproj @@ -2,13 +2,14 @@ $(NetCoreAppCurrent);$(NetCoreAppPrevious);$(NetCoreAppMinimum);netstandard2.0;$(NetFrameworkMinimum) + $(TargetFrameworks);net7.0;net6.0 - + diff --git a/src/libraries/System.Numerics.Tensors/src/System.Numerics.Tensors.csproj b/src/libraries/System.Numerics.Tensors/src/System.Numerics.Tensors.csproj index 097fa244ad4913..b0449170860b45 100644 --- a/src/libraries/System.Numerics.Tensors/src/System.Numerics.Tensors.csproj +++ b/src/libraries/System.Numerics.Tensors/src/System.Numerics.Tensors.csproj @@ -2,6 +2,7 @@ $(NetCoreAppCurrent);$(NetCoreAppPrevious);$(NetCoreAppMinimum);netstandard2.0;$(NetFrameworkMinimum) + $(TargetFrameworks);net7.0;net6.0 true true Provides support for operating over tensors. @@ -16,11 +17,11 @@ - + - + diff --git a/src/libraries/System.Numerics.Tensors/src/System/Numerics/Tensors/TensorPrimitives.netcore.cs b/src/libraries/System.Numerics.Tensors/src/System/Numerics/Tensors/TensorPrimitives.netcore.cs index 4f40aa31494c97..ae5af404ac1aff 100644 --- a/src/libraries/System.Numerics.Tensors/src/System/Numerics/Tensors/TensorPrimitives.netcore.cs +++ b/src/libraries/System.Numerics.Tensors/src/System/Numerics/Tensors/TensorPrimitives.netcore.cs @@ -1159,7 +1159,9 @@ public static float Invoke(Vector512 x) public static float Invoke(float x) => -x; public static Vector128 Invoke(Vector128 x) => -x; public static Vector256 Invoke(Vector256 x) => -x; +#if NET8_0_OR_GREATER public static Vector512 Invoke(Vector512 x) => -x; +#endif } private readonly struct AddMultiplyOperator : ITernaryOperator @@ -1167,7 +1169,9 @@ public static float Invoke(Vector512 x) public static float Invoke(float x, float y, float z) => (x + y) * z; public static Vector128 Invoke(Vector128 x, Vector128 y, Vector128 z) => (x + y) * z; public static Vector256 Invoke(Vector256 x, Vector256 y, Vector256 z) => (x + y) * z; +#if NET8_0_OR_GREATER public static Vector512 Invoke(Vector512 x, Vector512 y, Vector512 z) => (x + y) * z; +#endif } private readonly struct MultiplyAddOperator : ITernaryOperator @@ -1175,7 +1179,9 @@ public static float Invoke(Vector512 x) public static float Invoke(float x, float y, float z) => (x * y) + z; public static Vector128 Invoke(Vector128 x, Vector128 y, Vector128 z) => (x * y) + z; public static Vector256 Invoke(Vector256 x, Vector256 y, Vector256 z) => (x * y) + z; +#if NET8_0_OR_GREATER public static Vector512 Invoke(Vector512 x, Vector512 y, Vector512 z) => (x * y) + z; +#endif } private readonly struct LoadIdentity : IUnaryOperator diff --git a/src/libraries/System.Numerics.Tensors/src/System/Numerics/Tensors/TensorPrimitives.netstandard.cs b/src/libraries/System.Numerics.Tensors/src/System/Numerics/Tensors/TensorPrimitives.netstandard.cs index 134364708b8e5d..ba3fc69bab527f 100644 --- a/src/libraries/System.Numerics.Tensors/src/System/Numerics/Tensors/TensorPrimitives.netstandard.cs +++ b/src/libraries/System.Numerics.Tensors/src/System/Numerics/Tensors/TensorPrimitives.netstandard.cs @@ -69,8 +69,8 @@ private static float CosineSimilarityCore(ReadOnlySpan x, ReadOnlySpan( float identityValue, ReadOnlySpan x, TLoad load = default, TAggregate aggregate = default) - where TLoad : IUnaryOperator - where TAggregate : IBinaryOperator + where TLoad : struct, IUnaryOperator + where TAggregate : struct, IBinaryOperator { // Initialize the result to the identity value float result = identityValue; @@ -112,8 +112,8 @@ private static float Aggregate( private static float Aggregate( float identityValue, ReadOnlySpan x, ReadOnlySpan y, TBinary binary = default, TAggregate aggregate = default) - where TBinary : IBinaryOperator - where TAggregate : IBinaryOperator + where TBinary : struct, IBinaryOperator + where TAggregate : struct, IBinaryOperator { // Initialize the result to the identity value float result = identityValue; @@ -156,7 +156,7 @@ private static float Aggregate( private static void InvokeSpanIntoSpan( ReadOnlySpan x, Span destination, TUnaryOperator op = default) - where TUnaryOperator : IUnaryOperator + where TUnaryOperator : struct, IUnaryOperator { if (x.Length > destination.Length) { @@ -203,7 +203,7 @@ private static void InvokeSpanIntoSpan( private static void InvokeSpanSpanIntoSpan( ReadOnlySpan x, ReadOnlySpan y, Span destination, TBinaryOperator op = default) - where TBinaryOperator : IBinaryOperator + where TBinaryOperator : struct, IBinaryOperator { if (x.Length != y.Length) { @@ -258,7 +258,7 @@ private static void InvokeSpanSpanIntoSpan( private static void InvokeSpanScalarIntoSpan( ReadOnlySpan x, float y, Span destination, TBinaryOperator op = default) - where TBinaryOperator : IBinaryOperator + where TBinaryOperator : struct, IBinaryOperator { if (x.Length > destination.Length) { @@ -309,7 +309,7 @@ private static void InvokeSpanScalarIntoSpan( private static void InvokeSpanSpanSpanIntoSpan( ReadOnlySpan x, ReadOnlySpan y, ReadOnlySpan z, Span destination, TTernaryOperator op = default) - where TTernaryOperator : ITernaryOperator + where TTernaryOperator : struct, ITernaryOperator { if (x.Length != y.Length || x.Length != z.Length) { @@ -369,7 +369,7 @@ private static void InvokeSpanSpanSpanIntoSpan( private static void InvokeSpanSpanScalarIntoSpan( ReadOnlySpan x, ReadOnlySpan y, float z, Span destination, TTernaryOperator op = default) - where TTernaryOperator : ITernaryOperator + where TTernaryOperator : struct, ITernaryOperator { if (x.Length != y.Length) { @@ -430,7 +430,7 @@ private static void InvokeSpanSpanScalarIntoSpan( private static void InvokeSpanScalarSpanIntoSpan( ReadOnlySpan x, float y, ReadOnlySpan z, Span destination, TTernaryOperator op = default) - where TTernaryOperator : ITernaryOperator + where TTernaryOperator : struct, ITernaryOperator { if (x.Length != z.Length) { diff --git a/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/TypeLoading/General/Helpers.cs b/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/TypeLoading/General/Helpers.cs index 147259b5cde42b..d172f20f1cb066 100644 --- a/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/TypeLoading/General/Helpers.cs +++ b/src/libraries/System.Reflection.MetadataLoadContext/src/System/Reflection/TypeLoading/General/Helpers.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Buffers; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; @@ -11,6 +12,12 @@ namespace System.Reflection.TypeLoading { internal static class Helpers { +#if NET8_0_OR_GREATER + private static readonly SearchValues s_charsToEscape = SearchValues.Create("\\[]+*&,"); +#else + private static ReadOnlySpan s_charsToEscape => "\\[]+*&,".AsSpan(); +#endif + [return: NotNullIfNotNull(nameof(original))] public static T[]? CloneArray(this T[]? original) { @@ -96,7 +103,7 @@ public static string ComputeArraySuffix(int rank, bool multiDim) public static string EscapeTypeNameIdentifier(this string identifier) { // Some characters in a type name need to be escaped - if (identifier.IndexOfAny(s_charsToEscape) != -1) + if (TypeNameContainsTypeParserMetacharacters(identifier)) { StringBuilder sbEscapedName = new StringBuilder(identifier.Length); foreach (char c in identifier) @@ -113,12 +120,16 @@ public static string EscapeTypeNameIdentifier(this string identifier) public static bool TypeNameContainsTypeParserMetacharacters(this string identifier) { - return identifier.IndexOfAny(s_charsToEscape) != -1; + return identifier.AsSpan().IndexOfAny(s_charsToEscape) >= 0; } public static bool NeedsEscapingInTypeName(this char c) { - return Array.IndexOf(s_charsToEscape, c) >= 0; +#if NET8_0_OR_GREATER + return s_charsToEscape.Contains(c); +#else + return s_charsToEscape.IndexOf(c) >= 0; +#endif } public static string UnescapeTypeNameIdentifier(this string identifier) @@ -145,8 +156,6 @@ public static string UnescapeTypeNameIdentifier(this string identifier) return identifier; } - private static readonly char[] s_charsToEscape = new char[] { '\\', '[', ']', '+', '*', '&', ',' }; - /// /// For AssemblyReferences, convert "unspecified" components from the ECMA format (0xffff) to the in-memory System.Version format (0xffffffff). /// diff --git a/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Marshaling/BaseJSGenerator.cs b/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Marshaling/BaseJSGenerator.cs index 97d158bb319dec..798be15bc45df5 100644 --- a/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Marshaling/BaseJSGenerator.cs +++ b/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Marshaling/BaseJSGenerator.cs @@ -22,7 +22,6 @@ protected BaseJSGenerator(MarshalerType marshalerType, IMarshallingGenerator inn } public ManagedTypeInfo AsNativeType(TypePositionInfo info) => _inner.AsNativeType(info); - public bool IsSupported(TargetFramework target, Version version) => _inner.IsSupported(target, version); public virtual bool UsesNativeIdentifier(TypePositionInfo info, StubCodeContext context) => _inner.UsesNativeIdentifier(info, context); public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info) => _inner.GetNativeSignatureBehavior(info); public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context) => _inner.GetValueBoundaryBehavior(info, context); diff --git a/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Marshaling/EmptyJSGenerator.cs b/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Marshaling/EmptyJSGenerator.cs index 075d464b2bde79..060902fc1098a2 100644 --- a/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Marshaling/EmptyJSGenerator.cs +++ b/src/libraries/System.Runtime.InteropServices.JavaScript/gen/JSImportGenerator/Marshaling/EmptyJSGenerator.cs @@ -14,7 +14,6 @@ internal sealed class EmptyJSGenerator : IJSMarshallingGenerator public IEnumerable GenerateBind(TypePositionInfo info, StubCodeContext context) => Array.Empty(); public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info) => SignatureBehavior.ManagedTypeAndAttributes; public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context) => ValueBoundaryBehavior.ManagedIdentifier; - public bool IsSupported(TargetFramework target, Version version) => false; public ByValueMarshalKindSupport SupportsByValueMarshalKind(ByValueContentsMarshalKind marshalKind, TypePositionInfo info, StubCodeContext context, out GeneratorDiagnostic? diagnostic) => ByValueMarshalKindSupportDescriptor.Default.GetSupport(marshalKind, info, context, out diagnostic); public bool UsesNativeIdentifier(TypePositionInfo info, StubCodeContext context) => false; diff --git a/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ComInterfaceDispatchMarshallerFactory.cs b/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ComInterfaceDispatchMarshallerFactory.cs index a75cd8cad77268..86c67cbd4dadca 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ComInterfaceDispatchMarshallerFactory.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ComInterfaceDispatchMarshallerFactory.cs @@ -59,8 +59,6 @@ public IEnumerable Generate(TypePositionInfo info, StubCodeCont public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info) => SignatureBehavior.NativeType; public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context) => ValueBoundaryBehavior.NativeIdentifier; - public bool IsSupported(TargetFramework target, Version version) - => target == TargetFramework.Net && version >= new Version(5, 0); public ByValueMarshalKindSupport SupportsByValueMarshalKind(ByValueContentsMarshalKind marshalKind, TypePositionInfo info, StubCodeContext context, out GeneratorDiagnostic? diagnostic) => ByValueMarshalKindSupportDescriptor.Default.GetSupport(marshalKind, info, context, out diagnostic); public bool UsesNativeIdentifier(TypePositionInfo info, StubCodeContext context) => true; diff --git a/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ManagedHResultExceptionMarshallerFactory.cs b/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ManagedHResultExceptionMarshallerFactory.cs index 0e6b17bd2ee435..c2f02efffeac17 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ManagedHResultExceptionMarshallerFactory.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ManagedHResultExceptionMarshallerFactory.cs @@ -68,7 +68,6 @@ public IEnumerable Generate(TypePositionInfo info, StubCodeCont public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info) => SignatureBehavior.NativeType; public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context) => ValueBoundaryBehavior.ManagedIdentifier; - public bool IsSupported(TargetFramework target, Version version) => true; public ByValueMarshalKindSupport SupportsByValueMarshalKind(ByValueContentsMarshalKind marshalKind, TypePositionInfo info, StubCodeContext context, out GeneratorDiagnostic? diagnostic) => ByValueMarshalKindSupportDescriptor.Default.GetSupport(marshalKind, info, context, out diagnostic); public bool UsesNativeIdentifier(TypePositionInfo info, StubCodeContext context) => false; @@ -106,7 +105,6 @@ public IEnumerable Generate(TypePositionInfo info, StubCodeCont public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info) => SignatureBehavior.NativeType; public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context) => ValueBoundaryBehavior.ManagedIdentifier; - public bool IsSupported(TargetFramework target, Version version) => true; public ByValueMarshalKindSupport SupportsByValueMarshalKind(ByValueContentsMarshalKind marshalKind, TypePositionInfo info, StubCodeContext context, out GeneratorDiagnostic? diagnostic) => ByValueMarshalKindSupportDescriptor.Default.GetSupport(marshalKind, info, context, out diagnostic); public bool UsesNativeIdentifier(TypePositionInfo info, StubCodeContext context) => false; diff --git a/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ObjectUnwrapperMarshallerFactory.cs b/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ObjectUnwrapperMarshallerFactory.cs index 75a7aa5064b734..2ca351cf538276 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ObjectUnwrapperMarshallerFactory.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/ObjectUnwrapperMarshallerFactory.cs @@ -54,7 +54,6 @@ public IEnumerable Generate(TypePositionInfo info, StubCodeCont public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info) => SignatureBehavior.NativeType; public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context) => ValueBoundaryBehavior.NativeIdentifier; - public bool IsSupported(TargetFramework target, Version version) => true; public ByValueMarshalKindSupport SupportsByValueMarshalKind(ByValueContentsMarshalKind marshalKind, TypePositionInfo info, StubCodeContext context, out GeneratorDiagnostic? diagnostic) => ByValueMarshalKindSupportDescriptor.Default.GetSupport(marshalKind, info, context, out diagnostic); public bool UsesNativeIdentifier(TypePositionInfo info, StubCodeContext context) => true; diff --git a/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/StructAsHResultMarshallerFactory.cs b/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/StructAsHResultMarshallerFactory.cs index e6eb9627b5acc9..d8b41ca6e37324 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/StructAsHResultMarshallerFactory.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/ComInterfaceGenerator/Marshallers/StructAsHResultMarshallerFactory.cs @@ -98,8 +98,6 @@ public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, Stu return ValueBoundaryBehavior.NativeIdentifier; } - public bool IsSupported(TargetFramework target, Version version) => target == TargetFramework.Net && version.Major >= 8; - public ByValueMarshalKindSupport SupportsByValueMarshalKind(ByValueContentsMarshalKind marshalKind, TypePositionInfo info, StubCodeContext context, out GeneratorDiagnostic? diagnostic) => ByValueMarshalKindSupportDescriptor.Default.GetSupport(marshalKind, info, context, out diagnostic); diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/Strings.resx b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/Strings.resx index 2da298e8a7b0df..bce2c5ae188043 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/Strings.resx +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/Strings.resx @@ -1,17 +1,17 @@  - @@ -144,9 +144,6 @@ Marshalling string or char without explicit marshalling information is not supported. Specify '{0}.StringMarshalling', '{0}.StringMarshallingCustomType', 'MarshalUsingAttribute' or 'MarshalAsAttribute'. - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - This element cannot depend on '{0}' for collection size information without creating a dependency cycle diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.cs.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.cs.xlf index 48a9bc03b73a63..9f769d6c35c061 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.cs.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.cs.xlf @@ -1022,11 +1022,6 @@ Aby se povolilo zařazování tohoto typu, musí se v tomto projektu zakázat zařazování modulu runtime použitím atributu System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute u sestavení. - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - Abstraktní typ odvozený ze SafeHandle nelze zařadit pomocí odkazu. Poskytnutý typ musí být konkrétní. - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. Při volání metody musí být definována velikost parametru{0}, která je zařazena do volané metody, ale parametr count {1} je parametr out. diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.de.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.de.xlf index 3135aa3bbe7eaa..a23a8178977575 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.de.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.de.xlf @@ -1022,11 +1022,6 @@ Das Runtime-Marshalling muss in diesem Projekt deaktiviert werden, indem „System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute“ auf die Assembly angewendet wird, um das Marshalling dieses Typs zu ermöglichen. - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - Ein abstrakter Typ, der von \"SafeHandle\" abgeleitet wird, kann nicht als Verweis gemarshallt werden. Der angegebene Typ muss ein konkretes Element sein. - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. Die Größe des Parameters "{0}", der an den Aufgerufenen gemarshallt wird, muss definiert werden, wenn die Methode aufgerufen wird. Der Count-Parameter "{1}" ist jedoch ein "Out"-Parameter. diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.es.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.es.xlf index f0e4701f345ccf..7d4da3d2391109 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.es.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.es.xlf @@ -1022,11 +1022,6 @@ La serialización en tiempo de ejecución debe deshabilitarse en este proyecto aplicando \"System.Runtime.CompilerServices.DisableRuntimeMars contosoingAttribute\" al ensamblado para habilitar la serialización de este tipo. - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - Un tipo abstracto derivado de “SafeHandle” no se puede serializar por referencia. El tipo proporcionado debe ser concreto. - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. El tamaño del parámetro "{0}" que se serializa al destinatario debe definirse cuando se llama al método, pero el parámetro de recuento "{1}" es un parámetro "out". diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.fr.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.fr.xlf index 228abb0f43b9c8..467413d83f430d 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.fr.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.fr.xlf @@ -1022,11 +1022,6 @@ Le marshaling du runtime doit être désactivé dans ce projet en appliquant « System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute » à l’assembly pour activer le marshaling de ce type. - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - Un type abstrait dérivé de « SafeHandle » ne peut pas être marshalé par référence. Le type fourni doit être concret. - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. La taille du paramètre '{0}' qui est marshalé à l'appelé doit être définie lorsque la méthode est appelée, mais le paramètre count '{1}' est un paramètre 'out'. diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.it.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.it.xlf index 58c83094b063bc..7af807ca8b6f60 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.it.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.it.xlf @@ -1022,11 +1022,6 @@ Il marshalling di runtime in questo progetto deve essere disabilitato applicando 'System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute' all'assembly per abilitare il marshalling di questo tipo. - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - Non è possibile effettuare il marshalling per riferimento di un tipo astratto derivato da 'SafeHandle'. Il tipo specificato deve essere concreto. - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. Le dimensioni del parametro '{0}' di cui viene eseguito il marshalling al destinatario della chiamata devono essere definite quando viene chiamato il metodo, ma il parametro conteggio '{1}' è un parametro 'out'. diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ja.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ja.xlf index 331eb28eaa414d..900871e5738958 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ja.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ja.xlf @@ -1022,11 +1022,6 @@ このプロジェクトでは、アセンブリに 'System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute' を適用してランタイム マーシャリングを無効にし、この型のマーシャリングを有効にする必要があります。 - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - 'SafeHandle' から派生した抽象型は、参照でマーシャリングできません。指定される型は具象型である必要があります。 - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. 呼び出し先にマーシャリングされるパラメーター '{0}' のサイズは、メソッドが呼び出されたときに定義する必要がありますが、count パラメーター '{1}' は 'out' パラメーターです。 diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ko.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ko.xlf index aedf84c829c061..c2061f1c47ed04 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ko.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ko.xlf @@ -1022,11 +1022,6 @@ 이 형식의 마샬링을 활성화하려면 어셈블리에 'System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute'를 적용하여 이 프로젝트에서 런타임 마샬링을 비활성화해야 합니다. - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - 'SafeHandle'에서 파생된 추상 형식은 참조로 마샬링할 수 없습니다. 제공된 형식은 구체적이어야 합니다. - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. 메서드를 호출할 때 호출 수신자로 마샬링되는 매개 변수 '{0}'의 크기를 정의해야 하지만 count 매개 변수 '{1}'은(는) 'out' 매개 변수입니다. diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.pl.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.pl.xlf index f051d95f3b9c9e..4a5bed01000cbb 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.pl.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.pl.xlf @@ -1022,11 +1022,6 @@ Marshalling środowiska uruchomieniowego musi być wyłączony w tym projekcie przez zastosowanie do zestawu atrybutu „System.Runtime.InteropServices.DisableRuntimeMarshallingAttribute”, aby umożliwić marshalling tego typu. - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - Typ abstrakcyjny pochodzący od elementu „SafeHandle” nie może być skierowany przez odwołanie. Podany typ musi być konkretny. - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. Rozmiar parametru „{0}”, który jest kierowany do obiektu wywołującego, musi być zdefiniowany podczas wywoływania metody, ale parametr ILE.LICZB „{1}” jest parametrem „out”. diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.pt-BR.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.pt-BR.xlf index c1bc60315bc05c..a2dcb00fc8aa2c 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.pt-BR.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.pt-BR.xlf @@ -1022,11 +1022,6 @@ O marshalling de tempo de execução deve ser desabilitado neste projeto aplicando o 'System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute' ao assembly para habilitar o marshalling desse tipo. - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - Um tipo abstrato derivado de 'SafeHandle' não pode ser marshalled por referência. O tipo fornecido deve ser concreto. - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. O tamanho do parâmetro '{0}' que é empacotado para o receptor deve ser definido quando o método é chamado, mas o parâmetro de contagem '{1}' é um parâmetro 'out'. diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ru.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ru.xlf index 891ef9d077eb61..9631d6c981aacd 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ru.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.ru.xlf @@ -1022,11 +1022,6 @@ В этом проекте следует отключить маршализацию среды выполнения путем применения к сборке атрибута \"System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute\" для включения маршализации этого типа. - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - Абстрактный тип, производный от \"SafeHandle\", нельзя маршализировать по ссылке. Указанный тип должен быть конкретным. - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. При вызове метода должен быть определен размер параметра "{0}", который был маршалирован вызываемому абоненту, но исчисляемый параметр "{1}" является выходным. diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.tr.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.tr.xlf index 6748b1305030b9..06f7c1279e14ac 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.tr.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.tr.xlf @@ -1022,11 +1022,6 @@ Bu türü sıralamayı etkinleştirmek için derlemeye 'System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute' uygulanarak bu projede çalışma zamanı sıralaması devre dışı bırakılmalıdır. - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - 'SafeHandle' özelliğinden türetilen soyut türler, başvuruya göre sıralanamaz. Sağlanan tür somut olmalıdır. - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. Aramanın alıcısına hazırlanan '{0}' parametresinin boyutu yöntem çağrıldığında tanımlanmalıdır ancak '{1}' sayı parametresi bir ‘çıkış’ parametresidir. diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.zh-Hans.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.zh-Hans.xlf index de0d085a227a7e..9cf9ccbc906f53 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.zh-Hans.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.zh-Hans.xlf @@ -1022,11 +1022,6 @@ 必须通过将 \"System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute\" 应用到程序集来在此项目中禁用运行时封送,以启用此类型的封送处理。 - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - 无法通过引用封送派生自 “SafeHandle” 的抽象类型。提供的类型必须是具体的。 - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. 调用方法时,必须定义封送给被调用方的参数“{0}”的大小,但计数参数“{1}”是一个 "out" 参数。 diff --git a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.zh-Hant.xlf b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.zh-Hant.xlf index 408df3131a3be5..08a0d9ac8eb548 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.zh-Hant.xlf +++ b/src/libraries/System.Runtime.InteropServices/gen/Common/Resources/xlf/Strings.zh-Hant.xlf @@ -1022,11 +1022,6 @@ 必須將 'System.Runtime.CompilerServices.DisableRuntimeMarshallingAttribute' 套用到組件,以停用此專案中的執行階段封送處理,以啟用此類型的封送處理。 - - An abstract type derived from 'SafeHandle' cannot be marshalled by reference. The provided type must be concrete. - 衍生自 'SafeHandle' 的抽象類型無法依參考排列。提供的類型必須是實體。 - - The size of parameter '{0}' that is marshalled to the callee must be defined when the method is called, but count parameter '{1}' is an 'out' parameter. 呼叫方法時,必須定義封送處理給被呼叫者的參數 '{0}' 的大小,但 count 參數 '{1}' 是 'out' 參數。 diff --git a/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/LibraryImportGenerator.cs b/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/LibraryImportGenerator.cs index 6b3bd184664973..b3fdc79bdec955 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/LibraryImportGenerator.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/LibraryImportGenerator.cs @@ -313,6 +313,20 @@ private static (MemberDeclarationSyntax, ImmutableArray) Generat return (PrintForwarderStub(pinvokeStub.StubMethodSyntaxTemplate, explicitForwarding: true, pinvokeStub, diagnostics), pinvokeStub.Diagnostics.Array.AddRange(diagnostics.Diagnostics)); } + bool supportsTargetFramework = !pinvokeStub.LibraryImportData.SetLastError + || options.GenerateForwarders + || (pinvokeStub.GeneratorFactoryKey.Key.TargetFramework == TargetFramework.Net + && pinvokeStub.GeneratorFactoryKey.Key.Version.Major >= 6); + + foreach (TypePositionInfo typeInfo in pinvokeStub.SignatureContext.ElementTypeInformation) + { + if (typeInfo.MarshallingAttributeInfo is MissingSupportMarshallingInfo) + { + supportsTargetFramework = false; + break; + } + } + // Generate stub code var stubGenerator = new PInvokeStubCodeGenerator( pinvokeStub.GeneratorFactoryKey.Key.TargetFramework, @@ -325,9 +339,9 @@ private static (MemberDeclarationSyntax, ImmutableArray) Generat // Check if the generator should produce a forwarder stub - regular DllImport. // This is done if the signature is blittable or the target framework is not supported. if (stubGenerator.StubIsBasicForwarder - || !stubGenerator.SupportsTargetFramework) + || !supportsTargetFramework) { - return (PrintForwarderStub(pinvokeStub.StubMethodSyntaxTemplate, !stubGenerator.SupportsTargetFramework, pinvokeStub, diagnostics), pinvokeStub.Diagnostics.Array.AddRange(diagnostics.Diagnostics)); + return (PrintForwarderStub(pinvokeStub.StubMethodSyntaxTemplate, !supportsTargetFramework, pinvokeStub, diagnostics), pinvokeStub.Diagnostics.Array.AddRange(diagnostics.Diagnostics)); } ImmutableArray forwardedAttributes = pinvokeStub.ForwardedAttributes.Array; diff --git a/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/LibraryImportGeneratorHelpers.cs b/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/LibraryImportGeneratorHelpers.cs index d07d101732b044..44e316c419ff29 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/LibraryImportGeneratorHelpers.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/LibraryImportGeneratorHelpers.cs @@ -48,17 +48,20 @@ internal static class LibraryImportGeneratorHelpers InteropGenerationOptions interopGenerationOptions = new(options.UseMarshalType); generatorFactory = new MarshalAsMarshallingGeneratorFactory(interopGenerationOptions, generatorFactory); - IMarshallingGeneratorFactory elementFactory = new AttributedMarshallingModelGeneratorFactory( - // Since the char type in an array will not be part of the P/Invoke signature, we can - // use the regular blittable marshaller in all cases. - new CharMarshallingGeneratorFactory(generatorFactory, useBlittableMarshallerForUtf16: true, TypeNames.LibraryImportAttribute_ShortName), - new AttributedMarshallingModelOptions(runtimeMarshallingDisabled, MarshalMode.ElementIn, MarshalMode.ElementRef, MarshalMode.ElementOut)); - // We don't need to include the later generator factories for collection elements - // as the later generator factories only apply to parameters. - generatorFactory = new AttributedMarshallingModelGeneratorFactory( - generatorFactory, - elementFactory, - new AttributedMarshallingModelOptions(runtimeMarshallingDisabled, MarshalMode.ManagedToUnmanagedIn, MarshalMode.ManagedToUnmanagedRef, MarshalMode.ManagedToUnmanagedOut)); + if (env.TargetFramework == TargetFramework.Net || env.TargetFrameworkVersion.Major >= 7) + { + IMarshallingGeneratorFactory elementFactory = new AttributedMarshallingModelGeneratorFactory( + // Since the char type in an array will not be part of the P/Invoke signature, we can + // use the regular blittable marshaller in all cases. + new CharMarshallingGeneratorFactory(generatorFactory, useBlittableMarshallerForUtf16: true, TypeNames.LibraryImportAttribute_ShortName), + new AttributedMarshallingModelOptions(runtimeMarshallingDisabled, MarshalMode.ElementIn, MarshalMode.ElementRef, MarshalMode.ElementOut)); + // We don't need to include the later generator factories for collection elements + // as the later generator factories only apply to parameters. + generatorFactory = new AttributedMarshallingModelGeneratorFactory( + generatorFactory, + elementFactory, + new AttributedMarshallingModelOptions(runtimeMarshallingDisabled, MarshalMode.ManagedToUnmanagedIn, MarshalMode.ManagedToUnmanagedRef, MarshalMode.ManagedToUnmanagedOut)); + } generatorFactory = new ByValueContentsMarshalKindValidator(generatorFactory); } diff --git a/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/PInvokeStubCodeGenerator.cs b/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/PInvokeStubCodeGenerator.cs index 2a1ac3921188c6..ec9283cc465988 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/PInvokeStubCodeGenerator.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/LibraryImportGenerator/PInvokeStubCodeGenerator.cs @@ -28,8 +28,6 @@ namespace Microsoft.Interop /// internal sealed class PInvokeStubCodeGenerator { - public bool SupportsTargetFramework { get; } - public bool StubIsBasicForwarder { get; } /// @@ -57,18 +55,6 @@ public PInvokeStubCodeGenerator( { _setLastError = setLastError; - // Support for SetLastError logic requires .NET 6+. Initialize the - // supports target framework value with this value. - if (_setLastError) - { - SupportsTargetFramework = targetFramework == TargetFramework.Net - && targetFrameworkVersion.Major >= 6; - } - else - { - SupportsTargetFramework = true; - } - _context = new ManagedToNativeStubCodeContext(targetFramework, targetFrameworkVersion, ReturnIdentifier, ReturnIdentifier); _marshallers = BoundGenerators.Create(argTypes, generatorFactory, _context, new Forwarder(), out var bindingDiagnostics); @@ -84,17 +70,13 @@ public PInvokeStubCodeGenerator( foreach (BoundGenerator generator in _marshallers.SignatureMarshallers) { - // Check if marshalling info and generator support the current target framework. - SupportsTargetFramework &= generator.TypeInfo.MarshallingAttributeInfo is not MissingSupportMarshallingInfo - && generator.Generator.IsSupported(targetFramework, targetFrameworkVersion); - // Check if generator is either blittable or just a forwarder. noMarshallingNeeded &= generator is { Generator: BlittableMarshaller, TypeInfo.IsByRef: false } or { Generator: Forwarder }; } StubIsBasicForwarder = !setLastError - && _marshallers.ManagedNativeSameReturn // If the managed return has native return position, then it's the return for both. + && _marshallers.ManagedNativeSameReturn && noMarshallingNeeded; } diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/BlittableMarshaller.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/BlittableMarshaller.cs index ef2542dd87bc8c..76577d497cb823 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/BlittableMarshaller.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/BlittableMarshaller.cs @@ -11,8 +11,6 @@ namespace Microsoft.Interop { public sealed class BlittableMarshaller : IMarshallingGenerator { - public bool IsSupported(TargetFramework target, Version version) => true; - public ManagedTypeInfo AsNativeType(TypePositionInfo info) { return info.ManagedType; diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/BoolMarshaller.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/BoolMarshaller.cs index a86df409e84a70..dbb1b3ee08c919 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/BoolMarshaller.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/BoolMarshaller.cs @@ -26,8 +26,6 @@ protected BoolMarshallerBase(ManagedTypeInfo nativeType, int trueValue, int fals _compareToTrue = compareToTrue; } - public bool IsSupported(TargetFramework target, Version version) => true; - public ManagedTypeInfo AsNativeType(TypePositionInfo info) { Debug.Assert(info.ManagedType is SpecialTypeInfo(_, _, SpecialType.System_Boolean)); diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/CharMarshaller.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/CharMarshaller.cs index 3357dc86fa333f..e02bf7826a85dc 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/CharMarshaller.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/CharMarshaller.cs @@ -15,12 +15,6 @@ public sealed class Utf16CharMarshaller : IMarshallingGenerator { private static readonly ManagedTypeInfo s_nativeType = new SpecialTypeInfo("ushort", "ushort", SpecialType.System_UInt16); - public Utf16CharMarshaller() - { - } - - public bool IsSupported(TargetFramework target, Version version) => true; - public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context) { if (IsPinningPathSupported(info, context)) diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/CustomTypeMarshallingGenerator.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/CustomTypeMarshallingGenerator.cs index 30f333d59540ed..9c65fdc5e7c50d 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/CustomTypeMarshallingGenerator.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/CustomTypeMarshallingGenerator.cs @@ -23,11 +23,6 @@ public CustomTypeMarshallingGenerator(ICustomTypeMarshallingStrategy nativeTypeM _isPinned = isPinned; } - public bool IsSupported(TargetFramework target, Version version) - { - return target is TargetFramework.Net && version.Major >= 6; - } - public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context) { return info.IsByRef ? ValueBoundaryBehavior.AddressOfNativeIdentifier : ValueBoundaryBehavior.NativeIdentifier; diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/DelegateMarshaller.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/DelegateMarshaller.cs index 4dddd38948c6dc..5f52ad6e4e7305 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/DelegateMarshaller.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/DelegateMarshaller.cs @@ -12,8 +12,6 @@ namespace Microsoft.Interop { public sealed class DelegateMarshaller : IMarshallingGenerator { - public bool IsSupported(TargetFramework target, Version version) => true; - public ManagedTypeInfo AsNativeType(TypePositionInfo info) { return SpecialTypeInfo.IntPtr; diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/Forwarder.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/Forwarder.cs index 79c2fd999f00a5..9679a2e7449c9b 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/Forwarder.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/Forwarder.cs @@ -9,8 +9,6 @@ namespace Microsoft.Interop { public sealed class Forwarder : IMarshallingGenerator { - public bool IsSupported(TargetFramework target, Version version) => true; - public ManagedTypeInfo AsNativeType(TypePositionInfo info) { return info.ManagedType; diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/MarshalAsMarshallingGeneratorFactory.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/MarshalAsMarshallingGeneratorFactory.cs index 1aa0d96779f9c6..a79f14c02ed122 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/MarshalAsMarshallingGeneratorFactory.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/MarshalAsMarshallingGeneratorFactory.cs @@ -18,7 +18,6 @@ public sealed class MarshalAsMarshallingGeneratorFactory : IMarshallingGenerator private static readonly Forwarder s_forwarder = new(); private static readonly BlittableMarshaller s_blittable = new(); private static readonly DelegateMarshaller s_delegate = new(); - private static readonly SafeHandleMarshaller s_safeHandle = new(); private InteropGenerationOptions Options { get; } private IMarshallingGeneratorFactory InnerFactory { get; } @@ -90,21 +89,6 @@ public ResolvedGenerator Create( case { ManagedType: DelegateTypeInfo, MarshallingAttributeInfo: NoMarshallingInfo or MarshalAsInfo(UnmanagedType.FunctionPtr, _) }: return ResolvedGenerator.Resolved(s_delegate); - // SafeHandle types with source-generator-emitted marshalling - case { MarshallingAttributeInfo: SafeHandleMarshallingInfo(_, bool isAbstract) }: - if (!context.AdditionalTemporaryStateLivesAcrossStages || context.Direction != MarshalDirection.ManagedToUnmanaged) - { - return ResolvedGenerator.NotSupported(new(info, context)); - } - if (info.IsByRef && isAbstract) - { - return ResolvedGenerator.NotSupported(new(info, context) - { - NotSupportedDetails = SR.SafeHandleByRefMustBeConcrete - }); - } - return ResolvedGenerator.Resolved(s_safeHandle); - // void case { ManagedType: SpecialTypeInfo { SpecialType: SpecialType.System_Void } }: return ResolvedGenerator.Resolved(s_forwarder); diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/MarshallingGenerator.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/MarshallingGenerator.cs index 598ba380028946..d320624651f004 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/MarshallingGenerator.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/MarshallingGenerator.cs @@ -94,14 +94,6 @@ public enum ByValueMarshalKindSupport /// public interface IMarshallingGenerator { - /// - /// Determine if the generator is supported for the supplied version of the framework. - /// - /// The framework to target. - /// The version of the framework. - /// True if the marshaller is supported, otherwise false. - bool IsSupported(TargetFramework target, Version version); - /// /// Get the native type syntax for /// diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/SafeHandleMarshaller.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/SafeHandleMarshaller.cs deleted file mode 100644 index 3f813787e61e5d..00000000000000 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/SafeHandleMarshaller.cs +++ /dev/null @@ -1,192 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; -using static Microsoft.Interop.SyntaxFactoryExtensions; - -namespace Microsoft.Interop -{ - public sealed class SafeHandleMarshaller : IMarshallingGenerator - { - public bool IsSupported(TargetFramework target, Version version) - { - return target is TargetFramework.Net && version.Major >= 6; - } - - public ManagedTypeInfo AsNativeType(TypePositionInfo info) - { - return SpecialTypeInfo.IntPtr; - } - - public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info) - { - return info.IsByRef ? SignatureBehavior.PointerToNativeType : SignatureBehavior.NativeType; - } - - public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context) - { - return info.IsByRef ? ValueBoundaryBehavior.AddressOfNativeIdentifier : ValueBoundaryBehavior.NativeIdentifier; - } - - public IEnumerable Generate(TypePositionInfo info, StubCodeContext context) - { - // The high level logic (note that the parameter may be in, out or both): - // 1) If this is an input parameter we need to AddRef the SafeHandle. - // 2) If this is an output parameter we need to preallocate a SafeHandle to wrap the new native handle value. We - // must allocate this before the native call to avoid a failure point when we already have a native resource - // allocated. We must allocate a new SafeHandle even if we have one on input since both input and output native - // handles need to be tracked and released by a SafeHandle. - // 3) Initialize a local IntPtr that will be passed to the native call. If we have an input SafeHandle the value - // comes from there otherwise we get it from the new SafeHandle (which is guaranteed to be initialized to an - // invalid handle value). - // 4) If this is a out parameter we also store the original handle value (that we just computed above) in a local - // variable. - // 5) If we successfully AddRef'd the incoming SafeHandle, we need to Release it before we return. - // 6) After the native call, if this is an output parameter and the handle value we passed to native differs from - // the local copy we made then the new handle value is written into the output SafeHandle and that SafeHandle - // is propagated back to the caller. - - (string managedIdentifier, string nativeIdentifier) = context.GetIdentifiers(info); - string addRefdIdentifier = $"{managedIdentifier}__addRefd"; - string newHandleObjectIdentifier = info.IsManagedReturnPosition - ? managedIdentifier - : $"{managedIdentifier}__newHandle"; - string handleValueBackupIdentifier = $"{nativeIdentifier}__original"; - switch (context.CurrentStage) - { - case StubCodeContext.Stage.Setup: - if (!info.IsManagedReturnPosition && info.RefKind != RefKind.Out) - { - yield return LocalDeclarationStatement( - VariableDeclaration( - PredefinedType(Token(SyntaxKind.BoolKeyword)), - SingletonSeparatedList( - VariableDeclarator(addRefdIdentifier) - .WithInitializer(EqualsValueClause(LiteralExpression(SyntaxKind.FalseLiteralExpression)))))); - } - - ExpressionSyntax safeHandleCreationExpression = ((SafeHandleMarshallingInfo)info.MarshallingAttributeInfo).AccessibleDefaultConstructor - ? ObjectCreationExpression(info.ManagedType.Syntax, ArgumentList(), initializer: null) - : CastExpression( - info.ManagedType.Syntax, - MethodInvocation( - TypeSyntaxes.System_Activator, - IdentifierName("CreateInstance"), - Argument(TypeOfExpression(info.ManagedType.Syntax)), - Argument(LiteralExpression(SyntaxKind.TrueLiteralExpression)) - .WithNameColon(NameColon(IdentifierName("nonPublic"))))); - - if (info.IsManagedReturnPosition) - { - yield return AssignmentStatement(IdentifierName(managedIdentifier), safeHandleCreationExpression); - } - else if (info.IsByRef && info.RefKind != RefKind.In) - { - // We create the new handle in the Setup phase - // so we eliminate the possible failure points during unmarshalling, where we would - // leak the handle if we failed to create the handle. - yield return Declare(info.ManagedType.Syntax, newHandleObjectIdentifier, safeHandleCreationExpression); - - if (info.RefKind != RefKind.Out) - { - // IntPtr = newHandleObjectIdentifier.DangerousGetHandle(); - yield return Declare( - AsNativeType(info).Syntax, - handleValueBackupIdentifier, - MethodInvocation( - IdentifierName(newHandleObjectIdentifier), - IdentifierName(nameof(SafeHandle.DangerousGetHandle)))); - } - } - break; - case StubCodeContext.Stage.Marshal: - if (!info.IsManagedReturnPosition && info.RefKind != RefKind.Out) - { - // .DangerousAddRef(ref ); - yield return MethodInvocationStatement( - IdentifierName(managedIdentifier), - IdentifierName(nameof(SafeHandle.DangerousAddRef)), - RefArgument(IdentifierName(addRefdIdentifier))); - - - // = .DangerousGetHandle() - ExpressionSyntax assignHandleToNativeExpression = - AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, - IdentifierName(nativeIdentifier), - MethodInvocation( - IdentifierName(managedIdentifier), - IdentifierName(nameof(SafeHandle.DangerousGetHandle)))); - if (info.IsByRef && info.RefKind != RefKind.In) - { - yield return AssignmentStatement(IdentifierName(handleValueBackupIdentifier), assignHandleToNativeExpression); - } - else - { - yield return ExpressionStatement(assignHandleToNativeExpression); - } - } - break; - case StubCodeContext.Stage.GuaranteedUnmarshal: - StatementSyntax unmarshalStatement = MethodInvocationStatement( - TypeSyntaxes.System_Runtime_InteropServices_Marshal, - IdentifierName("InitHandle"), - Argument(IdentifierName(newHandleObjectIdentifier)), - Argument(IdentifierName(nativeIdentifier))); - - if (info.IsManagedReturnPosition) - { - yield return unmarshalStatement; - } - else if (info.RefKind == RefKind.Out) - { - yield return unmarshalStatement; - yield return AssignmentStatement(IdentifierName(managedIdentifier), IdentifierName(newHandleObjectIdentifier)); - } - else if (info.RefKind == RefKind.Ref) - { - // Decrement refcount on original SafeHandle if we addrefd - yield return IfStatement( - IdentifierName(addRefdIdentifier), - MethodInvocationStatement( - IdentifierName(managedIdentifier), - IdentifierName(nameof(SafeHandle.DangerousRelease)))); - - // Do not unmarshal the handle if the value didn't change. - yield return IfStatement( - BinaryExpression(SyntaxKind.NotEqualsExpression, - IdentifierName(handleValueBackupIdentifier), - IdentifierName(nativeIdentifier)), - Block( - unmarshalStatement, - AssignmentStatement( - IdentifierName(managedIdentifier), - IdentifierName(newHandleObjectIdentifier)))); - } - break; - case StubCodeContext.Stage.CleanupCallerAllocated: - if (!info.IsManagedReturnPosition && (!info.IsByRef || info.RefKind == RefKind.In)) - { - yield return IfStatement( - IdentifierName(addRefdIdentifier), - MethodInvocationStatement( - IdentifierName(managedIdentifier), - IdentifierName(nameof(SafeHandle.DangerousRelease)))); - } - break; - default: - break; - } - } - - public bool UsesNativeIdentifier(TypePositionInfo info, StubCodeContext context) => true; - - public ByValueMarshalKindSupport SupportsByValueMarshalKind(ByValueContentsMarshalKind marshalKind, TypePositionInfo info, StubCodeContext context, out GeneratorDiagnostic? diagnostic) - => ByValueMarshalKindSupportDescriptor.Default.GetSupport(marshalKind, info, context, out diagnostic); - } -} diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/StaticPinnableManagedValueMarshaller.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/StaticPinnableManagedValueMarshaller.cs index 039d78ed350068..07bb36a2edaba5 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/StaticPinnableManagedValueMarshaller.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/StaticPinnableManagedValueMarshaller.cs @@ -21,9 +21,6 @@ public StaticPinnableManagedValueMarshaller(IMarshallingGenerator innerMarshalli _getPinnableReferenceType = getPinnableReferenceType; } - public bool IsSupported(TargetFramework target, Version version) - => _innerMarshallingGenerator.IsSupported(target, version); - public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context) { if (IsPinningPathSupported(info, context)) diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/UnmanagedToManagedOwnershipTrackingStrategy.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/UnmanagedToManagedOwnershipTrackingStrategy.cs index ba43659536d529..3b41fa0efbfa60 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/UnmanagedToManagedOwnershipTrackingStrategy.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/Marshalling/UnmanagedToManagedOwnershipTrackingStrategy.cs @@ -178,7 +178,6 @@ IEnumerable GenerateStatementsFromInner(StubCodeContext context public SignatureBehavior GetNativeSignatureBehavior(TypePositionInfo info) => _inner.GetNativeSignatureBehavior(info); public ValueBoundaryBehavior GetValueBoundaryBehavior(TypePositionInfo info, StubCodeContext context) => _inner.GetValueBoundaryBehavior(info, context); - public bool IsSupported(TargetFramework target, Version version) => _inner.IsSupported(target, version); public ByValueMarshalKindSupport SupportsByValueMarshalKind(ByValueContentsMarshalKind marshalKind, TypePositionInfo info, StubCodeContext context, out GeneratorDiagnostic? diagnostic) => _inner.SupportsByValueMarshalKind(marshalKind, info, context, out diagnostic); public bool UsesNativeIdentifier(TypePositionInfo info, StubCodeContext context) => _inner.UsesNativeIdentifier(info, context); diff --git a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/SafeHandleMarshallingInfoProvider.cs b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/SafeHandleMarshallingInfoProvider.cs index a5c2f2a1f93f98..dd30b31b14ff08 100644 --- a/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/SafeHandleMarshallingInfoProvider.cs +++ b/src/libraries/System.Runtime.InteropServices/gen/Microsoft.Interop.SourceGeneration/SafeHandleMarshallingInfoProvider.cs @@ -10,11 +10,6 @@ namespace Microsoft.Interop { - /// - /// The type of the element is a SafeHandle-derived type with no marshalling attributes. - /// - public sealed record SafeHandleMarshallingInfo(bool AccessibleDefaultConstructor, bool IsAbstract) : MarshallingInfo; - /// /// This class supports generating marshalling info for SafeHandle-derived types. /// @@ -52,7 +47,6 @@ public bool CanProvideMarshallingInfoForType(ITypeSymbol type) public MarshallingInfo GetMarshallingInfo(ITypeSymbol type, int indirectionDepth, UseSiteAttributeProvider useSiteAttributes, GetMarshallingInfoCallback marshallingInfoCallback) { bool hasDefaultConstructor = false; - bool hasAccessibleDefaultConstructor = false; if (type is INamedTypeSymbol named && !named.IsAbstract && named.InstanceConstructors.Length > 0) { foreach (IMethodSymbol ctor in named.InstanceConstructors) @@ -60,18 +54,16 @@ public MarshallingInfo GetMarshallingInfo(ITypeSymbol type, int indirectionDepth if (ctor.Parameters.Length == 0) { hasDefaultConstructor = ctor.DeclaredAccessibility == Accessibility.Public; - hasAccessibleDefaultConstructor = _compilation.IsSymbolAccessibleWithin(ctor, _containingScope); break; } } } - // If we don't have the SafeHandleMarshaller type, then we'll use the built-in support in the generator. - // This support will be removed when dotnet/runtime doesn't build any packages for platforms below .NET 8 - // as the downlevel support is dotnet/runtime specific. + // If we don't have the SafeHandleMarshaller type, then we'll return a MissingSupportMarshallingInfo + // indicating that we don't support marshalling SafeHandles with source-generated marshalling. if (_safeHandleMarshallerType is null) { - return new SafeHandleMarshallingInfo(hasAccessibleDefaultConstructor, type.IsAbstract); + return new MissingSupportMarshallingInfo(); } INamedTypeSymbol entryPointType = _safeHandleMarshallerType.Construct(type); diff --git a/src/libraries/System.Speech/src/Recognition/SrgsGrammar/SrgsRule.cs b/src/libraries/System.Speech/src/Recognition/SrgsGrammar/SrgsRule.cs index 7709a8f0a4bc57..030fe78a4780b9 100644 --- a/src/libraries/System.Speech/src/Recognition/SrgsGrammar/SrgsRule.cs +++ b/src/libraries/System.Speech/src/Recognition/SrgsGrammar/SrgsRule.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Buffers; using System.Collections.ObjectModel; using System.Diagnostics; using System.Speech.Internal; @@ -14,6 +15,8 @@ namespace System.Speech.Recognition.SrgsGrammar [DebuggerTypeProxy(typeof(SrgsRuleDebugDisplay))] public class SrgsRule : IRule { + private static readonly SearchValues s_invalidChars = SearchValues.Create("?*+|()^$/;.=<>[]{}\\ \t\r\n"); + #region Constructors private SrgsRule() { @@ -383,7 +386,7 @@ private void ValidateIdentifier(string s) XmlParser.ThrowSrgsException(SRID.ConstructorNotAllowed, _id); } - if (s != null && (s.IndexOfAny(s_invalidChars) >= 0 || s.Length == 0)) + if (s != null && (s.Length == 0 || s.AsSpan().ContainsAny(s_invalidChars))) { XmlParser.ThrowSrgsException(SRID.InvalidMethodName); } @@ -416,7 +419,6 @@ private void ValidateIdentifier(string s) private string _onError; private string _onRecognition; - private static readonly char[] s_invalidChars = new char[] { '?', '*', '+', '|', '(', ')', '^', '$', '/', ';', '.', '=', '<', '>', '[', ']', '{', '}', '\\', ' ', '\t', '\r', '\n' }; #endregion diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/JsonHelpers.cs b/src/libraries/System.Text.Json/src/System/Text/Json/JsonHelpers.cs index 87e34f44969865..5f9a6847015165 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/JsonHelpers.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/JsonHelpers.cs @@ -93,11 +93,22 @@ public static void ReadWithVerify(this ref Utf8JsonReader reader) /// public static string Utf8GetString(ReadOnlySpan bytes) { - return Encoding.UTF8.GetString(bytes -#if !NETCOREAPP - .ToArray() +#if NETCOREAPP + return Encoding.UTF8.GetString(bytes); +#else + if (bytes.Length == 0) + { + return string.Empty; + } + + unsafe + { + fixed (byte* bytesPtr = bytes) + { + return Encoding.UTF8.GetString(bytesPtr, bytes.Length); + } + } #endif - ); } /// diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Nodes/JsonNode.To.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Nodes/JsonNode.To.cs index 838b05423912f8..0304718c81aa25 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Nodes/JsonNode.To.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Nodes/JsonNode.To.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Threading; + namespace System.Text.Json.Nodes { public abstract partial class JsonNode @@ -12,8 +14,25 @@ public abstract partial class JsonNode /// JSON representation of current instance. public string ToJsonString(JsonSerializerOptions? options = null) { - using PooledByteBufferWriter output = WriteToPooledBuffer(options, options?.GetWriterOptions() ?? default); - return JsonHelpers.Utf8GetString(output.WrittenMemory.Span); + JsonWriterOptions writerOptions = default; + int defaultBufferSize = JsonSerializerOptions.BufferSizeDefault; + if (options is not null) + { + writerOptions = options.GetWriterOptions(); + defaultBufferSize = options.DefaultBufferSize; + } + + Utf8JsonWriter writer = Utf8JsonWriterCache.RentWriterAndBuffer(writerOptions, defaultBufferSize, out PooledByteBufferWriter output); + try + { + WriteTo(writer, options); + writer.Flush(); + return JsonHelpers.Utf8GetString(output.WrittenMemory.Span); + } + finally + { + Utf8JsonWriterCache.ReturnWriterAndBuffer(writer, output); + } } /// @@ -37,8 +56,17 @@ public override string ToString() } } - using PooledByteBufferWriter output = WriteToPooledBuffer(writerOptions: new JsonWriterOptions { Indented = true }); - return JsonHelpers.Utf8GetString(output.WrittenMemory.Span); + Utf8JsonWriter writer = Utf8JsonWriterCache.RentWriterAndBuffer(new JsonWriterOptions { Indented = true }, JsonSerializerOptions.BufferSizeDefault, out PooledByteBufferWriter output); + try + { + WriteTo(writer); + writer.Flush(); + return JsonHelpers.Utf8GetString(output.WrittenMemory.Span); + } + finally + { + Utf8JsonWriterCache.ReturnWriterAndBuffer(writer, output); + } } /// @@ -50,19 +78,5 @@ public override string ToString() /// /// Options to control the serialization behavior. public abstract void WriteTo(Utf8JsonWriter writer, JsonSerializerOptions? options = null); - - /// - /// Creates a pooled buffer writer instance and serializes all contents to it. - /// - internal PooledByteBufferWriter WriteToPooledBuffer( - JsonSerializerOptions? options = null, - JsonWriterOptions writerOptions = default, - int bufferSize = JsonSerializerOptions.BufferSizeDefault) - { - var bufferWriter = new PooledByteBufferWriter(bufferSize); - using var writer = new Utf8JsonWriter(bufferWriter, writerOptions); - WriteTo(writer, options); - return bufferWriter; - } } } diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Nodes/JsonValueOfT.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Nodes/JsonValueOfT.cs index 0be2c9517a376a..86db69d82cd743 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Nodes/JsonValueOfT.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Nodes/JsonValueOfT.cs @@ -72,8 +72,17 @@ internal sealed override JsonValueKind GetValueKindCore() return element.ValueKind; } - using PooledByteBufferWriter output = WriteToPooledBuffer(); - return JsonElement.ParseValue(output.WrittenMemory.Span, options: default).ValueKind; + Utf8JsonWriter writer = Utf8JsonWriterCache.RentWriterAndBuffer(default, JsonSerializerOptions.BufferSizeDefault, out PooledByteBufferWriter output); + try + { + WriteTo(writer); + writer.Flush(); + return JsonElement.ParseValue(output.WrittenMemory.Span, options: default).ValueKind; + } + finally + { + Utf8JsonWriterCache.ReturnWriterAndBuffer(writer, output); + } } internal sealed override bool DeepEqualsCore(JsonNode? otherNode) @@ -107,9 +116,21 @@ internal sealed override bool DeepEqualsCore(JsonNode? otherNode) } } - using PooledByteBufferWriter thisOutput = WriteToPooledBuffer(); - using PooledByteBufferWriter otherOutput = otherNode.WriteToPooledBuffer(); + using PooledByteBufferWriter thisOutput = WriteToPooledBuffer(this); + using PooledByteBufferWriter otherOutput = WriteToPooledBuffer(otherNode); return thisOutput.WrittenMemory.Span.SequenceEqual(otherOutput.WrittenMemory.Span); + + static PooledByteBufferWriter WriteToPooledBuffer( + JsonNode node, + JsonSerializerOptions? options = null, + JsonWriterOptions writerOptions = default, + int bufferSize = JsonSerializerOptions.BufferSizeDefault) + { + var bufferWriter = new PooledByteBufferWriter(bufferSize); + using var writer = new Utf8JsonWriter(bufferWriter, writerOptions); + node.WriteTo(writer, options); + return bufferWriter; + } } internal TypeToConvert ConvertJsonElement() diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Writer/Utf8JsonWriterCache.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Writer/Utf8JsonWriterCache.cs index bff98e9b81649e..b0d95280312865 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Writer/Utf8JsonWriterCache.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Writer/Utf8JsonWriterCache.cs @@ -13,7 +13,10 @@ internal static class Utf8JsonWriterCache [ThreadStatic] private static ThreadLocalState? t_threadLocalState; - public static Utf8JsonWriter RentWriterAndBuffer(JsonSerializerOptions options, out PooledByteBufferWriter bufferWriter) + public static Utf8JsonWriter RentWriterAndBuffer(JsonSerializerOptions options, out PooledByteBufferWriter bufferWriter) => + RentWriterAndBuffer(options.GetWriterOptions(), options.DefaultBufferSize, out bufferWriter); + + public static Utf8JsonWriter RentWriterAndBuffer(JsonWriterOptions options, int defaultBufferSize, out PooledByteBufferWriter bufferWriter) { ThreadLocalState state = t_threadLocalState ??= new(); Utf8JsonWriter writer; @@ -24,14 +27,14 @@ public static Utf8JsonWriter RentWriterAndBuffer(JsonSerializerOptions options, bufferWriter = state.BufferWriter; writer = state.Writer; - bufferWriter.InitializeEmptyInstance(options.DefaultBufferSize); - writer.Reset(bufferWriter, options.GetWriterOptions()); + bufferWriter.InitializeEmptyInstance(defaultBufferSize); + writer.Reset(bufferWriter, options); } else { // We're in a recursive JsonSerializer call -- return fresh instances. - bufferWriter = new PooledByteBufferWriter(options.DefaultBufferSize); - writer = new Utf8JsonWriter(bufferWriter, options.GetWriterOptions()); + bufferWriter = new PooledByteBufferWriter(defaultBufferSize); + writer = new Utf8JsonWriter(bufferWriter, options); } return writer; diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj index 5b1d2ca95cd27b..0afc0908b70c40 100644 --- a/src/libraries/tests.proj +++ b/src/libraries/tests.proj @@ -341,7 +341,6 @@ -