289 строки
7.0 KiB
C#
289 строки
7.0 KiB
C#
//
|
|
// BuiltinProfiles.cs
|
|
//
|
|
// Author:
|
|
// Aaron Bockover <abock@xamarin.com>
|
|
//
|
|
// Copyright 2015 Xamarin Inc. All rights reserved.
|
|
|
|
using System;
|
|
|
|
namespace Xamarin.Pmcs.Profiles
|
|
{
|
|
public static class BuiltinProfiles
|
|
{
|
|
public static Profile Get (string profileName)
|
|
{
|
|
switch (profileName) {
|
|
// Watch
|
|
case "watch":
|
|
return new WatchXamCore3 (ArchDefine.None);
|
|
case "watch-32":
|
|
return new WatchXamCore3 (ArchDefine.ARCH_32);
|
|
|
|
// TVOS
|
|
case "tvos":
|
|
return new WatchXamCore3 (ArchDefine.None);
|
|
case "tvos-64":
|
|
return new WatchXamCore3 (ArchDefine.ARCH_64);
|
|
|
|
// iOS
|
|
case "native":
|
|
return new IosXamCore2 (ArchDefine.None);
|
|
case "native-64":
|
|
return new IosXamCore2 (ArchDefine.ARCH_64);
|
|
case "native-32":
|
|
return new IosXamCore2 (ArchDefine.ARCH_32);
|
|
|
|
// Mac
|
|
case "mobile":
|
|
return new MacMobileFrameworkXamCore2 (ArchDefine.None);
|
|
case "mobile-64":
|
|
return new MacMobileFrameworkXamCore2 (ArchDefine.ARCH_64);
|
|
case "mobile-32":
|
|
return new MacMobileFrameworkXamCore2 (ArchDefine.ARCH_32);
|
|
case "full":
|
|
return new MacFullFrameworkXamCore2 (ArchDefine.None);
|
|
case "full-64":
|
|
return new MacFullFrameworkXamCore2 (ArchDefine.ARCH_64);
|
|
case "full-32":
|
|
return new MacFullFrameworkXamCore2 (ArchDefine.ARCH_32);
|
|
|
|
// Compat iOS/Mac
|
|
case "compat-ios":
|
|
return new CompatIos ();
|
|
case "compat-mac":
|
|
return new CompatMac ();
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public enum ArchDefine
|
|
{
|
|
None,
|
|
ARCH_32,
|
|
ARCH_64
|
|
}
|
|
|
|
abstract class XamCore3Common : XamCore2Common
|
|
{
|
|
protected XamCore3Common (ArchDefine arch) : base (arch)
|
|
{
|
|
CompilerOptions.Add ("-define:XAMCORE_3_0");
|
|
}
|
|
}
|
|
|
|
abstract class XamCore2Common : Profile
|
|
{
|
|
protected XamCore2Common (ArchDefine arch)
|
|
{
|
|
CompilerOptions.Add ("-define:XAMCORE_2_0");
|
|
CompilerOptions.Add ("-define:__UNIFIED__");
|
|
|
|
if (arch != ArchDefine.None)
|
|
CompilerOptions.Add ("-define:" + arch.ToString ());
|
|
|
|
IgnorePaths.Add ("Compat.mac.cs");
|
|
IgnorePaths.Add ("Compat.iOS.cs");
|
|
|
|
GlobalReplacements.Add (new Xamarin20Replacement ());
|
|
EnumBackingTypeReplacements.Add (new Xamarin20Replacement ());
|
|
}
|
|
}
|
|
|
|
sealed class WatchXamCore3 : XamCore3Common
|
|
{
|
|
public WatchXamCore3 (ArchDefine arch) : base (arch)
|
|
{
|
|
}
|
|
}
|
|
|
|
sealed class IosXamCore2 : XamCore2Common
|
|
{
|
|
public IosXamCore2 (ArchDefine arch) : base (arch)
|
|
{
|
|
}
|
|
}
|
|
|
|
sealed class MacMobileFrameworkXamCore2 : XamCore2Common
|
|
{
|
|
public MacMobileFrameworkXamCore2 (ArchDefine arch) : base (arch)
|
|
{
|
|
CompilerExecutable = "../builds/mcs-mac32";
|
|
|
|
CompilerOptions.Add ("-nostdlib");
|
|
CompilerOptions.Add ("-r:mscorlib");
|
|
CompilerOptions.Add ("-lib:../_mac-build/Library/Frameworks/Xamarin.Mac.framework/Versions/Current/lib/mono/Xamarin.Mac");
|
|
}
|
|
}
|
|
|
|
sealed class MacFullFrameworkXamCore2 : XamCore2Common
|
|
{
|
|
public MacFullFrameworkXamCore2 (ArchDefine arch) : base (arch)
|
|
{
|
|
CompilerOptions.Add ("-sdk:4.5");
|
|
CompilerOptions.Add ("-define:NO_SYSTEM_DRAWING");
|
|
CompilerOptions.Add ("-define:XAMMAC_SYSTEM_MONO");
|
|
}
|
|
}
|
|
|
|
sealed class CompatIos : Profile
|
|
{
|
|
public CompatIos ()
|
|
{
|
|
IgnorePaths.Add ("Compat.iOS.cs");
|
|
|
|
GlobalReplacements.Add (new XamarinCompatReplacement ("MonoTouch"));
|
|
EnumBackingTypeReplacements.Add (new XamarinCompatReplacement ("MonoTouch"));
|
|
}
|
|
}
|
|
|
|
sealed class CompatMac : Profile
|
|
{
|
|
public CompatMac ()
|
|
{
|
|
CompilerOptions.Add ("-sdk:4.0");
|
|
CompilerOptions.Add ("-define:ARCH_32");
|
|
CompilerOptions.Add ("-define:XAMMAC_SYSTEM_MONO");
|
|
|
|
IgnorePaths.Add ("Compat.mac.cs");
|
|
|
|
GlobalReplacements.Add (new XamarinCompatReplacement ("MonoMac"));
|
|
EnumBackingTypeReplacements.Add (new XamarinCompatReplacement ("MonoMac"));
|
|
}
|
|
}
|
|
|
|
class Xamarin20Replacement : ExplicitReplacement
|
|
{
|
|
protected override string Evaluate (string input)
|
|
{
|
|
if (Context == ReplacementContext.EnumBackingType) {
|
|
switch (input) {
|
|
case "nint":
|
|
return "long";
|
|
case "nuint":
|
|
return "ulong";
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
switch (input) {
|
|
case "uint_compat_int":
|
|
return "uint";
|
|
case "nuint_compat_int":
|
|
return "ulong";
|
|
case "nint_compat_int":
|
|
return "long";
|
|
case "NSAction":
|
|
return "global::System.Action";
|
|
case "XamCore":
|
|
return String.Empty;
|
|
}
|
|
|
|
if (input.StartsWith ("XamCore.", StringComparison.Ordinal))
|
|
return input.Substring (8);
|
|
else if (input.StartsWith ("global::XamCore.", StringComparison.Ordinal))
|
|
return "global::" + input.Substring (16);
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
class XamarinCompatReplacement : ExplicitReplacement
|
|
{
|
|
readonly string namespacePrefix;
|
|
readonly bool isMonoMac;
|
|
|
|
public XamarinCompatReplacement (string namespacePrefix)
|
|
{
|
|
if (namespacePrefix == null)
|
|
throw new ArgumentNullException ("namespaceprefix",
|
|
"provide an ns-prefix attribute in the profile XML element");
|
|
|
|
this.namespacePrefix = namespacePrefix;
|
|
isMonoMac = namespacePrefix == "MonoMac";
|
|
}
|
|
|
|
protected override string Evaluate (string input)
|
|
{
|
|
if (Context == ReplacementContext.EnumBackingType) {
|
|
switch (input) {
|
|
case "nint":
|
|
return "int";
|
|
case "nuint":
|
|
return "uint";
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
switch (input) {
|
|
case "nint":
|
|
case "uint_compat_int":
|
|
case "nuint_compat_int":
|
|
case "nint_compat_int":
|
|
return "int";
|
|
case "System.nint":
|
|
case "global::System.nint":
|
|
return "System.Int32";
|
|
case "nuint":
|
|
return "uint";
|
|
case "System.nuint":
|
|
case "global::System.nuint":
|
|
return "System.UInt32";
|
|
case "nfloat":
|
|
return "float";
|
|
case "System.nfloat":
|
|
case "global::System.nfloat":
|
|
return "System.Single";
|
|
case "nint.MaxValue":
|
|
return "int.MaxValue";
|
|
case "XamCore":
|
|
return namespacePrefix;
|
|
case "CGSize":
|
|
return "System.Drawing.SizeF";
|
|
case "CGPoint":
|
|
return "System.Drawing.PointF";
|
|
case "CGRect":
|
|
return "System.Drawing.RectangleF";
|
|
}
|
|
|
|
if (input.StartsWith ("XamCore.", StringComparison.Ordinal))
|
|
return namespacePrefix + input.Substring (7);
|
|
else if (input.StartsWith ("global::XamCore.", StringComparison.Ordinal))
|
|
return namespacePrefix + input.Substring (15);
|
|
else if (input.StartsWith ("CGSize.", StringComparison.Ordinal))
|
|
return "System.Drawing.SizeF" + input.Substring (6);
|
|
else if (input.StartsWith ("CGPoint.", StringComparison.Ordinal))
|
|
return "System.Drawing.PointF" + input.Substring (7);
|
|
else if (input.StartsWith ("CGRect.", StringComparison.Ordinal))
|
|
return "System.Drawing.RectangleF" + input.Substring (6);
|
|
|
|
if (!isMonoMac)
|
|
return null;
|
|
|
|
switch (input) {
|
|
case "OpenTK.Platform.MacOS":
|
|
case "OpenTK.Platform":
|
|
case "OpenTK.Graphics.OpenGL":
|
|
case "OpenTK.Graphics":
|
|
case "OpenTK":
|
|
return "MonoMac.OpenGL";
|
|
case "OpenTK.Audio.OpenAL":
|
|
case "OpenTK.Audio":
|
|
return "MonoMac.OpenAL";
|
|
}
|
|
|
|
if (input.StartsWith ("global::OpenTK.", StringComparison.Ordinal))
|
|
return "MonoMac.OpenGL" + input.Substring (14);
|
|
else if (input.StartsWith ("OpenTK.Graphics.", StringComparison.Ordinal))
|
|
return "MonoMac" + input.Substring (15);
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|