Skip to content

Commit

Permalink
[Xamarin.MacDev] Add an AppleSdkVersion struct which replaces IPhoneS…
Browse files Browse the repository at this point in the history
…dkVersion and MacOSXSdkVersion. (#87)

This reduces code duplication and makes it possible to simplify logic in a few places.
  • Loading branch information
rolfbjarne authored Feb 11, 2021
1 parent e7ec7ef commit 02d6d05
Show file tree
Hide file tree
Showing 9 changed files with 443 additions and 234 deletions.
34 changes: 17 additions & 17 deletions Xamarin.MacDev/AppleSdk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ public abstract class AppleSdk : IAppleSdk
public string SimPlatform { get { return Path.Combine (DeveloperRoot, "Platforms/" + SimulatorPlatformName + ".platform"); } }

public bool IsInstalled { get; private set; }
public IPhoneSdkVersion[] InstalledSdkVersions { get; private set; }
public IPhoneSdkVersion[] InstalledSimVersions { get; private set; }
public AppleSdkVersion[] InstalledSdkVersions { get; private set; }
public AppleSdkVersion[] InstalledSimVersions { get; private set; }

readonly Dictionary<string, AppleDTSdkSettings> sdkSettingsCache = new Dictionary<string, AppleDTSdkSettings> ();
readonly Dictionary<string, AppleDTSdkSettings> simSettingsCache = new Dictionary<string, AppleDTSdkSettings> ();
Expand All @@ -61,8 +61,8 @@ protected void Init ()
InstalledSdkVersions = EnumerateSdks (Path.Combine (DevicePlatform, "Developer/SDKs"), DevicePlatformName);
InstalledSimVersions = EnumerateSdks (Path.Combine (SimPlatform, "Developer/SDKs"), SimulatorPlatformName);
} else {
InstalledSdkVersions = new IPhoneSdkVersion[0];
InstalledSimVersions = new IPhoneSdkVersion[0];
InstalledSdkVersions = new AppleSdkVersion [0];
InstalledSimVersions = new AppleSdkVersion [0];
}
}

Expand All @@ -72,7 +72,7 @@ public string GetPlatformPath (bool sim)
return sim ? SimPlatform : DevicePlatform;
}

public string GetSdkPath (IPhoneSdkVersion version, bool sim)
public string GetSdkPath (IAppleSdkVersion version, bool sim)
{
return GetSdkPath (version.ToString (), sim);
}
Expand All @@ -92,18 +92,18 @@ string GetSdkPlistFilename (string version, bool sim)

bool IAppleSdk.SdkIsInstalled (IAppleSdkVersion version, bool isSimulator)
{
return SdkIsInstalled ((IPhoneSdkVersion) version, isSimulator);
return SdkIsInstalled ((AppleSdkVersion) version, isSimulator);
}

public bool SdkIsInstalled (IPhoneSdkVersion version, bool sim)
public bool SdkIsInstalled (AppleSdkVersion version, bool sim)
{
foreach (var v in (sim? InstalledSimVersions : InstalledSdkVersions))
if (v.Equals (version))
return true;
return false;
}

public AppleDTSdkSettings GetSdkSettings (IPhoneSdkVersion sdk, bool isSim)
public AppleDTSdkSettings GetSdkSettings (AppleSdkVersion sdk, bool isSim)
{
return GetSdkSettings ((IAppleSdkVersion) sdk, isSim);
}
Expand Down Expand Up @@ -178,33 +178,33 @@ public AppleDTSettings GetAppleDTSettings ()

IAppleSdkVersion IAppleSdk.GetClosestInstalledSdk (IAppleSdkVersion version, bool isSimulator)
{
return GetClosestInstalledSdk ((IPhoneSdkVersion) version, isSimulator);
return GetClosestInstalledSdk ((AppleSdkVersion) version, isSimulator);
}

public IPhoneSdkVersion GetClosestInstalledSdk (IPhoneSdkVersion v, bool sim)
public AppleSdkVersion GetClosestInstalledSdk (AppleSdkVersion v, bool sim)
{
//sorted low to high, so get first that's >= requested version
foreach (var i in GetInstalledSdkVersions (sim)) {
if (i.CompareTo (v) >= 0)
return i;
}
return IPhoneSdkVersion.UseDefault;
return AppleSdkVersion.UseDefault;
}

IList<IAppleSdkVersion> IAppleSdk.GetInstalledSdkVersions (bool isSimulator)
{
return GetInstalledSdkVersions (isSimulator).Cast<IAppleSdkVersion> ().ToArray ();
}

public IList<IPhoneSdkVersion> GetInstalledSdkVersions (bool sim)
public IList<AppleSdkVersion> GetInstalledSdkVersions (bool sim)
{
return sim ? InstalledSimVersions : InstalledSdkVersions;
}

