[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;
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 ()
{
@ -47,9 +50,21 @@ namespace Xamarin.Bundler
return NextTasks;
}
public virtual bool IsUptodate ()
{
return false;
public virtual bool IsUptodate {
get {
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);
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 ()
{
Assembly = this,
AssemblyName = s,
AddBitcodeMarkerSection = App.FastDev && App.EnableMarkerOnlyBitCode,
AotOutputs = outputs,
AssemblyPath = asm,
ProcessStartInfo = Driver.CreateStartInfo (App, aotCompiler, aotArgs, Path.GetDirectoryName (s)),
NextTasks = nextTasks

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

@ -88,13 +88,19 @@ namespace Xamarin.Bundler
public string MainM;
public IList<string> RegistrationMethods;
public IEnumerable<string> Inputs {
public override IEnumerable<string> Inputs {
get {
foreach (var asm in Target.Assemblies)
yield return asm.FullPath;
}
}
public override IEnumerable<string> Outputs {
get {
yield return MainM;
}
}
protected override void Execute ()
{
Driver.GenerateMain (Target.App, Target.Assemblies, Target.App.AssemblyName, Abi, MainM, RegistrationMethods);
@ -123,6 +129,20 @@ namespace Xamarin.Bundler
public string RegistrarM;
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 ()
{
Target.StaticRegistrar.Generate (Target.Assemblies.Select ((a) => a.AssemblyDefinition), RegistrarH, RegistrarM);
@ -131,6 +151,16 @@ namespace Xamarin.Bundler
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)
{
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 Assembly Assembly;
public string AssemblyName;
public bool AddBitcodeMarkerSection;
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
protected override void Execute ()
@ -181,6 +246,19 @@ namespace Xamarin.Bundler
public string OutputFile;
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 ()
{
// 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 Language;
public override IEnumerable<string> Inputs {
get {
CompilerFlags.PopulateInputs ();
return CompilerFlags.Inputs;
}
}
public override IEnumerable<string> Outputs {
get {
yield return OutputFile;
}
}
public bool IsAssembler {
get {
return Language == "assembler";
@ -414,6 +505,18 @@ namespace Xamarin.Bundler
public Abi Abi { 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 ()
{
new BitcodeConverter (Input, OutputFile, Platform, Abi, DeploymentTarget).Convert ();

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

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