[mtouch] Give BuildTasks enough information to determine if the task is up-to-date or not.

This commit is contained in:
Rolf Bjarne Kvinge 2017-01-25 16:38:24 +01:00
Родитель 1f7ce2e445
Коммит a52f18ec3b
5 изменённых файлов: 133 добавлений и 4 удалений

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

@ -40,6 +40,9 @@ namespace Xamarin.Bundler
public IEnumerable<BuildTask> NextTasks; public IEnumerable<BuildTask> NextTasks;
protected abstract void Execute (); protected abstract void Execute ();
// A list of input files (not a list of all the dependencies that would make this task rebuild).
public abstract IEnumerable<string> Inputs { get; }
public IEnumerable<BuildTask> Run () public IEnumerable<BuildTask> Run ()
{ {
@ -47,9 +50,21 @@ namespace Xamarin.Bundler
return NextTasks; return NextTasks;
} }
public virtual bool IsUptodate () public virtual bool IsUptodate {
{ get {
return false; return Application.IsUptodate (FileDependencies, Outputs);
}
} }
// A list of all the files that causes the task to rebuild.
// This should at least include all the 'Inputs', and potentially other files as well.
public virtual IEnumerable<string> FileDependencies {
get {
return Inputs;
}
}
// A list of files that this task outputs.
public abstract IEnumerable<string> Outputs { get; }
} }
} }

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

@ -299,5 +299,12 @@ namespace Xamarin.Utils
WriteArguments (args); WriteArguments (args);
return args.ToString (); return args.ToString ();
} }
public void PopulateInputs ()
{
var args = new StringBuilder ();
Inputs = new List<string> ();
WriteArguments (args);
}
} }
} }

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

