Skip to content

Commit d1845ee

Browse files
authored
[dotnet] Use the default .NET scheme for the default TargetPlatformVersion for library projects. (#21343)
We must define the default platform version if it's not specified in the TFM, and according to the spec the default should not change for a given .NET version: * We release support for iOS 18.0 with .NET 9 * Apple releases iOS 18.1, we're still using .NET 9. This default continues to be iOS 18.0 * .NET 10 is shipped, and at this point we bump the default to iOS 19.0 Basically: this should be the last OS version of the platform in question when the current major .NET version is first released to stable. Ref: https://github.com/dotnet/designs/blob/8e6394406d44f75f30ea2259a425cb9e38d75b69/accepted/2020/net5/net5.md#os-versions However, this doesn't work well for Apple platforms: Whenever Apple releases new Xcode versions, our existing workloads might not be compatible with the new Xcode. We'll of course ship updateds workload with support for the new Xcode, but defaulting to an older target platform version would mean that developers wouldn't get the new workload, they'd get the old one. This is exacerbated by the fact that Apple aggressively auto-updates Xcode on developers' machines: they might wake up one day to a broken build - the obvious fix ("dotnet workload update") doesn't fix anything - even if we've shipped updated workloads - because the default is to use the old one. They'd have to manually specify the target platform version in the target platform to get the updated workload ("net8.0-ios17.2" to use the iOS 17.2 workload instead of "net8.0-ios", which would use the default (old/initial/17.0) .NET 8 workload) - and then update _again_ when the next Xcode comes around. At this point the point of having a sane default value is totally out the window, because everybody would have to specify (and continuously update) a platform version in their project files to keep their projects building. So we've made the decision that the default target platform version is always the latest supported target platform version. Given the previous example: once we've implemented and released support for iOS 18.1, the updated iOS workload will use 18.1 as the default TPV for iOS. On the other hand, this turns out to be somewhat of a complication for library developers, because they typically don't need Xcode to build their projects, and if we auto-update their TargetPlatformVersion to the latest, then all their customers have to also update their workloads, which for some people end up being a rather nasty surprise (because with the above algorithm it happens without developer action). Thus we follow .NET's default platform version scheme for library projects: it won't change in minor .NET releases. Related design/docs PRs: * dotnet/docs#43089 * dotnet/designs#324
1 parent d283463 commit d1845ee

File tree

11 files changed

+106
-35
lines changed

11 files changed

+106
-35
lines changed

Make.versions

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ WATCHOS_NUGET_OS_VERSION=11.0
7171
MACOS_NUGET_OS_VERSION=15.0
7272
MACCATALYST_NUGET_OS_VERSION=18.0
7373

74+
# The following are the OS versions we first supported with the current .NET version.
75+
# These versions must *not* change with minor .NET updates, only major .NET releases.
76+
IOS_TARGET_PLATFORM_VERSION_LIBRARY=18.0
77+
TVOS_TARGET_PLATFORM_VERSION_LIBRARY=18.0
78+
MACOS_TARGET_PLATFORM_VERSION_LIBRARY=15.0
79+
MACCATALYST_TARGET_PLATFORM_VERSION_LIBRARY=18.0
7480

7581
# In theory we should define the default platform version if it's not specified in the TFM. The default should not change for a given .NET version:
7682
# * We release support for iOS 14.5 with .NET 6
@@ -100,6 +106,13 @@ MACCATALYST_NUGET_OS_VERSION=18.0
100106
# So we've made the decision that the default target platform version is
101107
# always the latest target platform version.
102108

109+
# However, this turns out to be somewhat of a complication for library developers,
110+
# because they typically don't need Xcode to build their projects, and if we auto-
111+
# update their TargetPlatformVersion to the latest, then all their customers
112+
# have to also update their workloads, which for some people end up being a rather
113+
# nasty surprise (because with the above algorithm it happens without developer
114+
# action). Thus we follow .NET's default platform version scheme for library projects:
115+
# it won't change in minor .NET releases.
103116

104117
#
105118
# Here we list all the releases we support for each platform.

dotnet/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ targets/Microsoft.$(1).Sdk.Versions.props: targets/Microsoft.Sdk.Versions.templa
119119
-e "s/@PLATFORM@/$(1)/g" \
120120
-e "s/@NUGET_VERSION_NO_METADATA@/$$($(2)_NUGET_VERSION_NO_METADATA)/g" \
121121
-e "s/@NUGET_VERSION_FULL@/$$($(2)_NUGET_VERSION_FULL)/g" \
122-
-e "s/@TARGET_PLATFORM_VERSION@/$$($(2)_NUGET_OS_VERSION)/g" \
122+
-e "s/@TARGET_PLATFORM_VERSION_EXE@/$$($(2)_NUGET_OS_VERSION)/g" \
123+
-e "s/@TARGET_PLATFORM_VERSION_LIBRARY@/$$($(2)_TARGET_PLATFORM_VERSION_LIBRARY)/g" \
123124
-e "s/@CURRENT_BRANCH@/$$(CURRENT_BRANCH_SED_ESCAPED)/g" \
124125
-e "s/@CURRENT_HASH_LONG@/$$(CURRENT_HASH_LONG)/g" \
125126
-e 's*@VALID_RUNTIME_IDENTIFIERS@*$(foreach rid,$(3),\n\t\t<_XamarinValidRuntimeIdentifier Include="$(rid)" Platform="$(1)" />)*' \

dotnet/targets/Microsoft.Sdk.Versions.template.props

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
<_ShortPackageVersion>@NUGET_VERSION_NO_METADATA@</_ShortPackageVersion>
88
<_PackageVersion>@NUGET_VERSION_FULL@</_PackageVersion>
9-
<_XamarinTargetPlatformVersion>@TARGET_PLATFORM_VERSION@</_XamarinTargetPlatformVersion>
9+
<_XamarinTargetPlatformVersionExecutable>@TARGET_PLATFORM_VERSION_EXE@</_XamarinTargetPlatformVersionExecutable>
10+
<_XamarinTargetPlatformVersionLibrary>@TARGET_PLATFORM_VERSION_LIBRARY@</_XamarinTargetPlatformVersionLibrary>
1011
<_XamarinIsPreviewRelease>@XCODE_IS_PREVIEW@</_XamarinIsPreviewRelease>
1112
<_XamarinDotNetVersion>@DOTNET_TFM@</_XamarinDotNetVersion>
1213
<_XamarinPackSuffix>@DOTNET_TFM@_@NUGET_OS_VERSION@</_XamarinPackSuffix>

dotnet/targets/Xamarin.Shared.Sdk.TargetFrameworkInference.props

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
<!-- Set the default TargetPlatformVersion if it wasn't specified in the TargetFramework variable. This must be set after importing Sdk.targets (in Xamarin.Shared.Sdk.targets) -->
1414
<PropertyGroup>
15-
<TargetPlatformVersion Condition="'$(TargetPlatformVersion)' == ''">$(_XamarinTargetPlatformVersion)</TargetPlatformVersion>
15+
<TargetPlatformVersion Condition="'$(TargetPlatformVersion)' == '' And ('$(OutputType)' == 'Exe' Or '$(IsAppExtension)' == 'true')">$(_XamarinTargetPlatformVersionExecutable)</TargetPlatformVersion>
16+
<TargetPlatformVersion Condition="'$(TargetPlatformVersion)' == ''">$(_XamarinTargetPlatformVersionLibrary)</TargetPlatformVersion>
1617
</PropertyGroup>
1718
</Project>

tests/dotnet/UnitTests/ApplePlatformExtensions.cs

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
namespace Xamarin.Utils {
44
public static class ApplePlatformExtensionsWithVersions {
5-
public static string ToFrameworkWithPlatformVersion (this ApplePlatform @this)
5+
public static string ToFrameworkWithPlatformVersion (this ApplePlatform @this, bool isExecutable /* and not library */)
66
{
77
var netVersion = Configuration.DotNetTfm;
8-
var targetPlatformVersion = GetTargetPlatformVersion (@this);
8+
var targetPlatformVersion = isExecutable ? GetDefaultTargetPlatformVersionExecutable (@this) : GetDefaultTargetPlatformVersionLibrary (@this);
99
switch (@this) {
1010
case ApplePlatform.iOS:
1111
return netVersion + "-ios" + targetPlatformVersion;
@@ -20,16 +20,53 @@ public static string ToFrameworkWithPlatformVersion (this ApplePlatform @this)
2020
}
2121
}
2222

23-
public static string GetTargetPlatformVersion (this ApplePlatform @this)
23+
public static string GetDefaultTargetPlatformVersionExecutable (this ApplePlatform @this)
2424
{
2525
switch (@this) {
26-
case ApplePlatform.iOS: return SdkVersions.TargetPlatformVersioniOS;
27-
case ApplePlatform.TVOS: return SdkVersions.TargetPlatformVersiontvOS;
28-
case ApplePlatform.MacOSX: return SdkVersions.TargetPlatformVersionmacOS;
29-
case ApplePlatform.MacCatalyst: return SdkVersions.TargetPlatformVersionMacCatalyst;
26+
case ApplePlatform.iOS: return SdkVersions.TargetPlatformVersionExecutableiOS;
27+
case ApplePlatform.TVOS: return SdkVersions.TargetPlatformVersionExecutabletvOS;
28+
case ApplePlatform.MacOSX: return SdkVersions.TargetPlatformVersionExecutablemacOS;
29+
case ApplePlatform.MacCatalyst: return SdkVersions.TargetPlatformVersionExecutableMacCatalyst;
3030
default:
3131
return "Unknown";
3232
}
3333
}
34+
35+
public static string GetDefaultTargetPlatformVersionLibrary (this ApplePlatform @this)
36+
{
37+
switch (@this) {
38+
case ApplePlatform.iOS: return SdkVersions.TargetPlatformVersionLibraryiOS;
39+
case ApplePlatform.TVOS: return SdkVersions.TargetPlatformVersionLibrarytvOS;
40+
case ApplePlatform.MacOSX: return SdkVersions.TargetPlatformVersionLibrarymacOS;
41+
case ApplePlatform.MacCatalyst: return SdkVersions.TargetPlatformVersionLibraryMacCatalyst;
42+
default:
43+
return "Unknown";
44+
}
45+
}
46+
}
47+
48+
[TestFixture]
49+
public class TargetFrameworkTest {
50+
[TestCase (ApplePlatform.iOS)]
51+
[TestCase (ApplePlatform.MacCatalyst)]
52+
[TestCase (ApplePlatform.TVOS)]
53+
[TestCase (ApplePlatform.MacOSX)]
54+
public void DefaultLibraryTargetPlatformVersion (ApplePlatform platform)
55+
{
56+
// We might have to change the assert if the first minor OS version we release for a given .NET version is >0 (this happened for both .NET 7 and .NET 8).
57+
Assert.That (platform.GetDefaultTargetPlatformVersionLibrary (), Does.EndWith (".0"), "Default TPV for a library must end with .0");
58+
}
59+
60+
[TestCase (ApplePlatform.iOS)]
61+
[TestCase (ApplePlatform.MacCatalyst)]
62+
[TestCase (ApplePlatform.TVOS)]
63+
[TestCase (ApplePlatform.MacOSX)]
64+
public void MajorTargetPlatformVersion (ApplePlatform platform)
65+
{
66+
var vLibrary = Version.Parse (platform.GetDefaultTargetPlatformVersionLibrary ());
67+
var vExecutable = Version.Parse (platform.GetDefaultTargetPlatformVersionExecutable ());
68+
// We might have to change the assert if we release support for a new major OS version within a .NET releases (this happened for .NET 8)
69+
Assert.AreEqual (vExecutable.Major, vLibrary.Major, "The major version must be the same between the default TPV for library and executable projects.");
70+
}
3471
}
3572
}

tests/dotnet/UnitTests/MlaunchTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public void GetMlaunchRunArguments (ApplePlatform platform, string runtimeIdenti
9090
expectedArguments.Append (appPath.Substring (Path.GetDirectoryName (project_path)!.Length + 1)).Append ('/');
9191
if (isSim) {
9292
expectedArguments.Append (" --device \"");
93-
expectedArguments.Append (device.Replace ("%TPV%", platform.GetTargetPlatformVersion ().Replace ('.', '-')));
93+
expectedArguments.Append (device);
9494
expectedArguments.Append ('"');
9595
}
9696
expectedArguments.Append ($" --wait-for-exit:true");

tests/dotnet/UnitTests/PackTest.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public void BindingFrameworksProject (ApplePlatform platform, bool noBindingEmbe
6262

6363
var archive = ZipFile.OpenRead (nupkg);
6464
var files = archive.Entries.Select (v => v.FullName).ToHashSet ();
65+
var tfm = platform.ToFrameworkWithPlatformVersion (isExecutable: false);
6566
var hasSymlinks = noBindingEmbedding && (platform == ApplePlatform.MacCatalyst || platform == ApplePlatform.MacOSX);
6667
if (noBindingEmbedding) {
6768
Assert.That (archive.Entries.Count, Is.EqualTo (hasSymlinks ? 6 : 10), $"nupkg file count - {nupkg}");
@@ -71,17 +72,17 @@ public void BindingFrameworksProject (ApplePlatform platform, bool noBindingEmbe
7172
Assert.That (files, Does.Contain (project + ".nuspec"), "nuspec");
7273
Assert.That (files, Does.Contain ("_rels/.rels"), ".rels");
7374
Assert.That (files, Does.Contain ("[Content_Types].xml"), "[Content_Types].xml");
74-
Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.dll"), $"{project}.dll");
75+
Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.dll"), $"{project}.dll");
7576
Assert.That (files, Has.Some.Matches<string> (v => v.StartsWith ("package/services/metadata/core-properties/", StringComparison.Ordinal) && v.EndsWith (".psmdcp", StringComparison.Ordinal)), "psmdcp");
7677
if (noBindingEmbedding) {
7778
if (hasSymlinks) {
78-
Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources.zip"), $"{project}.resources.zip");
79+
Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources.zip"), $"{project}.resources.zip");
7980
} else {
80-
Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources/XStaticArTest.framework/XStaticArTest"), $"XStaticArTest.framework/XStaticArTest");
81-
Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources/XStaticObjectTest.framework/XStaticObjectTest"), $"XStaticObjectTest.framework/XStaticObjectTest");
82-
Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources/XTest.framework/XTest"), $"XTest.framework/XTest");
83-
Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources/XTest.framework/Info.plist"), $"XTest.framework/Info.plist");
84-
Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.resources/manifest"), $"manifest");
81+
Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources/XStaticArTest.framework/XStaticArTest"), $"XStaticArTest.framework/XStaticArTest");
82+
Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources/XStaticObjectTest.framework/XStaticObjectTest"), $"XStaticObjectTest.framework/XStaticObjectTest");
83+
Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources/XTest.framework/XTest"), $"XTest.framework/XTest");
84+
Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources/XTest.framework/Info.plist"), $"XTest.framework/Info.plist");
85+
Assert.That (files, Does.Contain ($"lib/{tfm}/{project}.resources/manifest"), $"manifest");
8586
}
8687
}
8788
}
@@ -127,14 +128,15 @@ public void BindingXcFrameworksProject (ApplePlatform platform, bool noBindingEm
127128

128129
var archive = ZipFile.OpenRead (nupkg);
129130
var files = archive.Entries.Select (v => v.FullName).ToHashSet ();
131+
var tfm = platform.ToFrameworkWithPlatformVersion (isExecutable: false);
130132
Assert.That (archive.Entries.Count, Is.EqualTo (noBindingEmbedding ? 6 : 5), $"nupkg file count - {nupkg}");
131133
Assert.That (files, Does.Contain (assemblyName + ".nuspec"), "nuspec");
132134
Assert.That (files, Does.Contain ("_rels/.rels"), ".rels");
133135
Assert.That (files, Does.Contain ("[Content_Types].xml"), "[Content_Types].xml");
134-
Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{assemblyName}.dll"), $"{assemblyName}.dll");
136+
Assert.That (files, Does.Contain ($"lib/{tfm}/{assemblyName}.dll"), $"{assemblyName}.dll");
135137
Assert.That (files, Has.Some.Matches<string> (v => v.StartsWith ("package/services/metadata/core-properties/", StringComparison.Ordinal) && v.EndsWith (".psmdcp", StringComparison.Ordinal)), "psmdcp");
136138
if (noBindingEmbedding) {
137-
Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{assemblyName}.resources.zip"), $"{assemblyName}.resources.zip");
139+
Assert.That (files, Does.Contain ($"lib/{tfm}/{assemblyName}.resources.zip"), $"{assemblyName}.resources.zip");
138140
}
139141
}
140142

@@ -164,7 +166,7 @@ public void LibraryProject (ApplePlatform platform)
164166
Assert.That (files, Does.Contain (project + ".nuspec"), "nuspec");
165167
Assert.That (files, Does.Contain ("_rels/.rels"), ".rels");
166168
Assert.That (files, Does.Contain ("[Content_Types].xml"), "[Content_Types].xml");
167-
Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion ()}/{project}.dll"), $"{project}.dll");
169+
Assert.That (files, Does.Contain ($"lib/{platform.ToFrameworkWithPlatformVersion (isExecutable: false)}/{project}.dll"), $"{project}.dll");
168170
Assert.That (files, Has.Some.Matches<string> (v => v.StartsWith ("package/services/metadata/core-properties/", StringComparison.Ordinal) && v.EndsWith (".psmdcp", StringComparison.Ordinal)), "psmdcp");
169171
}
170172

tests/dotnet/UnitTests/XcodeProjectTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,10 @@ public void PackBinding (ApplePlatform platform)
179179
Assert.That (expectedNupkgOutput, Does.Exist, $"Expected pack output '{expectedNupkgOutput}' did not exist.");
180180

181181
List<string> zipContent = ZipHelpers.List (expectedNupkgOutput);
182-
var expectedFxPath = $"lib/{platform.ToFrameworkWithPlatformVersion ()}/{TestName}.resources/{xcodeProjName}{platform.AsString ()}.xcframework/Info.plist";
182+
var tfm = platform.ToFrameworkWithPlatformVersion (isExecutable: false);
183+
var expectedFxPath = $"lib/{tfm}/{TestName}.resources/{xcodeProjName}{platform.AsString ()}.xcframework/Info.plist";
183184
if (platform == ApplePlatform.MacOSX || platform == ApplePlatform.MacCatalyst) {
184-
zipContent = ZipHelpers.ListInnerZip (expectedNupkgOutput, $"lib/{platform.ToFrameworkWithPlatformVersion ()}/{TestName}.resources.zip");
185+
zipContent = ZipHelpers.ListInnerZip (expectedNupkgOutput, $"lib/{tfm}/{TestName}.resources.zip");
185186
expectedFxPath = $"{xcodeProjName}{platform.AsString ()}.xcframework/Info.plist";
186187
}
187188
Assert.Contains (expectedFxPath, zipContent, $"Expected xcframework output was not found in '{expectedNupkgOutput}'.");

tools/common/Make.common

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,15 @@ $(abspath ../common/SdkVersions.cs): ../common/SdkVersions.in.cs Makefile $(TOP)
5050
-e "s/@MACOS_NUGET_VERSION@/$(MACOS_NUGET_VERSION)/g" \
5151
-e "s/@MACOS_NUGET_REVISION@/$(NUGET_PRERELEASE_IDENTIFIER)$(MACOS_NUGET_COMMIT_DISTANCE)$(NUGET_BUILD_METADATA)/g" \
5252
\
53-
-e "s/@TARGET_PLATFORM_VERSION_IOS@/$(IOS_NUGET_OS_VERSION)/g" \
54-
-e "s/@TARGET_PLATFORM_VERSION_TVOS@/$(TVOS_NUGET_OS_VERSION)/g" \
55-
-e "s/@TARGET_PLATFORM_VERSION_MACOS@/$(MACOS_NUGET_OS_VERSION)/g" \
56-
-e "s/@TARGET_PLATFORM_VERSION_MACCATALYST@/$(MACCATALYST_NUGET_OS_VERSION)/g" \
53+
-e "s/@TARGET_PLATFORM_VERSION_EXECUTABLE_IOS@/$(IOS_NUGET_OS_VERSION)/g" \
54+
-e "s/@TARGET_PLATFORM_VERSION_EXECUTABLE_TVOS@/$(TVOS_NUGET_OS_VERSION)/g" \
55+
-e "s/@TARGET_PLATFORM_VERSION_EXECUTABLE_MACOS@/$(MACOS_NUGET_OS_VERSION)/g" \
56+
-e "s/@TARGET_PLATFORM_VERSION_EXECUTABLE_MACCATALYST@/$(MACCATALYST_NUGET_OS_VERSION)/g" \
57+
\
58+
-e "s/@TARGET_PLATFORM_VERSION_LIBRARY_IOS@/$(IOS_TARGET_PLATFORM_VERSION_LIBRARY)/g" \
59+
-e "s/@TARGET_PLATFORM_VERSION_LIBRARY_TVOS@/$(TVOS_TARGET_PLATFORM_VERSION_LIBRARY)/g" \
60+
-e "s/@TARGET_PLATFORM_VERSION_LIBRARY_MACOS@/$(MACOS_TARGET_PLATFORM_VERSION_LIBRARY)/g" \
61+
-e "s/@TARGET_PLATFORM_VERSION_LIBRARY_MACCATALYST@/$(MACCATALYST_TARGET_PLATFORM_VERSION_LIBRARY)/g" \
5762
\
5863
-e "s/@PRODUCT_HASH@/$(CURRENT_HASH_LONG)/g" \
5964
\

tools/common/SdkVersions.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,15 @@ static class SdkVersions {
5757
public const string MaxWatchDeploymentTarget = "11.0";
5858
public const string MaxTVOSDeploymentTarget = "18.0";
5959

60-
public const string TargetPlatformVersioniOS = "18.0";
61-
public const string TargetPlatformVersiontvOS = "18.0";
62-
public const string TargetPlatformVersionmacOS = "15.0";
63-
public const string TargetPlatformVersionMacCatalyst = "18.0";
60+
public const string TargetPlatformVersionExecutableiOS = "18.0";
61+
public const string TargetPlatformVersionExecutabletvOS = "18.0";
62+
public const string TargetPlatformVersionExecutablemacOS = "15.0";
63+
public const string TargetPlatformVersionExecutableMacCatalyst = "18.0";
64+
65+
public const string TargetPlatformVersionLibraryiOS = "18.0";
66+
public const string TargetPlatformVersionLibrarytvOS = "18.0";
67+
public const string TargetPlatformVersionLibrarymacOS = "15.0";
68+
public const string TargetPlatformVersionLibraryMacCatalyst = "18.0";
6469

6570
public static Version OSXVersion { get { return new Version (OSX); } }
6671
public static Version iOSVersion { get { return new Version (iOS); } }

0 commit comments

Comments
 (0)