protected static IPhoneSdkVersion[] EnumerateSdks (string sdkDir, string name)
protected static AppleSdkVersion [] EnumerateSdks (string sdkDir, string name)
{
if (!Directory.Exists (sdkDir))
return new IPhoneSdkVersion[0];
return new AppleSdkVersion [0];

var sdks = new List<string> ();

Expand All @@ -225,10 +225,10 @@ protected static IPhoneSdkVersion[] EnumerateSdks (string sdkDir, string name)
sdks.Add (d);
}

var vs = new List<IPhoneSdkVersion> ();
var vs = new List<AppleSdkVersion> ();
foreach (var s in sdks) {
try {
vs.Add (IPhoneSdkVersion.Parse (s));
vs.Add (AppleSdkVersion.Parse (s));
} catch (Exception ex) {
LoggingService.LogError ("Could not parse {0} SDK version '{1}':\n{2}", name, s, ex.ToString ());
}
Expand All @@ -255,7 +255,7 @@ protected static string GrabRootString (string file, string key)

bool IAppleSdk.TryParseSdkVersion (string value, out IAppleSdkVersion version)
{
return IAppleSdkVersion_Extensions.TryParse<IPhoneSdkVersion> (value, out version);
return IAppleSdkVersion_Extensions.TryParse<AppleSdkVersion> (value, out version);
}
}
}
214 changes: 214 additions & 0 deletions Xamarin.MacDev/AppleSdkVersion.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
//
// AppleSdkVersion.cs
//
// Authors: Michael Hutchinson <mhutchinson@novell.com>
// Jeffrey Stedfast <jeff@xamarin.com>
//
// Copyright (c) 2010 Novell, Inc. (http://www.novell.com)
// Copyright (c) 2011-2013 Xamarin Inc. (http://www.xamarin.com)
// Copyright (c) 2021 Microsoft Corp. (http://www.microsoft.com)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

using System;

namespace Xamarin.MacDev {
public struct AppleSdkVersion : IComparable<AppleSdkVersion>, IEquatable<AppleSdkVersion>, IAppleSdkVersion {
int [] version;

public AppleSdkVersion (Version version)
{
if (version == null)
throw new ArgumentNullException ();

if (version.Build != -1) {
this.version = new int [3];
this.version [2] = version.Build;
} else {
this.version = new int [2];
}

this.version [0] = version.Major;
this.version [1] = version.Minor;
}

public AppleSdkVersion (params int [] version)
{
if (version == null)
throw new ArgumentNullException (nameof (version));

this.version = version;
}

void IAppleSdkVersion.SetVersion (int [] version)
{
this.version = version;
}

public static AppleSdkVersion Parse (string s)
{
return IAppleSdkVersion_Extensions.Parse<AppleSdkVersion> (s);
}

public static bool TryParse (string s, out AppleSdkVersion result)
{
return IAppleSdkVersion_Extensions.TryParse (s, out result);
}

public int [] Version { get { return version; } }

public override string ToString ()
{
return IAppleSdkVersion_Extensions.ToString (this);
}

public int CompareTo (AppleSdkVersion other)
{
return IAppleSdkVersion_Extensions.CompareTo (this, other);
}

public int CompareTo (IAppleSdkVersion other)
{
return IAppleSdkVersion_Extensions.CompareTo (this, other);
}

public bool Equals (IAppleSdkVersion other)
{
return IAppleSdkVersion_Extensions.Equals (this, other);
}

public bool Equals (AppleSdkVersion other)
{
return IAppleSdkVersion_Extensions.Equals (this, other);
}

public override bool Equals (object obj)
{
return IAppleSdkVersion_Extensions.Equals (this, obj);
}

public override int GetHashCode ()
{
return IAppleSdkVersion_Extensions.GetHashCode (this);
}

public static bool operator == (AppleSdkVersion a, IAppleSdkVersion b)
{
return a.Equals (b);
}

public static bool operator != (AppleSdkVersion a, IAppleSdkVersion b)
{
return !a.Equals (b);
}

public static bool operator < (AppleSdkVersion a, IAppleSdkVersion b)
{
return a.CompareTo (b) < 0;
}

public static bool operator > (AppleSdkVersion a, IAppleSdkVersion b)
{
return a.CompareTo (b) > 0;
}

public static bool operator <= (AppleSdkVersion a, IAppleSdkVersion b)
{
return a.CompareTo (b) <= 0;
}

public static bool operator >= (AppleSdkVersion a, IAppleSdkVersion b)
{
return a.CompareTo (b) >= 0;
}

public bool IsUseDefault {
get { return version == null || version.Length == 0; }
}

IAppleSdkVersion IAppleSdkVersion.GetUseDefault ()
{
return UseDefault;
}

#if !WINDOWS
public AppleSdkVersion ResolveIfDefault (AppleSdk sdk, bool sim)
{
return IsUseDefault ? GetDefault (sdk, sim) : this;
}

public static AppleSdkVersion GetDefault (AppleSdk sdk, bool sim)
{
var v = sdk.GetInstalledSdkVersions (sim);
return v.Count > 0 ? v [v.Count - 1] : UseDefault;
}
#endif

public static readonly AppleSdkVersion UseDefault = new AppleSdkVersion (new int [0]);

public static readonly AppleSdkVersion V1_0 = new AppleSdkVersion (1, 0);
public static readonly AppleSdkVersion V2_0 = new AppleSdkVersion (2, 0);
public static readonly AppleSdkVersion V2_1 = new AppleSdkVersion (2, 1);
public static readonly AppleSdkVersion V2_2 = new AppleSdkVersion (2, 2);
public static readonly AppleSdkVersion V3_0 = new AppleSdkVersion (3, 0);
public static readonly AppleSdkVersion V3_1 = new AppleSdkVersion (3, 1);
public static readonly AppleSdkVersion V3_2 = new AppleSdkVersion (3, 2);
public static readonly AppleSdkVersion V3_99 = new AppleSdkVersion (3, 99);
public static readonly AppleSdkVersion V4_0 = new AppleSdkVersion (4, 0);
public static readonly AppleSdkVersion V4_1 = new AppleSdkVersion (4, 1);
public static readonly AppleSdkVersion V4_2 = new AppleSdkVersion (4, 2);
public static readonly AppleSdkVersion V4_3 = new AppleSdkVersion (4, 3);
public static readonly AppleSdkVersion V5_0 = new AppleSdkVersion (5, 0);
public static readonly AppleSdkVersion V5_1 = new AppleSdkVersion (5, 1);
public static readonly AppleSdkVersion V5_1_1 = new AppleSdkVersion (5, 1, 1);
public static readonly AppleSdkVersion V5_2 = new AppleSdkVersion (5, 2);
public static readonly AppleSdkVersion V6_0 = new AppleSdkVersion (6, 0);
public static readonly AppleSdkVersion V6_1 = new AppleSdkVersion (6, 1);
public static readonly AppleSdkVersion V6_2 = new AppleSdkVersion (6, 2);
public static readonly AppleSdkVersion V7_0 = new AppleSdkVersion (7, 0);
public static readonly AppleSdkVersion V7_1 = new AppleSdkVersion (7, 1);
public static readonly AppleSdkVersion V7_2_1 = new AppleSdkVersion (7, 2, 1);
public static readonly AppleSdkVersion V8_0 = new AppleSdkVersion (8, 0);
public static readonly AppleSdkVersion V8_1 = new AppleSdkVersion (8, 1);
public static readonly AppleSdkVersion V8_2 = new AppleSdkVersion (8, 2);
public static readonly AppleSdkVersion V8_3 = new AppleSdkVersion (8, 3);
public static readonly AppleSdkVersion V8_4 = new AppleSdkVersion (8, 4);
public static readonly AppleSdkVersion V9_0 = new AppleSdkVersion (9, 0);
public static readonly AppleSdkVersion V9_1 = new AppleSdkVersion (9, 1);
public static readonly AppleSdkVersion V9_2 = new AppleSdkVersion (9, 2);
public static readonly AppleSdkVersion V9_3 = new AppleSdkVersion (9, 3);
public static readonly AppleSdkVersion V10_0 = new AppleSdkVersion (10, 0);
public static readonly AppleSdkVersion V10_1 = new AppleSdkVersion (10, 1);
public static readonly AppleSdkVersion V10_2 = new AppleSdkVersion (10, 2);
public static readonly AppleSdkVersion V10_3 = new AppleSdkVersion (10, 3);
public static readonly AppleSdkVersion V10_4 = new AppleSdkVersion (10, 4);
public static readonly AppleSdkVersion V10_5 = new AppleSdkVersion (10, 5);
public static readonly AppleSdkVersion V10_6 = new AppleSdkVersion (10, 6);
public static readonly AppleSdkVersion V10_7 = new AppleSdkVersion (10, 7);
public static readonly AppleSdkVersion V10_8 = new AppleSdkVersion (10, 8);
public static readonly AppleSdkVersion V10_9 = new AppleSdkVersion (10, 9);
public static readonly AppleSdkVersion V10_10 = new AppleSdkVersion (10, 10);
public static readonly AppleSdkVersion V10_11 = new AppleSdkVersion (10, 11);
public static readonly AppleSdkVersion V10_12 = new AppleSdkVersion (10, 12);
public static readonly AppleSdkVersion V10_13 = new AppleSdkVersion (10, 13);
public static readonly AppleSdkVersion V10_14 = new AppleSdkVersion (10, 14);
public static readonly AppleSdkVersion V10_15 = new AppleSdkVersion (10, 15);
public static readonly AppleSdkVersion V11_0 = new AppleSdkVersion (11, 0);
}
}
Loading

0 comments on commit 02d6d05

Please # to comment.