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:
Rolf Bjarne Kvinge 2016-05-11 13:10:35 +02:00
Родитель 3903e01076
Коммит 86c73f8fc0
10 изменённых файлов: 186 добавлений и 106 удалений

Просмотреть файл

@ -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);

1
tools/mtouch/.gitignore поставляемый
Просмотреть файл

@ -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;