[mtouch] Give BuildTasks enough information to determine if the task is up-to-date or not.
This commit is contained in:
Родитель
1f7ce2e445
Коммит
a52f18ec3b
|
@ -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++",
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче