diff --git a/tests/apitest/apitest.csproj b/tests/apitest/apitest.csproj index 0141d75d7e..2afff98198 100644 --- a/tests/apitest/apitest.csproj +++ b/tests/apitest/apitest.csproj @@ -123,6 +123,7 @@ + diff --git a/tests/apitest/src/ObjCRuntime/SimpleRegistrarTest.cs b/tests/apitest/src/ObjCRuntime/SimpleRegistrarTest.cs new file mode 100644 index 0000000000..c63aa58eb2 --- /dev/null +++ b/tests/apitest/src/ObjCRuntime/SimpleRegistrarTest.cs @@ -0,0 +1,65 @@ +using System; +using System.Runtime.InteropServices; +using NUnit.Framework; + +#if !XAMCORE_2_0 +using MonoMac.Foundation; +using MonoMac.ObjCRuntime; +#else +using Foundation; +using ObjCRuntime; + +#endif + +namespace Xamarin.Mac.Tests +{ + [Register ("RegistrarTestClass")] + class RegistrarTestClass : NSObject + { + public virtual string Value { + [Export ("value")] + get { + return "RegistrarTestClass"; + } + } + } + + [Register ("RegistrarTestDerivedClass")] + class RegistrarTestDerivedClass : RegistrarTestClass + { + public override string Value { + get { + return "RegistrarTestDerivedClass"; + } + } + } + + [TestFixture] + public class SimpleRegistrarTest + { + [DllImport ("/usr/lib/libobjc.dylib", EntryPoint = "objc_msgSend")] + public extern static IntPtr IntPtr_objc_msgSend (IntPtr receiver, IntPtr selector); + + [Test] + public void SimpleRegistrarSmokeTest () + { + RegistrarTestClass obj = new RegistrarTestClass (); + IntPtr receiver = obj.Handle; + + RegistrarTestDerivedClass derivedObj = new RegistrarTestDerivedClass (); + IntPtr derivedReceiver = derivedObj.Handle; + + Assert.AreEqual (Runtime.GetNSObject (IntPtr_objc_msgSend (receiver, Selector.GetHandle ("value"))), (NSString)"RegistrarTestClass"); + + Assert.AreEqual (Runtime.GetNSObject (IntPtr_objc_msgSend (derivedReceiver, Selector.GetHandle ("value"))), (NSString)"RegistrarTestDerivedClass"); + } + + [Test] + public void SimpleRegistrar_XamarinMacRegistered () + { + // __NSObject_Disposer is registered by src/Foundation/NSObject2.cs and should exist + // This will throw is for some reason it is not + Class c = new Class ("__NSObject_Disposer"); + } + } +} diff --git a/tools/common/Application.cs b/tools/common/Application.cs index 13ec6f793b..e9785c5080 100644 --- a/tools/common/Application.cs +++ b/tools/common/Application.cs @@ -11,6 +11,14 @@ using Xamarin.Utils; using XamCore.ObjCRuntime; +#if MONOTOUCH +using PlatformException = Xamarin.Bundler.MonoTouchException; +using PlatformResolver = MonoTouch.Tuner.MonoTouchResolver; +#else +using PlatformException = Xamarin.Bundler.MonoMacException; +using PlatformResolver = Xamarin.Bundler.MonoMacResolver; +#endif + namespace Xamarin.Bundler { [Flags] @@ -49,6 +57,8 @@ namespace Xamarin.Bundler { public MarshalObjectiveCExceptionMode MarshalObjectiveCExceptions; public MarshalManagedExceptionMode MarshalManagedExceptions; public bool IsDefaultMarshalManagedExceptionMode; + public string RootAssembly; + public string RegistrarOutputLibrary; public bool RequiresPInvokeWrappers { get { @@ -398,5 +408,46 @@ namespace Xamarin.Bundler { IsDefaultMarshalManagedExceptionMode = true; } } + + public void RunRegistrar () + { + // The static registrar. + if (Registrar != RegistrarMode.Static) + throw new PlatformException (67, "Invalid registrar: {0}", Registrar); // this is only called during our own build + + var registrar_m = RegistrarOutputLibrary; + + var resolvedAssemblies = new List (); + var resolver = new PlatformResolver () { + FrameworkDirectory = Driver.PlatformFrameworkDirectory, + RootDirectory = Path.GetDirectoryName (RootAssembly), + }; + + if (Driver.App.Platform == ApplePlatform.iOS || Driver.App.Platform == ApplePlatform.MacOSX) { + if (Driver.App.Is32Build) { + resolver.ArchDirectory = Driver.Arch32Directory; + } else { + resolver.ArchDirectory = Driver.Arch64Directory; + } + } + + var ps = new ReaderParameters (); + ps.AssemblyResolver = resolver; + resolvedAssemblies.Add (ps.AssemblyResolver.Resolve ("mscorlib")); + + var rootName = Path.GetFileNameWithoutExtension (RootAssembly); + if (rootName != Driver.ProductAssembly) + throw new PlatformException (66, "Invalid build registrar assembly: {0}", RootAssembly); + + resolvedAssemblies.Add (ps.AssemblyResolver.Resolve (rootName)); + Driver.Log (3, "Loaded {0}", resolvedAssemblies [resolvedAssemblies.Count - 1].MainModule.FileName); + +#if MONOTOUCH + BuildTarget = BuildTarget.Simulator; +#endif + + var registrar = new XamCore.Registrar.StaticRegistrar (this); + registrar.GenerateSingleAssembly (resolvedAssemblies, Path.ChangeExtension (registrar_m, "h"), registrar_m, Path.GetFileNameWithoutExtension (RootAssembly)); + } } } diff --git a/tools/common/StaticRegistrar.cs b/tools/common/StaticRegistrar.cs index 44cc5fedbb..29bdecc129 100644 --- a/tools/common/StaticRegistrar.cs +++ b/tools/common/StaticRegistrar.cs @@ -643,7 +643,7 @@ namespace XamCore.Registrar { protected override bool Is64Bits { get { if (IsSingleAssembly) - throw new InvalidOperationException ("Can't emit size-specific code in single assembly mode."); + return App.Is64Build; return Target.Is64Build; } } diff --git a/tools/mmp/.gitignore b/tools/mmp/.gitignore index 2f6aefc009..d1a4664618 100644 --- a/tools/mmp/.gitignore +++ b/tools/mmp/.gitignore @@ -1,2 +1,3 @@ mmp temp-dir-mmp +Xamarin.Mac.registrar.* diff --git a/tools/mmp/Application.cs b/tools/mmp/Application.cs index 5cf4189709..214dd52723 100644 --- a/tools/mmp/Application.cs +++ b/tools/mmp/Application.cs @@ -1,5 +1,7 @@ -namespace MonoMac { +namespace Xamarin.Bundler { public partial class Application { + public bool Is32Build => !Driver.Is64Bit; + public bool Is64Build => Driver.Is64Bit; } } diff --git a/tools/mmp/Makefile b/tools/mmp/Makefile index a044b24d89..65f0da6ff4 100644 --- a/tools/mmp/Makefile +++ b/tools/mmp/Makefile @@ -132,6 +132,8 @@ MMP_TARGETS = \ $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mmp/mmp.exe \ $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mmp/Mono.Cecil.dll \ $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mmp/Mono.Cecil.Mdb.dll \ + $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mmp/Xamarin.Mac.registrar.mobile.a \ + $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mmp/Xamarin.Mac.registrar.full.a \ MMP_DIRECTORIES = \ $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/bin \ @@ -150,9 +152,40 @@ $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mmp/Mono.Cecil.dll: $(MONO_CECIL_ $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mmp/Mono.Cecil.Mdb.dll: $(MONO_CECIL_MDB_DLL) | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mmp $(Q) cp $<* $(dir $@) +$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mmp/Xamarin.Mac.registrar.%.a: Xamarin.Mac.registrar.%.a | $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/mmp + $(Q) cp $<* $(dir $@) + $(MMP_DIRECTORIES): $(Q) mkdir -p $@ +GENERATE_PART_REGISTRAR = $(Q_GEN) $(SYSTEM_MONO) --debug mmp.exe --xamarin-framework-directory=$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR) -q --runregistrar:$(abspath $@) --sdkroot $(XCODE_DEVELOPER_ROOT) --sdk $(OSX_SDK_VERSION) $< --registrar:static + +Xamarin.Mac.registrar.mobile.i386.m: $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/i386/mobile/Xamarin.Mac.dll mmp.exe + $(GENERATE_PART_REGISTRAR) --target-framework Xamarin.Mac,v1.0 --arch=i386 + $(Q) touch Xamarin.Mac.registrar.mobile.i386.m Xamarin.Mac.registrar.mobile.i386.h + +Xamarin.Mac.registrar.mobile.x86_64.m: $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/x86_64/mobile/Xamarin.Mac.dll mmp.exe + $(GENERATE_PART_REGISTRAR) --target-framework Xamarin.Mac,v1.0 --arch=x86_64 + $(Q) touch Xamarin.Mac.registrar.mobile.x86_64.m Xamarin.Mac.registrar.mobile.x86_64.h + +Xamarin.Mac.registrar.full.i386.m: $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/i386/full/Xamarin.Mac.dll mmp.exe + $(GENERATE_PART_REGISTRAR) --target-framework 4.5 --arch=i386 --xamarin-full-framework --nolink + $(Q) touch Xamarin.Mac.registrar.full.i386.m Xamarin.Mac.registrar.full.i386.h + +Xamarin.Mac.registrar.full.x86_64.m: $(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/lib/x86_64/full/Xamarin.Mac.dll mmp.exe + $(GENERATE_PART_REGISTRAR) --target-framework 4.5 --arch=x86_64 --xamarin-full-framework --nolink + $(Q) touch Xamarin.Mac.registrar.full.x86_64.m Xamarin.Mac.registrar.full.x86_64.h + +Xamarin.Mac.registrar.%.i386.a: Xamarin.Mac.registrar.%.i386.m + $(Q_CC) xcrun -sdk macosx clang -DDEBUG -g -gdwarf-2 -x objective-c++ -o $@ -c -arch i386 $< -Wall -I$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/include -mmacosx-version-min=$(MIN_OSX_SDK_VERSION) + +Xamarin.Mac.registrar.%.x86_64.a: Xamarin.Mac.registrar.%.x86_64.m + $(Q_CC) xcrun -sdk macosx clang -DDEBUG -g -gdwarf-2 -x objective-c++ -o $@ -c -arch x86_64 $< -Wall -I$(MAC_DESTDIR)$(MAC_FRAMEWORK_CURRENT_DIR)/include -mmacosx-version-min=$(MIN_OSX_SDK_VERSION) -fobjc-runtime=macosx + +Xamarin.Mac.registrar.%.a: Xamarin.Mac.registrar.%.i386.a Xamarin.Mac.registrar.%.x86_64.a + $(Q_LIPO) $(DEVICE_BIN_PATH)/lipo -create -output $@ $^ + + ifdef INCLUDE_MAC install-local:: $(MMP_TARGETS) all-local:: $(MMP_TARGETS) @@ -163,7 +196,13 @@ clean-local:: rm -f mmp.stub.c mmp.helper.o rm -f output/* rm -f Mono.Touch.Common.dll* + rm -f Xamarin.Mac.registrar.* $(SYSTEM_XBUILD) /t:Clean /p:Configuration=$(CECIL_CONFIG) $(CECIL_PATH)/Mono.Cecil.csproj $(SYSTEM_XBUILD) /t:Clean /p:Configuration=$(CECIL_CONFIG) $(CECIL_PATH)/symbols/mdb/Mono.Cecil.Mdb.csproj include $(TOP)/mk/rules.mk + +# make will automatically consider files created in chained implicit rules as temporary files, and delete them afterwards +# marking those files as .SECONDARY will prevent that deletion. +.SECONDARY: $(foreach ext,h m a,Xamarin.Mac.registrar.mobile.i386.$(ext) Xamarin.Mac.registrar.mobile.x86_64.$(ext) Xamarin.Mac.registrar.full.i386.$(ext) Xamarin.Mac.registrar.full.x86_64.$(ext)) +.SECONDARY: Xamarin.Mac.registrar.mobile.a Xamarin.Mac.registrar.full.a diff --git a/tools/mmp/driver.cs b/tools/mmp/driver.cs index 7e4520c821..5f732bc8dc 100644 --- a/tools/mmp/driver.cs +++ b/tools/mmp/driver.cs @@ -58,6 +58,13 @@ namespace Xamarin.Bundler { Static, } + enum Action { + None, + Help, + Version, + RunRegistrar, + } + public static partial class Driver { internal static Application App = new Application (); static Target BuildTarget = new Target (App); @@ -68,10 +75,9 @@ namespace Xamarin.Bundler { static List native_references = new List (); static List native_libraries_copied_in = new List (); + static Action action; static string output_dir; static string app_name; - static bool show_help = false; - static bool show_version; static bool generate_plist; static RegistrarMode registrar = RegistrarMode.Default; static bool no_executable; @@ -135,6 +141,8 @@ namespace Xamarin.Bundler { public static bool IsUnified { get { return IsUnifiedFullSystemFramework || IsUnifiedMobile || IsUnifiedFullXamMacFramework; } } public static bool IsClassic { get { return !IsUnified; } } + public static bool UsesPartialRegistrar => IsUnified && (registrar == RegistrarMode.Dynamic || registrar == RegistrarMode.Default) && App.LinkMode == LinkMode.None; + public static bool Is64Bit { get { if (IsUnified && !arch_set) @@ -148,8 +156,58 @@ namespace Xamarin.Bundler { public static Version MinOSVersion { get { return minos; } } + public static string ProductAssembly => "Xamarin.Mac"; + public static string PlatformFrameworkDirectory { + get { + if (IsUnifiedMobile) + return Path.Combine (MMPDirectory, "lib", "mono", "Xamarin.Mac"); + else if (IsUnifiedFullXamMacFramework) + return Path.Combine (MMPDirectory, "lib", "mono", "4.5"); + throw new InvalidOperationException ("PlatformFrameworkDirectory when not Mobile or Full?"); + } + } + + public static string Arch32Directory { + get { + if (IsUnifiedMobile) + return Path.Combine (MMPDirectory, "lib", "i386", "mobile"); + else if (IsUnifiedFullXamMacFramework) + return Path.Combine (MMPDirectory, "lib", "i386", "full"); + throw new InvalidOperationException ("Arch32Directory when not Mobile or Full?"); + } + } + + public static string Arch64Directory { + get { + if (IsUnifiedMobile) + return Path.Combine (MMPDirectory, "lib", "x86_64", "mobile"); + else if (IsUnifiedFullXamMacFramework) + return Path.Combine (MMPDirectory, "lib", "x86_64", "full"); + throw new InvalidOperationException ("Arch64Directory when not Mobile or Full?"); + } + } + + static int watch_level; static Stopwatch watch; + + static string xm_framework_dir; + public static string MMPDirectory { + get { + if (xm_framework_dir == null) { + xm_framework_dir = Path.GetFullPath (GetFullPath () + "/../../.."); +#if DEV + // when launched from Xamarin Studio, mtouch is not in the final install location, + // so walk the directory hierarchy to find the root source directory. + while (!File.Exists (Path.Combine (xm_framework_dir, "Make.config"))) + xm_framework_dir = Path.GetDirectoryName (xm_framework_dir); + xm_framework_dir = Path.Combine (xm_framework_dir, "_mac-build", "Library", "Frameworks", "Xamarin.Mac.framework", "Versions", "Current"); +#endif + xm_framework_dir = Target.GetRealPath (xm_framework_dir); + } + return xm_framework_dir; + } + } static void Watch (string msg, int level) { @@ -179,8 +237,8 @@ namespace Xamarin.Bundler { static void Main2 (string [] args) { var os = new OptionSet () { - { "h|?|help", "Displays the help", v => show_help = true }, - { "version", "Output version information and exit.", v => show_version = true }, + { "h|?|help", "Displays the help", v => action = Action.Help }, + { "version", "Output version information and exit.", v => action = Action.Version }, { "f|force", "Forces the recompilation of code, regardless of timestamps", v=> Force = true }, { "cache=", "Specify the directory where temporary build files will be cached", v => Cache.Location = v }, { "a|assembly=", "Add an assembly to be processed", v => references.Add (v) }, @@ -290,6 +348,17 @@ namespace Xamarin.Bundler { { "allow-unsafe-gac-resolution", "Allow MSBuild to resolve from the System GAC", v => {} , true }, // Used in Xamarin.Mac.XM45.targets and must be ignored here. Hidden since it is a total hack. If you can use it, you don't need support { "disable-lldb-attach=", "Disable automatic lldb attach on crash", v => disable_lldb_attach = ParseBool (v, "disable-lldb-attach")}, { "machine-config=", "Custom machine.config file to copy into MonoBundle/mono/4.5/machine.config. Pass \"\" to copy in a valid \"empty\" config file.", v => machine_config_path = v }, + { "runregistrar:", "Runs the registrar on the input assembly and outputs a corresponding native library.", + v => { + action = Action.RunRegistrar; + App.RegistrarOutputLibrary = v; + }, + true /* this is an internal option */ + }, + { "xamarin-framework-directory=", "The framework directory", v => { xm_framework_dir = v; }, true }, + { "xamarin-full-framework", "Used with --target-framework=4.5 to select XM 4.5 Target Framework", v => { IsUnifiedFullXamMacFramework = true; } }, + { "xamarin-system-framework", "Used with --target-framework=4.5 to select XM 4.5 Target Framework", v => { IsUnifiedFullSystemFramework = true; } }, + }; AddSharedOptions (os); @@ -314,10 +383,10 @@ namespace Xamarin.Bundler { watch.Start (); } - if (show_help || (args.Length == 0)) { + if (action == Action.Help || (args.Length == 0)) { ShowHelp (os); return; - } else if (show_version) { + } else if (action == Action.Version) { Console.Write ("mmp {0}.{1}", Constants.Version, Constants.Revision); Console.WriteLine (); return; @@ -330,7 +399,10 @@ namespace Xamarin.Bundler { if (TargetFramework.Identifier == TargetFramework.Xamarin_Mac_2_0.Identifier) { IsUnifiedMobile = true; - } else { + } else if (!IsUnifiedFullXamMacFramework && !IsUnifiedFullSystemFramework) { + // This is a total hack. Instead of passing in an argument, we walk the refernces looking for + // the "right" Xamarin.Mac and assume you are doing something + // Skip it if xamarin-full-framework or xamarin-system-framework passed in foreach (var asm in references) { if (asm.EndsWith ("reference/full/Xamarin.Mac.dll", StringComparison.Ordinal)) { IsUnifiedFullSystemFramework = true; @@ -397,6 +469,9 @@ namespace Xamarin.Bundler { if (!IsUnifiedMobile && tls_provider != null) throw new MonoMacException (2011, true, "Selecting a TLS Provider is only supported in the Unified Mobile profile"); + + ValidateXcode (); + App.InitializeCommon (); Log ("Xamarin.Mac {0}{1}", Constants.Version, verbose > 0 ? "." + Constants.Revision : string.Empty); @@ -404,6 +479,12 @@ namespace Xamarin.Bundler { if (verbose > 0) Console.WriteLine ("Selected target framework: {0}; API: {1}", targetFramework, IsClassic ? "Classic" : "Unified"); + if (action == Action.RunRegistrar) { + App.RootAssembly = unprocessed [0]; + App.Registrar = RegistrarMode.Static; + App.RunRegistrar (); + return; + } try { Pack (unprocessed); } finally { @@ -459,6 +540,36 @@ namespace Xamarin.Bundler { } } + + static void ValidateXcode () + { + var plist_path = Path.Combine (Path.GetDirectoryName (DeveloperDirectory), "version.plist"); + if (xcode_version == null) { + if (File.Exists (plist_path)) { + bool nextElement = false; + XmlReaderSettings settings = new XmlReaderSettings (); + settings.DtdProcessing = DtdProcessing.Ignore; + using (XmlReader reader = XmlReader.Create (plist_path, settings)) { + while (reader.Read()) { + // We want the element after CFBundleShortVersionString + if (reader.NodeType == XmlNodeType.Element) { + if (reader.Name == "key") { + if (reader.ReadElementContentAsString() == "CFBundleShortVersionString") + nextElement = true; + } + if (nextElement && reader.Name == "string") { + nextElement = false; + xcode_version = new Version (reader.ReadElementContentAsString()); + } + } + } + } + } else { + throw ErrorHelper.CreateError (58, "The Xcode.app '{0}' is invalid (the file '{1}' does not exist).", Path.GetDirectoryName (Path.GetDirectoryName (DeveloperDirectory)), plist_path); + } + } + } + static void SetSDKVersion () { if (sdk_version != null) @@ -692,33 +803,6 @@ namespace Xamarin.Bundler { get { if (sdk_root == null) sdk_root = LocateXcode (); - - var plist_path = Path.Combine (Path.GetDirectoryName (sdk_root), "version.plist"); - if (xcode_version == null) { - if (File.Exists (plist_path)) { - bool nextElement = false; - XmlReaderSettings settings = new XmlReaderSettings (); - settings.DtdProcessing = DtdProcessing.Ignore; - using (XmlReader reader = XmlReader.Create (plist_path, settings)) { - while (reader.Read()) { - // We want the element after CFBundleShortVersionString - if (reader.NodeType == XmlNodeType.Element) { - if (reader.Name == "key") { - if (reader.ReadElementContentAsString() == "CFBundleShortVersionString") - nextElement = true; - } - if (nextElement && reader.Name == "string") { - nextElement = false; - xcode_version = new Version (reader.ReadElementContentAsString()); - } - } - } - } - } else { - throw ErrorHelper.CreateError (58, "The Xcode.app '{0}' is invalid (the file '{1}' does not exist).", Path.GetDirectoryName (Path.GetDirectoryName (sdk_root)), plist_path); - } - - } return sdk_root; } } @@ -905,10 +989,13 @@ namespace Xamarin.Bundler { sw.WriteLine ("#include "); sw.WriteLine ("#import "); sw.WriteLine ("#import "); // 10.7 wants this even if not needed on 10.9 + if (UsesPartialRegistrar) + sw.WriteLine ("extern int xamarin_create_classes_Xamarin_Mac ();"); sw.WriteLine (); sw.WriteLine (); sw.WriteLine (); sw.WriteLine ("extern \"C\" int xammac_setup ()"); + sw.WriteLine ("{"); if (custom_bundle_name != null) { sw.WriteLine ("extern NSString* xamarin_custom_bundle_name;"); @@ -920,6 +1007,10 @@ namespace Xamarin.Bundler { if (disable_lldb_attach.HasValue ? disable_lldb_attach.Value : !App.EnableDebug) sw.WriteLine ("\txamarin_disable_lldb_attach = true;"); sw.WriteLine (); + + if (UsesPartialRegistrar) + sw.WriteLine ("\txamarin_create_classes_Xamarin_Mac ();"); + if (Driver.registrar == RegistrarMode.Static) sw.WriteLine ("\txamarin_create_classes ();"); @@ -1097,6 +1188,12 @@ namespace Xamarin.Bundler { args.Append ("-u _mono_profiler_startup_log -lz "); } } + + if (UsesPartialRegistrar) { + args.Append (Path.Combine (GetXamMacPrefix (), "lib", string.Format ("mmp/Xamarin.Mac.registrar.{0}.a ", IsUnifiedMobile ? "mobile" : "full"))); + args.Append ("-framework Quartz "); + } + args.Append ("-framework AppKit -liconv -x objective-c++ "); args.Append ("-I").Append (Quote (Path.Combine (GetXamMacPrefix (), "include"))).Append (' '); if (registrarPath != null) diff --git a/tools/mmp/resolver.cs b/tools/mmp/resolver.cs index 5ef69a6a58..b35e02868f 100644 --- a/tools/mmp/resolver.cs +++ b/tools/mmp/resolver.cs @@ -38,6 +38,8 @@ namespace Xamarin.Bundler { public string FrameworkDirectory { get; set; } public string RootDirectory { get; set; } + public string ArchDirectory { get; set; } + public List CommandLineAssemblies { get; set; } public List Exceptions = new List (); @@ -116,6 +118,12 @@ namespace Xamarin.Bundler { if (assembly != null) return assembly; } + + if (ArchDirectory != null) { + assembly = SearchDirectory (name, ArchDirectory); + if (assembly != null) + return assembly; + } assembly = SearchDirectory (name, FrameworkDirectory); if (assembly != null) diff --git a/tools/mtouch/Application.cs b/tools/mtouch/Application.cs index 8d915ba2ba..a1dc6ce392 100644 --- a/tools/mtouch/Application.cs +++ b/tools/mtouch/Application.cs @@ -86,7 +86,6 @@ namespace Xamarin.Bundler { public partial class Application { public string ExecutableName; - public string RootAssembly; public BuildTarget BuildTarget; public Version DeploymentTarget; @@ -108,7 +107,6 @@ namespace Xamarin.Bundler { public List Extensions = new List (); // A list of the extensions this app contains. public bool FastDev; - public string RegistrarOutputLibrary; public bool? EnablePie; public bool NativeStrip = true; @@ -503,45 +501,6 @@ namespace Xamarin.Bundler { return false; } - public void RunRegistrar () - { - // The static registrar. - if (Registrar != RegistrarMode.Static) - throw new MonoTouchException (67, "Invalid registrar: {0}", Registrar); // this is only called during our own build - - var registrar_m = RegistrarOutputLibrary; - - var resolvedAssemblies = new List (); - var resolver = new MonoTouchResolver () { - FrameworkDirectory = Driver.PlatformFrameworkDirectory, - RootDirectory = Path.GetDirectoryName (RootAssembly), - }; - - if (Driver.App.Platform == ApplePlatform.iOS) { - if (Driver.App.Is32Build) { - resolver.ArchDirectory = Driver.Arch32Directory; - } else { - resolver.ArchDirectory = Driver.Arch64Directory; - } - } - - var ps = new ReaderParameters (); - ps.AssemblyResolver = resolver; - resolvedAssemblies.Add (ps.AssemblyResolver.Resolve ("mscorlib")); - - var rootName = Path.GetFileNameWithoutExtension (RootAssembly); - if (rootName != Driver.ProductAssembly) - throw new MonoTouchException (66, "Invalid build registrar assembly: {0}", RootAssembly); - - resolvedAssemblies.Add (ps.AssemblyResolver.Resolve (rootName)); - Driver.Log (3, "Loaded {0}", resolvedAssemblies [resolvedAssemblies.Count - 1].MainModule.FileName); - - BuildTarget = BuildTarget.Simulator; - - var registrar = new XamCore.Registrar.StaticRegistrar (this); - registrar.GenerateSingleAssembly (resolvedAssemblies, Path.ChangeExtension (registrar_m, "h"), registrar_m, Path.GetFileNameWithoutExtension (RootAssembly)); - } - public void Build () { if (Driver.Force) {