| Index: visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClToolTask.cs
|
| diff --git a/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClToolTask.cs b/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClToolTask.cs
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8ce87c065f0d29da07198cc77de1f6676db753c3
|
| --- /dev/null
|
| +++ b/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClToolTask.cs
|
| @@ -0,0 +1,291 @@
|
| +/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +using System;
|
| +using System.Collections.Generic;
|
| +using System.Text;
|
| +using System.Collections;
|
| +using System.IO;
|
| +using System.Reflection;
|
| +using System.Resources;
|
| +using System.Windows.Forms;
|
| +using Microsoft.Build.Framework;
|
| +using Microsoft.Win32;
|
| +using Microsoft.Build.Utilities;
|
| +using System.Collections.Specialized;
|
| +
|
| +using System.Diagnostics;
|
| +
|
| +namespace NaCl.Build.CPPTasks
|
| +{
|
| + public abstract class NaClToolTask : ToolTask
|
| + {
|
| + protected NaClToolTask(ResourceManager taskResources) : base(taskResources) { }
|
| + protected ITaskItem[] excludedInputPaths;
|
| + private ITaskItem[] tlogReadFiles;
|
| + private ITaskItem tlogCommandFile;
|
| + private ITaskItem[] tlogWriteFiles;
|
| + private CanonicalTrackedInputFiles trackedInputFiles;
|
| + private bool skippedExecution;
|
| + private bool minimalRebuildFromTracking;
|
| + private bool trackFileAccess;
|
| + protected ITaskItem[] compileSourceList;
|
| + protected XamlParser xamlParser;
|
| +
|
| + protected abstract CanonicalTrackedOutputFiles OutputWriteTLog(ITaskItem[] compiledSources);
|
| + protected abstract void OutputReadTLog(ITaskItem[] compiledSources, CanonicalTrackedOutputFiles outputs);
|
| + protected abstract void OutputCommandTLog(ITaskItem[] compiledSources);
|
| +
|
| + [Required]
|
| + public string TrackerLogDirectory { get; set; }
|
| +
|
| + [Required]
|
| + public virtual ITaskItem[] Sources { get; set; }
|
| +
|
| + protected bool ForcedRebuildRequired()
|
| + {
|
| + string tlogCommandPath = null;
|
| +
|
| + try
|
| + {
|
| + tlogCommandPath = this.TLogCommandFile.GetMetadata("FullPath");
|
| + }
|
| + catch (Exception exception)
|
| + {
|
| + if (exception is InvalidOperationException || exception is NullReferenceException)
|
| + return true;
|
| + else
|
| + throw;
|
| + }
|
| +
|
| + //if command tlog file does not exist then force rebuild is required
|
| + if (File.Exists(tlogCommandPath) == false)
|
| + {
|
| + return true;
|
| + }
|
| + else
|
| + {
|
| + return false;
|
| + }
|
| + }
|
| +
|
| + protected override bool SkipTaskExecution()
|
| + {
|
| + return this.skippedExecution;
|
| + }
|
| +
|
| + protected string BaseTool()
|
| + {
|
| + return Path.GetFileNameWithoutExtension(ToolName);
|
| + }
|
| +
|
| + protected bool Setup()
|
| + {
|
| + this.SkippedExecution = false;
|
| +
|
| + if (!ValidateParameters())
|
| + {
|
| + return false;
|
| + }
|
| +
|
| + if (this.TrackFileAccess || this.MinimalRebuildFromTracking)
|
| + {
|
| + this.SetTrackerLogPaths();
|
| + }
|
| +
|
| + if (this.ForcedRebuildRequired() || this.MinimalRebuildFromTracking == false)
|
| + {
|
| + if (this.Sources == null || this.Sources.Length == 0)
|
| + {
|
| + this.SkippedExecution = true;
|
| + }
|
| + }
|
| +
|
| + return true;
|
| + }
|
| +
|
| + public override bool Execute()
|
| + {
|
| + bool returnResult = base.Execute();
|
| +
|
| + // Update tracker log files if execution occurred
|
| + //if (this.skippedExecution == false)
|
| + {
|
| + CanonicalTrackedOutputFiles outputs = OutputWriteTLog(compileSourceList);
|
| + OutputReadTLog(compileSourceList, outputs);
|
| + OutputCommandTLog(compileSourceList);
|
| + }
|
| +
|
| + return returnResult;
|
| + }
|
| +
|
| + protected override Encoding ResponseFileEncoding
|
| + {
|
| + get
|
| + {
|
| + return Encoding.ASCII;
|
| + }
|
| + }
|
| +
|
| + protected virtual void SetTrackerLogPaths()
|
| + {
|
| + if (this.TLogCommandFile == null)
|
| + {
|
| + string commandFile = Path.Combine(this.TlogDirectory, this.CommandTLogFilename);
|
| + this.TLogCommandFile = new TaskItem(commandFile);
|
| + }
|
| +
|
| + if (this.TLogReadFiles == null)
|
| + {
|
| + this.TLogReadFiles = new ITaskItem[this.ReadTLogFilenames.Length];
|
| + for (int n = 0; n < this.ReadTLogFilenames.Length; n++)
|
| + {
|
| + string readFile = Path.Combine(this.TlogDirectory, this.ReadTLogFilenames[n]);
|
| + this.TLogReadFiles[n] = new TaskItem(readFile);
|
| + }
|
| + }
|
| +
|
| + if (this.TLogWriteFiles == null)
|
| + {
|
| + this.TLogWriteFiles = new ITaskItem[1];
|
| + string writeFile = Path.Combine(this.TlogDirectory, this.WriteTLogFilename);
|
| + this.TLogWriteFiles[0] = new TaskItem(writeFile);
|
| + }
|
| + }
|
| +
|
| + [Output]
|
| + public bool SkippedExecution
|
| + {
|
| + get
|
| + {
|
| + return this.skippedExecution;
|
| + }
|
| + set
|
| + {
|
| + this.skippedExecution = value;
|
| + }
|
| + }
|
| +
|
| + public ITaskItem TLogCommandFile
|
| + {
|
| + get
|
| + {
|
| + return this.tlogCommandFile;
|
| + }
|
| + set
|
| + {
|
| + this.tlogCommandFile = value;
|
| + }
|
| + }
|
| +
|
| + protected string TlogDirectory
|
| + {
|
| + get
|
| + {
|
| + if (this.TrackerLogDirectory != null)
|
| + {
|
| + return this.TrackerLogDirectory;
|
| + }
|
| + return string.Empty;
|
| + }
|
| + }
|
| +
|
| + public bool MinimalRebuildFromTracking
|
| + {
|
| + get
|
| + {
|
| + return this.minimalRebuildFromTracking;
|
| + }
|
| + set
|
| + {
|
| + this.minimalRebuildFromTracking = value;
|
| + }
|
| + }
|
| +
|
| +
|
| + public ITaskItem[] TLogReadFiles
|
| + {
|
| + get
|
| + {
|
| + return this.tlogReadFiles;
|
| + }
|
| + set
|
| + {
|
| + this.tlogReadFiles = value;
|
| + }
|
| + }
|
| +
|
| + public ITaskItem[] TLogWriteFiles
|
| + {
|
| + get
|
| + {
|
| + return this.tlogWriteFiles;
|
| + }
|
| + set
|
| + {
|
| + this.tlogWriteFiles = value;
|
| + }
|
| + }
|
| +
|
| + public bool TrackFileAccess
|
| + {
|
| + get
|
| + {
|
| + return this.trackFileAccess;
|
| + }
|
| + set
|
| + {
|
| + this.trackFileAccess = value;
|
| + }
|
| + }
|
| +
|
| + protected CanonicalTrackedInputFiles TrackedInputFiles
|
| + {
|
| + get
|
| + {
|
| + return this.trackedInputFiles;
|
| + }
|
| + set
|
| + {
|
| + this.trackedInputFiles = value;
|
| + }
|
| + }
|
| +
|
| + public ITaskItem[] ExcludedInputPaths
|
| + {
|
| + get
|
| + {
|
| + return this.excludedInputPaths;
|
| + }
|
| + set
|
| + {
|
| + this.excludedInputPaths = value;
|
| + }
|
| + }
|
| +
|
| + protected virtual string CommandTLogFilename
|
| + {
|
| + get
|
| + {
|
| + return BaseTool() + ".compile.command.1.tlog";
|
| + }
|
| + }
|
| +
|
| + protected virtual string[] ReadTLogFilenames
|
| + {
|
| + get
|
| + {
|
| + return new string[] { BaseTool() + ".compile.read.1.tlog" };
|
| + }
|
| + }
|
| +
|
| + protected virtual string WriteTLogFilename
|
| + {
|
| + get
|
| + {
|
| + return BaseTool() + ".compile.write.1.tlog";
|
| + }
|
| + }
|
| + }
|
| +}
|
|
|