| Index: visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClCompile.cs
|
| diff --git a/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClCompile.cs b/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClCompile.cs
|
| index fc9f9253986ce3861a7a1b6f4597b197c89fc98a..cb4da6604103f6a73e09cb5aa98298bcb7dafb47 100644
|
| --- a/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClCompile.cs
|
| +++ b/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClCompile.cs
|
| @@ -16,41 +16,27 @@ using System.Diagnostics;
|
|
|
| namespace NaCl.Build.CPPTasks
|
| {
|
| - public class NaClCompile : ToolTask
|
| + public class NaClCompile : NaClToolTask
|
| {
|
| - private XamlParser m_XamlParser;
|
| - private ITaskItem[] excludedInputPaths;
|
| - private ITaskItem[] tlogReadFiles;
|
| - private ITaskItem tlogCommandFile;
|
| - private ITaskItem[] tlogWriteFiles;
|
| - private CanonicalTrackedInputFiles trackedInputFiles;
|
| - private bool skippedExecution;
|
| - private ITaskItem[] compileSourceList;
|
| public bool BuildingInIDE { get; set; }
|
| - private string m_toolname;
|
| - private bool trackFileAccess;
|
| - private bool minimalRebuildFromTracking;
|
| - private string pathToLog;
|
|
|
| [Required]
|
| public string PropertiesFile { get; set; }
|
|
|
| [Required]
|
| - public ITaskItem[] Sources { get; set; }
|
| -
|
| - [Required]
|
| public string NaCLCompilerPath { get; set; }
|
|
|
| [Required]
|
| public bool OutputCommandLine { get; set; }
|
|
|
| + [Required]
|
| + public string Platform { get; set; }
|
| +
|
| public int ProcessorNumber { get; set; }
|
|
|
| public bool MultiProcessorCompilation { get; set; }
|
|
|
| - [Required]
|
| - public string TrackerLogDirectory { get; set; }
|
| -
|
| + [Obsolete]
|
| protected override StringDictionary EnvironmentOverride
|
| {
|
| get {
|
| @@ -63,12 +49,14 @@ namespace NaCl.Build.CPPTasks
|
| }
|
| }
|
|
|
| - protected override string GenerateFullPathToTool() { return ToolName; }
|
| + protected override string GenerateFullPathToTool()
|
| + {
|
| + return ToolName;
|
| + }
|
|
|
| public NaClCompile()
|
| : base(new ResourceManager("NaCl.Build.CPPTasks.Properties.Resources", Assembly.GetExecutingAssembly()))
|
| {
|
| - this.pathToLog = string.Empty;
|
| this.EnvironmentVariables = new string[] { "CYGWIN=nodosfilewarning", "LC_CTYPE=C" };
|
| }
|
|
|
| @@ -122,7 +110,7 @@ namespace NaCl.Build.CPPTasks
|
| return objectFilePath;
|
| }
|
|
|
| - private void ConstructReadTLog(ITaskItem[] compiledSources, CanonicalTrackedOutputFiles outputs)
|
| + protected override void OutputReadTLog(ITaskItem[] compiledSources, CanonicalTrackedOutputFiles outputs)
|
| {
|
| string trackerPath = Path.GetFullPath(TlogDirectory + ReadTLogFilenames[0]);
|
|
|
| @@ -186,7 +174,7 @@ namespace NaCl.Build.CPPTasks
|
| }
|
| }
|
|
|
| - private CanonicalTrackedOutputFiles OutputWriteTrackerLog(ITaskItem[] compiledSources)
|
| + protected override CanonicalTrackedOutputFiles OutputWriteTLog(ITaskItem[] compiledSources)
|
| {
|
| string path = Path.Combine(TlogDirectory, WriteTLogFilename);
|
| TaskItem item = new TaskItem(path);
|
| @@ -208,7 +196,7 @@ namespace NaCl.Build.CPPTasks
|
| return trackedFiles;
|
| }
|
|
|
| - private void OutputCommandTrackerLog(ITaskItem[] compiledSources)
|
| + protected override void OutputCommandTLog(ITaskItem[] compiledSources)
|
| {
|
| IDictionary<string, string> commandLines = GenerateCommandLinesFromTlog();
|
|
|
| @@ -248,9 +236,9 @@ namespace NaCl.Build.CPPTasks
|
| }
|
|
|
| //build command line from components and add required switches
|
| - string props = m_XamlParser.Parse(sourceFile, fullOutputName);
|
| + string props = xamlParser.Parse(sourceFile, fullOutputName);
|
| commandLine.Append(props);
|
| - commandLine.Append(" -MD -c ");
|
| + commandLine.Append(" -c ");
|
| }
|
|
|
| return commandLine.ToString();
|
| @@ -271,73 +259,34 @@ namespace NaCl.Build.CPPTasks
|
| return mergedSources.ToArray();
|
| }
|
|
|
| - protected bool ForcedRebuildRequired()
|
| + private int Compile(string pathToTool)
|
| {
|
| - string tlogCommandPath = null;
|
| -
|
| - try
|
| + if (Platform.Equals("pnacl", StringComparison.OrdinalIgnoreCase))
|
| {
|
| - 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;
|
| + if (!GCCUtilities.FindPython())
|
| + {
|
| + Log.LogError("PNaCl compilation requires python in your executable path.");
|
| + return -1;
|
| + }
|
| }
|
| - }
|
|
|
| - private int Compile(string pathToTool)
|
| - {
|
| // If multiprocess complication is enabled (not the VS default)
|
| // and the number of processors to use is not 1, then use the
|
| // compiler_wrapper python script to run multiple instances of
|
| // gcc
|
| if (MultiProcessorCompilation && ProcessorNumber != 1)
|
| {
|
| -
|
| - string envvar = (string)Registry.GetValue("HKEY_CURRENT_USER\\Environment", "PATH", "");
|
| - List<string> pathList = new List<string>(envvar.Split(';'));
|
| - envvar = (string)Registry.GetValue("HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\Environment", "PATH", "");
|
| - pathList.AddRange(new List<string>(envvar.Split(';')));
|
| - string pythonExe = null;
|
| - foreach (string path in pathList)
|
| - {
|
| - string testPath = Path.Combine(path, "python.bat");
|
| - if (File.Exists(testPath))
|
| - {
|
| - pythonExe = testPath;
|
| - break;
|
| - }
|
| - testPath = Path.Combine(path, "python.exe");
|
| - if (File.Exists(testPath))
|
| - {
|
| - pythonExe = testPath;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (pythonExe == null)
|
| + if (!GCCUtilities.FindPython())
|
| {
|
| - MessageBox.Show("Multi-processor Compilation with NaCl requires that python available in the PATH.\n" +
|
| - "Please disable Multi-processor Compilation in the project properties or add python " +
|
| - "to the your PATH\n" +
|
| + MessageBox.Show("Multi-processor Compilation with NaCl requires that python " +
|
| + "be available in the visual studio executable path.\n" +
|
| + "Please disable Multi-processor Compilation in the project " +
|
| + "properties or add python to the your executable path.\n" +
|
| "Falling back to serial compilation.\n");
|
| }
|
| else
|
| {
|
| - return CompileParallel(pathToTool, pythonExe);
|
| + return CompileParallel(pathToTool);
|
| }
|
| }
|
| return CompileSerial(pathToTool);
|
| @@ -346,7 +295,6 @@ namespace NaCl.Build.CPPTasks
|
| private int CompileSerial(string pathToTool)
|
| {
|
| int returnCode = 0;
|
| -
|
| foreach (ITaskItem sourceItem in CompileSourceList)
|
| {
|
| try
|
| @@ -364,7 +312,6 @@ namespace NaCl.Build.CPPTasks
|
| base.Log.LogMessage(Path.GetFileName(sourceItem.ToString()));
|
| }
|
|
|
| -
|
| // compile
|
| returnCode = base.ExecuteTool(pathToTool, commandLine, string.Empty);
|
| }
|
| @@ -382,7 +329,7 @@ namespace NaCl.Build.CPPTasks
|
| return returnCode;
|
| }
|
|
|
| - private int CompileParallel(string pathToTool, string pythonExe)
|
| + private int CompileParallel(string pathToTool)
|
| {
|
| int returnCode = 0;
|
|
|
| @@ -421,7 +368,7 @@ namespace NaCl.Build.CPPTasks
|
| try
|
| {
|
| // compile this group of sources
|
| - returnCode = base.ExecuteTool(pythonExe, cmd, "\"" + pythonScript + "\"");
|
| + returnCode = base.ExecuteTool("python", cmd, "\"" + pythonScript + "\"");
|
| }
|
| catch (Exception e)
|
| {
|
| @@ -459,55 +406,43 @@ namespace NaCl.Build.CPPTasks
|
| return returnCode;
|
| }
|
|
|
| - protected override bool SkipTaskExecution()
|
| - {
|
| - return this.skippedExecution;
|
| - }
|
| -
|
| protected void CalcSourcesToCompile()
|
| {
|
| - if (this.TrackFileAccess || this.MinimalRebuildFromTracking)
|
| - {
|
| - this.SetTrackerLogPaths();
|
| - }
|
| -
|
| //check if full recompile is required otherwise perform incremental
|
| if (this.ForcedRebuildRequired() || this.MinimalRebuildFromTracking == false)
|
| {
|
| this.CompileSourceList = this.Sources;
|
| - if (this.CompileSourceList == null || this.CompileSourceList.Length == 0)
|
| - {
|
| - this.SkippedExecution = true;
|
| - }
|
| + return;
|
| }
|
| - else
|
| - {
|
| - //retrieve list of sources out of date due to command line changes
|
| - List<ITaskItem> outOfDateSourcesFromCommandLineChanges = this.GetOutOfDateSourcesFromCommandLineChanges();
|
|
|
| - //retrieve sources out of date due to tracking
|
| - CanonicalTrackedOutputFiles trackedOutputFiles = new CanonicalTrackedOutputFiles(this, this.TLogWriteFiles);
|
| - this.TrackedInputFiles = new CanonicalTrackedInputFiles(this, this.TLogReadFiles, this.Sources, this.ExcludedInputPaths, trackedOutputFiles, true, false);
|
| - ITaskItem[] outOfDateSourcesFromTracking = this.TrackedInputFiles.ComputeSourcesNeedingCompilation();
|
| + //retrieve list of sources out of date due to command line changes
|
| + List<ITaskItem> outOfDateSourcesFromCommandLine = GetOutOfDateSourcesFromCmdLineChanges();
|
|
|
| - //merge out of date lists
|
| - this.CompileSourceList = this.MergeOutOfDateSources(outOfDateSourcesFromTracking, outOfDateSourcesFromCommandLineChanges);
|
| + //retrieve sources out of date due to tracking
|
| + CanonicalTrackedOutputFiles trackedOutputFiles = new CanonicalTrackedOutputFiles(this, this.TLogWriteFiles);
|
| + this.TrackedInputFiles = new CanonicalTrackedInputFiles(this,
|
| + this.TLogReadFiles,
|
| + this.Sources,
|
| + this.ExcludedInputPaths,
|
| + trackedOutputFiles,
|
| + true,
|
| + false);
|
| + ITaskItem[] outOfDateSourcesFromTracking = this.TrackedInputFiles.ComputeSourcesNeedingCompilation();
|
|
|
| - if (this.CompileSourceList.Length == 0)
|
| - {
|
| - this.SkippedExecution = true;
|
| - }
|
| - else
|
| - {
|
| - //remove sources to compile from tracked file list
|
| - this.TrackedInputFiles.RemoveEntriesForSource(this.CompileSourceList);
|
| - trackedOutputFiles.RemoveEntriesForSource(this.CompileSourceList);
|
| - this.TrackedInputFiles.SaveTlog();
|
| - trackedOutputFiles.SaveTlog();
|
| + //merge out of date lists
|
| + CompileSourceList = MergeOutOfDateSources(outOfDateSourcesFromTracking, outOfDateSourcesFromCommandLine);
|
|
|
| - this.SkippedExecution = false;
|
| - }
|
| + if (this.CompileSourceList.Length == 0)
|
| + {
|
| + this.SkippedExecution = true;
|
| + return;
|
| }
|
| +
|
| + //remove sources to compile from tracked file list
|
| + this.TrackedInputFiles.RemoveEntriesForSource(this.CompileSourceList);
|
| + trackedOutputFiles.RemoveEntriesForSource(this.CompileSourceList);
|
| + this.TrackedInputFiles.SaveTlog();
|
| + trackedOutputFiles.SaveTlog();
|
| }
|
|
|
| protected bool SourceIsC(string sourceFilename)
|
| @@ -526,20 +461,11 @@ namespace NaCl.Build.CPPTasks
|
|
|
| try
|
| {
|
| - m_XamlParser = new XamlParser(PropertiesFile);
|
| - m_toolname = Path.GetFileNameWithoutExtension(ToolName);
|
| - ValidateParameters();
|
| + xamlParser = new XamlParser(PropertiesFile);
|
| + if (!Setup())
|
| + return false;
|
| CalcSourcesToCompile();
|
| -
|
| returnResult = base.Execute();
|
| -
|
| - // Update tracker log files if execution occurred
|
| - //if (this.skippedExecution == false)
|
| - {
|
| - CanonicalTrackedOutputFiles outputs = OutputWriteTrackerLog(CompileSourceList);
|
| - ConstructReadTLog(CompileSourceList, outputs);
|
| - OutputCommandTrackerLog(CompileSourceList);
|
| - }
|
| }
|
| finally
|
| {
|
| @@ -549,7 +475,7 @@ namespace NaCl.Build.CPPTasks
|
| return returnResult;
|
| }
|
|
|
| - protected List<ITaskItem> GetOutOfDateSourcesFromCommandLineChanges()
|
| + protected List<ITaskItem> GetOutOfDateSourcesFromCmdLineChanges()
|
| {
|
| //get dictionary of source + command lines
|
| IDictionary<string, string> dictionary = this.GenerateCommandLinesFromTlog();
|
| @@ -581,169 +507,6 @@ namespace NaCl.Build.CPPTasks
|
| return outOfDateSources;
|
| }
|
|
|
| - 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);
|
| - }
|
| - }
|
| -
|
| -
|
| - //props
|
| - protected string CommandTLogFilename
|
| - {
|
| - get
|
| - {
|
| - return m_toolname + ".compile.command.1.tlog";
|
| - }
|
| - }
|
| -
|
| - protected string[] ReadTLogFilenames
|
| - {
|
| - get
|
| - {
|
| - return new string[] { m_toolname + ".compile.read.1.tlog" };
|
| - }
|
| - }
|
| -
|
| - [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[] ExcludedInputPaths
|
| - {
|
| - get
|
| - {
|
| - return this.excludedInputPaths;
|
| - }
|
| - set
|
| - {
|
| - this.excludedInputPaths = value;
|
| - }
|
| - }
|
| -
|
| -
|
| - public ITaskItem[] TLogWriteFiles
|
| - {
|
| - get
|
| - {
|
| - return this.tlogWriteFiles;
|
| - }
|
| - set
|
| - {
|
| - this.tlogWriteFiles = value;
|
| - }
|
| - }
|
| -
|
| - protected string WriteTLogFilename
|
| - {
|
| - get
|
| - {
|
| - return m_toolname + ".compile.write.1.tlog";
|
| - }
|
| - }
|
| -
|
| - public bool TrackFileAccess
|
| - {
|
| - get
|
| - {
|
| - return this.trackFileAccess;
|
| - }
|
| - set
|
| - {
|
| - this.trackFileAccess = value;
|
| - }
|
| - }
|
| -
|
| - protected CanonicalTrackedInputFiles TrackedInputFiles
|
| - {
|
| - get
|
| - {
|
| - return this.trackedInputFiles;
|
| - }
|
| - set
|
| - {
|
| - this.trackedInputFiles = value;
|
| - }
|
| - }
|
| -
|
| [Output]
|
| public ITaskItem[] CompileSourceList
|
| {
|
| @@ -765,12 +528,5 @@ namespace NaCl.Build.CPPTasks
|
| }
|
| }
|
|
|
| - protected override Encoding ResponseFileEncoding
|
| - {
|
| - get
|
| - {
|
| - return Encoding.ASCII;
|
| - }
|
| - }
|
| }
|
| }
|
|
|