@ -282,8 +282,10 @@ namespace Xamarin.Bundler {
return new BuildTask [] { new AOTTask () return new BuildTask [] { new AOTTask ()
{ {
Assembly = this,
AssemblyName = s, AssemblyName = s,
AddBitcodeMarkerSection = App.FastDev && App.EnableMarkerOnlyBitCode, AddBitcodeMarkerSection = App.FastDev && App.EnableMarkerOnlyBitCode,
AotOutputs = outputs,
AssemblyPath = asm, AssemblyPath = asm,
ProcessStartInfo = Driver.CreateStartInfo (App, aotCompiler, aotArgs, Path.GetDirectoryName (s)), ProcessStartInfo = Driver.CreateStartInfo (App, aotCompiler, aotArgs, Path.GetDirectoryName (s)),
NextTasks = nextTasks NextTasks = nextTasks

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

@ -88,13 +88,19 @@ namespace Xamarin.Bundler
public string MainM; public string MainM;
public IList<string> RegistrationMethods; public IList<string> RegistrationMethods;
public IEnumerable<string> Inputs { public override IEnumerable<string> Inputs {
get { get {
foreach (var asm in Target.Assemblies) foreach (var asm in Target.Assemblies)
yield return asm.FullPath; yield return asm.FullPath;
} }
} }
public override IEnumerable<string> Outputs {
get {
yield return MainM;
}
}
protected override void Execute () protected override void Execute ()
{ {
Driver.GenerateMain (Target.App, Target.Assemblies, Target.App.AssemblyName, Abi, MainM, RegistrationMethods); Driver.GenerateMain (Target.App, Target.Assemblies, Target.App.AssemblyName, Abi, MainM, RegistrationMethods);
@ -123,6 +129,20 @@ namespace Xamarin.Bundler
public string RegistrarM; public string RegistrarM;
public string RegistrarH; public string RegistrarH;
public override IEnumerable<string> Inputs {
get {
foreach (var asm in Target.Assemblies)
yield return asm.FullPath;
}
}
public override IEnumerable<string> Outputs {
get {
yield return RegistrarH;
yield return RegistrarM;
}
}
protected override void Execute () protected override void Execute ()
{ {
Target.StaticRegistrar.Generate (Target.Assemblies.Select ((a) => a.AssemblyDefinition), RegistrarH, RegistrarM); Target.StaticRegistrar.Generate (Target.Assemblies.Select ((a) => a.AssemblyDefinition), RegistrarH, RegistrarM);
@ -131,6 +151,16 @@ namespace Xamarin.Bundler
class CompileRegistrarTask : CompileTask class CompileRegistrarTask : CompileTask
{ {
public string RegistrarM;
public string RegistrarH;
public override IEnumerable<string> Inputs {
get {
yield return RegistrarH;
yield return RegistrarM;
}
}
protected override void CompilationFailed (int exitCode) protected override void CompilationFailed (int exitCode)
{ {
throw ErrorHelper.CreateError (4109, "Failed to compile the generated registrar code. Please file a bug report at http://bugzilla.xamarin.com"); throw ErrorHelper.CreateError (4109, "Failed to compile the generated registrar code. Please file a bug report at http://bugzilla.xamarin.com");
@ -139,9 +169,44 @@ namespace Xamarin.Bundler
public class AOTTask : ProcessTask public class AOTTask : ProcessTask
{ {
public Assembly Assembly;
public string AssemblyName; public string AssemblyName;
public bool AddBitcodeMarkerSection; public bool AddBitcodeMarkerSection;
public string AssemblyPath; // path to the .s file. public string AssemblyPath; // path to the .s file.
List<string> inputs;
public IEnumerable<string> AotOutputs;
public override IEnumerable<string> Outputs {
get {
return AotOutputs;
}
}
public override IEnumerable<string> Inputs {
get {
yield return Assembly.FullPath;
}
}
public override IEnumerable<string> FileDependencies {
get {
if (inputs == null) {
inputs = new List<string> ();
if (Assembly.HasDependencyMap)
inputs.AddRange (Assembly.DependencyMap);
inputs.Add (AssemblyName);
inputs.Add (Driver.GetAotCompiler (Assembly.App, Assembly.Target.Is64Build));
}
return inputs;
}
}
public override bool IsUptodate {
get {
// We can only check dependencies if we know the assemblies this assembly depend on (otherwise always rebuild).
return Assembly.HasDependencyMap && base.IsUptodate;
}
}
// executed with Parallel.ForEach // executed with Parallel.ForEach
protected override void Execute () protected override void Execute ()
@ -181,6 +246,19 @@ namespace Xamarin.Bundler
public string OutputFile; public string OutputFile;
public CompilerFlags CompilerFlags; public CompilerFlags CompilerFlags;
public override IEnumerable<string> Inputs {
get {
CompilerFlags.PopulateInputs ();
return CompilerFlags.Inputs;
}
}
public override IEnumerable<string> Outputs {
get {
yield return OutputFile;
}
}
protected override void Execute () protected override void Execute ()
{ {
// always show the native linker warnings since many of them turn out to be very important // always show the native linker warnings since many of them turn out to be very important
@ -245,6 +323,19 @@ namespace Xamarin.Bundler
public string InstallName; public string InstallName;
public string Language; public string Language;
public override IEnumerable<string> Inputs {
get {
CompilerFlags.PopulateInputs ();
return CompilerFlags.Inputs;
}
}
public override IEnumerable<string> Outputs {
get {
yield return OutputFile;
}
}
public bool IsAssembler { public bool IsAssembler {
get { get {
return Language == "assembler"; return Language == "assembler";
@ -414,6 +505,18 @@ namespace Xamarin.Bundler
public Abi Abi { get; set; } public Abi Abi { get; set; }
public Version DeploymentTarget { get; set; } public Version DeploymentTarget { get; set; }
public override IEnumerable<string> Inputs {
get {
yield return Input;
}
}
public override IEnumerable<string> Outputs {
get {
yield return OutputFile;
}
}
protected override void Execute () protected override void Execute ()
{ {
new BitcodeConverter (Input, OutputFile, Platform, Abi, DeploymentTarget).Convert (); new BitcodeConverter (Input, OutputFile, Platform, Abi, DeploymentTarget).Convert ();

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

@ -724,6 +724,8 @@ namespace Xamarin.Bundler
Abi = abi, Abi = abi,
InputFile = registrar_m, InputFile = registrar_m,
OutputFile = ofile, OutputFile = ofile,
RegistrarM = registrar_m,
RegistrarH = registrar_h,
SharedLibrary = false, SharedLibrary = false,
Language = "objective-c++", Language = "objective-c++",
}; };