Refactor static registrar to produce both a header and a source file.
This way we can re-use the header in other files.
This commit is contained in:
Родитель
3903e01076
Коммит
86c73f8fc0
|
@ -498,45 +498,53 @@ namespace XamCore.Registrar {
|
|||
}
|
||||
}
|
||||
|
||||
class StaticRegistrar : Registrar {
|
||||
bool is_simulator;
|
||||
bool? is_64_bits;
|
||||
public interface IStaticRegistrar
|
||||
{
|
||||
void Generate (IEnumerable<AssemblyDefinition> assemblies, string header_path, string source_path);
|
||||
void GenerateSingleAssembly (IEnumerable<AssemblyDefinition> assemblies, string header_path, string source_path, string assembly);
|
||||
Mono.Linker.LinkContext LinkContext { get; set; }
|
||||
}
|
||||
|
||||
class StaticRegistrar : Registrar, IStaticRegistrar {
|
||||
public Application App { get; private set; }
|
||||
public Target Target { get; private set; }
|
||||
public bool IsSingleAssembly { get { return !string.IsNullOrEmpty (single_assembly); } }
|
||||
|
||||
string single_assembly;
|
||||
IEnumerable<AssemblyDefinition> input_assemblies;
|
||||
Mono.Linker.LinkContext link_context;
|
||||
Dictionary<IMetadataTokenProvider, object> availability_annotations;
|
||||
|
||||
StaticRegistrar (Application app)
|
||||
public Mono.Linker.LinkContext LinkContext {
|
||||
get {
|
||||
return link_context;
|
||||
}
|
||||
set {
|
||||
link_context = value;
|
||||
availability_annotations = link_context?.Annotations.GetCustomAnnotations ("Availability");
|
||||
}
|
||||
}
|
||||
|
||||
void Init (Application app)
|
||||
{
|
||||
this.App = app;
|
||||
trace = !LaxMode && (app.RegistrarOptions & RegistrarOptions.Trace) == RegistrarOptions.Trace;
|
||||
}
|
||||
|
||||
public StaticRegistrar (Application app, IEnumerable<AssemblyDefinition> assemblies, bool is_simulator, string single_assembly = null)
|
||||
: this (app)
|
||||
public StaticRegistrar (Application app)
|
||||
{
|
||||
this.is_simulator = is_simulator;
|
||||
this.single_assembly = single_assembly;
|
||||
this.input_assemblies = assemblies;
|
||||
|
||||
foreach (var assembly in assemblies)
|
||||
RegisterAssembly (assembly);
|
||||
Init (app);
|
||||
}
|
||||
|
||||
public StaticRegistrar (Application app, IEnumerable<AssemblyDefinition> assemblies, bool is_simulator, bool is_64_bits, Mono.Linker.LinkContext link_context)
|
||||
: this (app)
|
||||
public StaticRegistrar (Target target)
|
||||
{
|
||||
this.is_simulator = is_simulator;
|
||||
this.is_64_bits = is_64_bits;
|
||||
this.input_assemblies = assemblies;
|
||||
|
||||
availability_annotations = link_context?.Annotations.GetCustomAnnotations ("Availability");
|
||||
|
||||
foreach (var assembly in assemblies)
|
||||
RegisterAssembly (assembly);
|
||||
Init (target.App);
|
||||
this.Target = target;
|
||||
}
|
||||
|
||||
protected override bool LaxMode {
|
||||
get {
|
||||
return !string.IsNullOrEmpty (single_assembly);
|
||||
return IsSingleAssembly;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -606,19 +614,27 @@ namespace XamCore.Registrar {
|
|||
return SharedStatic.TryGetAttributeImpl (method, "System.Runtime.CompilerServices", "ExtensionAttribute", out attrib);
|
||||
}
|
||||
|
||||
#if MTOUCH
|
||||
public bool IsSimulator {
|
||||
get { return App.IsSimulatorBuild; }
|
||||
}
|
||||
#endif
|
||||
|
||||
protected override bool IsSimulatorOrDesktop {
|
||||
get {
|
||||
#if MONOMAC
|
||||
return true;
|
||||
#else
|
||||
return is_simulator;
|
||||
return App.IsSimulatorBuild;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
protected override bool Is64Bits {
|
||||
get {
|
||||
return is_64_bits.Value;
|
||||
if (IsSingleAssembly)
|
||||
throw new InvalidOperationException ("Can't emit size-specific code in single assembly mode.");
|
||||
return Target.Is64Build;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1735,8 +1751,10 @@ namespace XamCore.Registrar {
|
|||
case "CoreAudioKit":
|
||||
// fatal error: 'CoreAudioKit/CoreAudioKit.h' file not found
|
||||
// radar filed with Apple - but that framework / header is not yet shipped with the iOS SDK simulator
|
||||
if (is_simulator)
|
||||
#if MTOUCH
|
||||
if (IsSimulator)
|
||||
return;
|
||||
#endif
|
||||
goto default;
|
||||
case "Metal":
|
||||
case "MetalKit":
|
||||
|
@ -1744,7 +1762,7 @@ namespace XamCore.Registrar {
|
|||
// #error Metal Simulator is currently unsupported
|
||||
// this framework is _officially_ not available on the simulator (in iOS8)
|
||||
#if !MONOMAC
|
||||
if (is_simulator)
|
||||
if (IsSimulator)
|
||||
return;
|
||||
#endif
|
||||
goto default;
|
||||
|
@ -3352,24 +3370,23 @@ namespace XamCore.Registrar {
|
|||
}
|
||||
}
|
||||
|
||||
#if MONOMAC
|
||||
public static string Generate (Application app, IEnumerable<AssemblyDefinition> list, bool is_64_bits, Mono.Linker.LinkContext link_context)
|
||||
public void GenerateSingleAssembly (IEnumerable<AssemblyDefinition> assemblies, string header_path, string source_path, string assembly)
|
||||
{
|
||||
return new StaticRegistrar (app, list, true, is_64_bits, link_context).Generate ();
|
||||
}
|
||||
#else
|
||||
public static string Generate (Application app, IEnumerable<AssemblyDefinition> list, bool simulator, bool is_64_bits, Mono.Linker.LinkContext link_context)
|
||||
{
|
||||
return new StaticRegistrar (app, list, simulator, is_64_bits, link_context).Generate ();
|
||||
single_assembly = assembly;
|
||||
Generate (assemblies, header_path, source_path);
|
||||
}
|
||||
|
||||
public static string Generate (Application app, IEnumerable<AssemblyDefinition> list, bool simulator, string single_assembly = null)
|
||||
public void Generate (IEnumerable<AssemblyDefinition> assemblies, string header_path, string source_path)
|
||||
{
|
||||
return new StaticRegistrar (app, list, simulator, single_assembly).Generate ();
|
||||
}
|
||||
#endif
|
||||
this.input_assemblies = assemblies;
|
||||
|
||||
public string Generate ()
|
||||
foreach (var assembly in assemblies)
|
||||
RegisterAssembly (assembly);
|
||||
|
||||
Generate (header_path, source_path);
|
||||
}
|
||||
|
||||
void Generate (string header_path, string source_path)
|
||||
{
|
||||
using (var sb = new AutoIndentStringBuilder ()) {
|
||||
using (var hdr = new AutoIndentStringBuilder ()) {
|
||||
|
@ -3391,6 +3408,8 @@ namespace XamCore.Registrar {
|
|||
declarations = decls;
|
||||
methods = mthds;
|
||||
|
||||
mthds.WriteLine ($"#include \"{Path.GetFileName (header_path)}\"");
|
||||
|
||||
Specialize (sb);
|
||||
|
||||
header = null;
|
||||
|
@ -3399,7 +3418,8 @@ namespace XamCore.Registrar {
|
|||
|
||||
FlushTrace ();
|
||||
|
||||
return hdr.ToString () + "\n" + decls.ToString () + "\n" + mthds.ToString () + "\n" + sb.ToString ();
|
||||
Driver.WriteIfDifferent (header_path, hdr.ToString () + "\n" + decls.ToString () + "\n");
|
||||
Driver.WriteIfDifferent (source_path, mthds.ToString () + "\n" + sb.ToString () + "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@ using Mono.Linker;
|
|||
using Xamarin.Linker;
|
||||
|
||||
using Xamarin.Utils;
|
||||
using XamCore.Registrar;
|
||||
|
||||
#if MONOTOUCH
|
||||
using MonoTouch;
|
||||
|
@ -36,11 +37,19 @@ namespace Xamarin.Bundler {
|
|||
public List<Assembly> Assemblies = new List<Assembly> ();
|
||||
|
||||
public PlatformLinkContext LinkContext;
|
||||
public LinkerOptions LinkerOptions;
|
||||
public PlatformResolver Resolver = new PlatformResolver ();
|
||||
|
||||
public HashSet<string> Frameworks = new HashSet<string> ();
|
||||
public HashSet<string> WeakFrameworks = new HashSet<string> ();
|
||||
|
||||
public IStaticRegistrar StaticRegistrar { get; set; }
|
||||
|
||||
#if MONOMAC
|
||||
public bool Is32Build { get { return !Driver.Is64Bit; } }
|
||||
public bool Is64Build { get { return Driver.Is64Bit; } }
|
||||
#endif
|
||||
|
||||
public Target (Application app)
|
||||
{
|
||||
this.App = app;
|
||||
|
|
|
@ -48,6 +48,7 @@ using Mono.Tuner;
|
|||
using MonoMac.Tuner;
|
||||
using Xamarin.Utils;
|
||||
using Xamarin.Linker;
|
||||
using XamCore.Registrar;
|
||||
using XamCore.ObjCRuntime;
|
||||
|
||||
namespace Xamarin.Bundler {
|
||||
|
@ -579,6 +580,8 @@ namespace Xamarin.Bundler {
|
|||
|
||||
ExtractNativeLinkInfo ();
|
||||
|
||||
BuildTarget.StaticRegistrar = new StaticRegistrar (BuildTarget);
|
||||
|
||||
if (!no_executable) {
|
||||
foreach (var nr in native_references) {
|
||||
if (!native_libs.ContainsKey (nr))
|
||||
|
@ -927,9 +930,10 @@ namespace Xamarin.Bundler {
|
|||
|
||||
SetSDKVersion ();
|
||||
if (registrar == RegistrarMode.Static) {
|
||||
var code = XamCore.Registrar.StaticRegistrar.Generate (App, BuildTarget.Resolver.ResolverCache.Values, Is64Bit, BuildTarget.LinkContext);
|
||||
registrarPath = Path.Combine (Cache.Location, "registrar.m");
|
||||
File.WriteAllText (registrarPath, code);
|
||||
var registrarH = Path.Combine (Cache.Location, "registrar.h");
|
||||
BuildTarget.StaticRegistrar.LinkContext = BuildTarget.LinkContext;
|
||||
BuildTarget.StaticRegistrar.Generate (BuildTarget.Resolver.ResolverCache.Values, registrarH, registrarPath);
|
||||
|
||||
var platform_assembly = BuildTarget.Resolver.ResolverCache.First ((v) => v.Value.Name.Name == XamCore.Registrar.Registrar.PlatformAssembly).Value;
|
||||
Frameworks.Gather (platform_assembly, BuildTarget.Frameworks, BuildTarget.WeakFrameworks);
|
||||
|
|
|
@ -3,6 +3,7 @@ SdkVersions.cs
|
|||
*.dylib
|
||||
*.dSYM
|
||||
*.registrar.*.m
|
||||
*.registrar.*.h
|
||||
simlauncher-sgen
|
||||
simlauncher32-sgen
|
||||
simlauncher64-sgen
|
||||
|
|
|
@ -7,6 +7,7 @@ using System.Linq;
|
|||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using MonoTouch.Tuner;
|
||||
|
||||
|
@ -539,8 +540,11 @@ namespace Xamarin.Bundler {
|
|||
}
|
||||
break;
|
||||
}
|
||||
var registrar = XamCore.Registrar.StaticRegistrar.Generate (this, resolvedAssemblies, simulator: true, single_assembly: Path.GetFileNameWithoutExtension (RootAssembly));
|
||||
Driver.WriteIfDifferent (registrar_m, registrar);
|
||||
|
||||
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 ()
|
||||
|
@ -878,6 +882,9 @@ namespace Xamarin.Bundler {
|
|||
Registrar = RegistrarMode.LegacyDynamic;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var target in Targets)
|
||||
target.SelectStaticRegistrar ();
|
||||
}
|
||||
|
||||
// Select all abi from the list matching the specified mask.
|
||||
|
@ -1539,6 +1546,24 @@ namespace Xamarin.Bundler {
|
|||
}
|
||||
}
|
||||
|
||||
public class BuildTasks : List<BuildTask>
|
||||
{
|
||||
static void Execute (BuildTask v)
|
||||
{
|
||||
var next = v.Execute ();
|
||||
if (next != null)
|
||||
Parallel.ForEach (next, new ParallelOptions () { MaxDegreeOfParallelism = Environment.ProcessorCount }, Execute);
|
||||
}
|
||||
|
||||
public void ExecuteInParallel ()
|
||||
{
|
||||
if (Count == 0)
|
||||
return;
|
||||
|
||||
Parallel.ForEach (this, new ParallelOptions () { MaxDegreeOfParallelism = Environment.ProcessorCount }, Execute);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class BuildTask
|
||||
{
|
||||
public IEnumerable<BuildTask> NextTasks;
|
||||
|
@ -1672,6 +1697,12 @@ namespace Xamarin.Bundler {
|
|||
}
|
||||
|
||||
internal class RegistrarTask : CompileTask {
|
||||
public static void Create (List<BuildTask> tasks, IEnumerable<Abi> abis, Target target, string ifile)
|
||||
{
|
||||
foreach (var abi in abis)
|
||||
Create (tasks, abi, target, ifile);
|
||||
}
|
||||
|
||||
public static void Create (List<BuildTask> tasks, Abi abi, Target target, string ifile)
|
||||
{
|
||||
var arch = abi.AsArchString ();
|
||||
|
|
|
@ -153,7 +153,7 @@ namespace Xamarin.Bundler {
|
|||
|
||||
IEnumerable<BuildTask> CreateCompileTasks (string s, string asm_infile, string llvm_infile, Abi abi)
|
||||
{
|
||||
var compile_tasks = new List<BuildTask> ();
|
||||
var compile_tasks = new BuildTasks ();
|
||||
if (asm_infile != null) {
|
||||
var task = CreateCompileTask (s, asm_infile, abi);
|
||||
if (task != null)
|
||||
|
@ -372,7 +372,7 @@ namespace Xamarin.Bundler {
|
|||
return symlink_failed;
|
||||
}
|
||||
|
||||
public void CreateCompilationTasks (List<BuildTask> tasks, string build_dir, IEnumerable<Abi> abis)
|
||||
public void CreateCompilationTasks (BuildTasks tasks, string build_dir, IEnumerable<Abi> abis)
|
||||
{
|
||||
var assembly = Path.Combine (build_dir, FileName);
|
||||
|
||||
|
|
|
@ -315,32 +315,32 @@ bin/Makefile/Mono.Cecil.dll: $(MONO_CECIL_DLL) | bin/Makefile
|
|||
bin/Makefile/Mono.Cecil.Mdb.dll: $(MONO_CECIL_MDB_DLL) | bin/Makefile
|
||||
$(Q) cp $<* $(dir $@)
|
||||
|
||||
%.registrar.ios.m: $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/%.dll $(LOCAL_MTOUCH)
|
||||
%.registrar.ios.m %.registrar.ios.h: $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.iOS/%.dll $(LOCAL_MTOUCH)
|
||||
$(Q_GEN) $(SYSTEM_MONO) --debug bin/Makefile/mtouch.exe --xamarin-framework-directory=$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX) -q --runregistrar:$(abspath $@) --sdkroot $(XCODE_DEVELOPER_ROOT) --sdk $(IOS_SDK_VERSION) $< --registrar:static --target-framework Xamarin.iOS,v1.0 --abi i386,x86_64
|
||||
$(Q) touch $@
|
||||
$(Q) touch $*.registrar.ios.m $*.registrar.ios.h
|
||||
|
||||
%.registrar.watchos.m: $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/%.dll $(LOCAL_MTOUCH)
|
||||
%.registrar.watchos.m %.registrar.watchos.h: $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.WatchOS/%.dll $(LOCAL_MTOUCH)
|
||||
$(Q_GEN) $(SYSTEM_MONO) --debug bin/Makefile/mtouch.exe --xamarin-framework-directory=$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX) -q --runregistrar:$(abspath $@) --sdkroot $(XCODE_DEVELOPER_ROOT) --sdk $(WATCH_SDK_VERSION) $< --registrar:static --target-framework Xamarin.WatchOS,1.0 --abi i386
|
||||
$(Q) touch $@
|
||||
$(Q) touch $*.registrar.watchos.m $*.registrar.watchos.h
|
||||
|
||||
%.registrar.tvos.m: $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/%.dll $(LOCAL_MTOUCH)
|
||||
%.registrar.tvos.m %.registrar.tvos.h: $(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/lib/mono/Xamarin.TVOS/%.dll $(LOCAL_MTOUCH)
|
||||
$(Q_GEN) $(SYSTEM_MONO) --debug bin/Makefile/mtouch.exe --xamarin-framework-directory=$(IOS_DESTDIR)/$(MONOTOUCH_PREFIX) -q --runregistrar:$(abspath $@) --sdkroot $(XCODE_DEVELOPER_ROOT) --sdk $(TVOS_SDK_VERSION) $< --registrar:static --target-framework Xamarin.TVOS,1.0 --abi x86_64
|
||||
$(Q) touch $@
|
||||
$(Q) touch $*.registrar.tvos.m $*.registrar.tvos.h
|
||||
|
||||
%.registrar.ios.a: %.registrar.ios.i386.a %.registrar.ios.x86_64.a
|
||||
$(Q_LIPO) $(DEVICE_BIN_PATH)/lipo -create -output $@ $^
|
||||
|
||||
%.registrar.ios.i386.a: %.registrar.ios.m
|
||||
$(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATOR86_CFLAGS) -x objective-c++ -o $@ -c $^ -Wall -I$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/SDKs/MonoTouch.iphonesimulator.sdk/usr/include
|
||||
%.registrar.ios.i386.a: %.registrar.ios.m %.registrar.ios.h
|
||||
$(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATOR86_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -I$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/SDKs/MonoTouch.iphonesimulator.sdk/usr/include
|
||||
|
||||
%.registrar.ios.x86_64.a: %.registrar.ios.m
|
||||
$(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATOR64_CFLAGS) -x objective-c++ -o $@ -c $^ -Wall -I$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/SDKs/MonoTouch.iphonesimulator.sdk/usr/include
|
||||
%.registrar.ios.x86_64.a: %.registrar.ios.m %.registrar.ios.h
|
||||
$(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATOR64_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -I$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/SDKs/MonoTouch.iphonesimulator.sdk/usr/include
|
||||
|
||||
%.registrar.watchos.a: %.registrar.watchos.m
|
||||
$(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATORWATCH_CFLAGS) -x objective-c++ -o $@ -c $^ -Wall -I$(IOS_DESTDIR)$(XAMARIN_WATCHSIMULATOR_SDK)/usr/include
|
||||
%.registrar.watchos.a: %.registrar.watchos.m %.registrar.watchos.h
|
||||
$(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATORWATCH_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -I$(IOS_DESTDIR)$(XAMARIN_WATCHSIMULATOR_SDK)/usr/include
|
||||
|
||||
%.registrar.tvos.a: %.registrar.tvos.m
|
||||
$(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATORTV_CFLAGS) -x objective-c++ -o $@ -c $^ -Wall -I$(IOS_DESTDIR)$(XAMARIN_TVSIMULATOR_SDK)/usr/include
|
||||
%.registrar.tvos.a: %.registrar.tvos.m %.registrar.tvos.h
|
||||
$(Q_CC) $(IOS_CC) -DDEBUG -g -gdwarf-2 $(SIMULATORTV_CFLAGS) -x objective-c++ -o $@ -c $< -Wall -I$(IOS_DESTDIR)$(XAMARIN_TVSIMULATOR_SDK)/usr/include
|
||||
|
||||
TARGETS = \
|
||||
$(IOS_DESTDIR)$(MONOTOUCH_PREFIX)/bin/mtouch \
|
||||
|
@ -423,6 +423,6 @@ 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 file,Xamarin.iOS MonoTouch.Dialog-1 MonoTouch.NUnitLite,$(file).registrar.ios.a $(file).registrar.ios.i386.a $(file).registrar.ios.x86_64.a $(file).registrar.ios.m)
|
||||
.SECONDARY: $(foreach file,Xamarin.WatchOS,$(file).registrar.watchos.a $(file).registrar.watchos.m)
|
||||
.SECONDARY: $(foreach file,Xamarin.TVOS MonoTouch.Dialog-1,$(file).registrar.tvos.a $(file).registrar.tvos.m)
|
||||
.SECONDARY: $(foreach file,Xamarin.iOS MonoTouch.Dialog-1 MonoTouch.NUnitLite,$(file).registrar.ios.a $(file).registrar.ios.i386.a $(file).registrar.ios.x86_64.a $(file).registrar.ios.m $(file).registrar.ios.h)
|
||||
.SECONDARY: $(foreach file,Xamarin.WatchOS,$(file).registrar.watchos.a $(file).registrar.watchos.m $(file).registrar.watchos.h)
|
||||
.SECONDARY: $(foreach file,Xamarin.TVOS MonoTouch.Dialog-1,$(file).registrar.tvos.a $(file).registrar.tvos.m $(file).registrar.tvos.h)
|
||||
|
|
|
@ -17,6 +17,7 @@ using Xamarin.Bundler;
|
|||
using XamCore.Registrar;
|
||||
using XamCore.ObjCRuntime;
|
||||
using Xamarin.Linker;
|
||||
using Mono.Linker;
|
||||
|
||||
namespace XamCore.Registrar {
|
||||
|
||||
|
@ -777,7 +778,7 @@ namespace XamCore.Registrar {
|
|||
}
|
||||
}
|
||||
|
||||
class OldStaticRegistrar {
|
||||
class OldStaticRegistrar : IStaticRegistrar {
|
||||
static StringBuilder headers = new StringBuilder ();
|
||||
static StringBuilder structs = new StringBuilder ();
|
||||
static bool verbose = false;
|
||||
|
@ -879,7 +880,12 @@ namespace XamCore.Registrar {
|
|||
static HashSet<string> trampoline_names = new HashSet<string> ();
|
||||
static HashSet<string> namespaces = new HashSet<string> ();
|
||||
static HashSet<string> structures = new HashSet<string> ();
|
||||
|
||||
|
||||
public LinkContext LinkContext {
|
||||
get { throw new NotImplementedException (); }
|
||||
set { throw new NotImplementedException (); }
|
||||
}
|
||||
|
||||
static void CheckNamespace (string ns)
|
||||
{
|
||||
if (!ns.StartsWith ("MonoTouch."))
|
||||
|
@ -1659,6 +1665,22 @@ namespace XamCore.Registrar {
|
|||
method.SpecializedTrampoline = name;
|
||||
}
|
||||
|
||||
public void GeneratePInvokeWrappers (List<MethodDefinition> marshal_exception_pinvokes, string header_path, string source_path)
|
||||
{
|
||||
throw new NotSupportedException ();
|
||||
}
|
||||
|
||||
public void GenerateSingleAssembly (IEnumerable<AssemblyDefinition> assemblies, string header_path, string source_path, string single_assembly)
|
||||
{
|
||||
throw new NotSupportedException ();
|
||||
}
|
||||
|
||||
public void Generate (IEnumerable<AssemblyDefinition> assemblies, string header_path, string source_path)
|
||||
{
|
||||
Driver.WriteIfDifferent (header_path, string.Empty);
|
||||
Driver.WriteIfDifferent (source_path, Generate (assemblies));
|
||||
}
|
||||
|
||||
public static string Generate (IEnumerable<AssemblyDefinition> assemblies)
|
||||
{
|
||||
var classes = TypeSystemDescriptor.Describe (assemblies);
|
||||
|
|
|
@ -16,6 +16,8 @@ using Xamarin.Linker;
|
|||
|
||||
using Xamarin.Utils;
|
||||
|
||||
using XamCore.Registrar;
|
||||
|
||||
namespace Xamarin.Bundler
|
||||
{
|
||||
public partial class Target {
|
||||
|
@ -46,6 +48,8 @@ namespace Xamarin.Bundler
|
|||
// If any assemblies were updated (only set to false if the linker is disabled and no assemblies were modified).
|
||||
bool any_assembly_updated = true;
|
||||
|
||||
BuildTasks compile_tasks = new BuildTasks ();
|
||||
|
||||
// If we didn't link the final executable because the existing binary is up-to-date.
|
||||
public bool cached_executable;
|
||||
|
||||
|
@ -113,7 +117,7 @@ namespace Xamarin.Bundler
|
|||
IEnumerable<AssemblyDefinition> GetAssemblies ()
|
||||
{
|
||||
if (App.LinkMode == LinkMode.None)
|
||||
return Resolver.GetAssemblies ();
|
||||
return ManifestResolver.GetAssemblies ();
|
||||
|
||||
List<AssemblyDefinition> assemblies = new List<AssemblyDefinition> ();
|
||||
if (LinkContext == null) {
|
||||
|
@ -352,7 +356,7 @@ namespace Xamarin.Bundler
|
|||
resolver.AddSearchDirectory (Resolver.RootDirectory);
|
||||
resolver.AddSearchDirectory (Resolver.FrameworkDirectory);
|
||||
|
||||
var options = new LinkerOptions {
|
||||
LinkerOptions = new LinkerOptions {
|
||||
MainAssembly = Resolver.Load (main),
|
||||
OutputDirectory = output_dir,
|
||||
LinkMode = App.LinkMode,
|
||||
|
@ -375,7 +379,7 @@ namespace Xamarin.Bundler
|
|||
RuntimeOptions = App.RuntimeOptions
|
||||
};
|
||||
|
||||
MonoTouch.Tuner.Linker.Process (options, out link_context, out assemblies);
|
||||
MonoTouch.Tuner.Linker.Process (LinkerOptions, out link_context, out assemblies);
|
||||
|
||||
// reset resolver
|
||||
foreach (var file in assemblies) {
|
||||
|
@ -621,22 +625,40 @@ namespace Xamarin.Bundler
|
|||
Frameworks.ExceptWith (WeakFrameworks);
|
||||
}
|
||||
|
||||
public void SelectStaticRegistrar ()
|
||||
{
|
||||
switch (App.Registrar) {
|
||||
case RegistrarMode.LegacyStatic:
|
||||
case RegistrarMode.Legacy:
|
||||
case RegistrarMode.LegacyDynamic:
|
||||
StaticRegistrar = new OldStaticRegistrar ();
|
||||
break;
|
||||
case RegistrarMode.Static:
|
||||
case RegistrarMode.Dynamic:
|
||||
case RegistrarMode.Default:
|
||||
StaticRegistrar = new StaticRegistrar (this)
|
||||
{
|
||||
LinkContext = LinkContext,
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void Compile ()
|
||||
{
|
||||
var tasks = new List<BuildTask> ();
|
||||
|
||||
// Compile the managed assemblies into object files or shared libraries
|
||||
if (App.IsDeviceBuild) {
|
||||
foreach (var a in Assemblies)
|
||||
a.CreateCompilationTasks (tasks, BuildDirectory, Abis);
|
||||
a.CreateCompilationTasks (compile_tasks, BuildDirectory, Abis);
|
||||
}
|
||||
|
||||
// The static registrar.
|
||||
List<string> registration_methods = null;
|
||||
if (App.Registrar == RegistrarMode.Static || App.Registrar == RegistrarMode.LegacyStatic) {
|
||||
var registrar_m = Path.Combine (ArchDirectory, "registrar.m");
|
||||
if (!Application.IsUptodate (Assemblies.Select (v => v.FullPath), new string[] { registrar_m })) {
|
||||
registrar_m = Driver.RunRegistrar (this, Assemblies, BuildDirectory, BuildDirectory, App.Registrar == RegistrarMode.LegacyStatic, Is64Build, registrar_m);
|
||||
var registrar_h = Path.Combine (ArchDirectory, "registrar.h");
|
||||
if (!Application.IsUptodate (Assemblies.Select (v => v.FullPath), new string[] { registrar_m, registrar_h })) {
|
||||
StaticRegistrar.Generate (Assemblies.Select ((a) => a.AssemblyDefinition), registrar_h, registrar_m);
|
||||
registration_methods = new List<string> ();
|
||||
registration_methods.Add ("xamarin_create_classes");
|
||||
Driver.Watch ("Registrar", 1);
|
||||
|
@ -644,8 +666,7 @@ namespace Xamarin.Bundler
|
|||
Driver.Log (3, "Target '{0}' is up-to-date.", registrar_m);
|
||||
}
|
||||
|
||||
foreach (var abi in Abis)
|
||||
RegistrarTask.Create (tasks, abi, this, registrar_m);
|
||||
RegistrarTask.Create (compile_tasks, Abis, this, registrar_m);
|
||||
}
|
||||
|
||||
if (App.Registrar == RegistrarMode.Dynamic && App.IsSimulatorBuild && App.LinkMode == LinkMode.None && App.IsUnified) {
|
||||
|
@ -698,19 +719,10 @@ namespace Xamarin.Bundler
|
|||
|
||||
// The main method.
|
||||
foreach (var abi in Abis)
|
||||
MainTask.Create (tasks, this, abi, Assemblies, App.AssemblyName, registration_methods);
|
||||
MainTask.Create (compile_tasks, this, abi, Assemblies, App.AssemblyName, registration_methods);
|
||||
|
||||
// Start compiling.
|
||||
if (tasks.Count > 0) {
|
||||
Action<BuildTask> action = null;
|
||||
action = (v) => {
|
||||
var next = v.Execute ();
|
||||
if (next != null)
|
||||
Parallel.ForEach (next, new ParallelOptions () { MaxDegreeOfParallelism = Environment.ProcessorCount }, action);
|
||||
};
|
||||
|
||||
Parallel.ForEach (tasks, new ParallelOptions () { MaxDegreeOfParallelism = Environment.ProcessorCount }, action);
|
||||
}
|
||||
compile_tasks.ExecuteInParallel ();
|
||||
|
||||
if (App.FastDev) {
|
||||
foreach (var a in Assemblies) {
|
||||
|
|
|
@ -1726,25 +1726,6 @@ namespace Xamarin.Bundler
|
|||
return false;
|
||||
}
|
||||
|
||||
public static string RunRegistrar (Target target, List<Assembly> assemblies, string assemblies_path, string output_dir, bool old, bool is_64_bits, string out_file = null)
|
||||
{
|
||||
const string registrar_file = "registrar.m";
|
||||
|
||||
var resolvedAssemblies = assemblies.Select (asm => asm.AssemblyDefinition);
|
||||
var output_file = out_file ?? Path.Combine (output_dir, registrar_file);
|
||||
var code = string.Empty;
|
||||
|
||||
if (old) {
|
||||
code = OldStaticRegistrar.Generate (resolvedAssemblies);
|
||||
} else {
|
||||
code = StaticRegistrar.Generate (app, resolvedAssemblies, target.App.IsSimulatorBuild, is_64_bits, target.LinkContext);
|
||||
}
|
||||
|
||||
WriteIfDifferent (output_file, code);
|
||||
|
||||
return output_file;
|
||||
}
|
||||
|
||||
struct timespec {
|
||||
public IntPtr tv_sec;
|
||||
public IntPtr tv_nsec;
|
||||
|
|
Загрузка…
Ссылка в новой задаче