Index: visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClLink.cs |
diff --git a/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClLink.cs b/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClLink.cs |
index 768051e501fb8aa4a34cc26b42d35f66a75c243b..9bb5f067a73ad6cfcd3952c4ab991f05332693c2 100644 |
--- a/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClLink.cs |
+++ b/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClLink.cs |
@@ -6,16 +6,33 @@ using System.Reflection; |
using System.Text; |
using Microsoft.Build.Framework; |
using Microsoft.Build.CPPTasks; |
+using Microsoft.Build.Utilities; |
namespace NaCl.Build.CPPTasks |
{ |
- public class NaClLink : TrackedVCToolTask |
- { |
- private XamlParser m_XamlParser; |
- |
+ public class NaClLink : NaClToolTask |
+ { |
public bool BuildingInIDE { get; set; } |
+ /// <summary> |
+ /// Property set only in PNaCl builds to signal that the translator |
+ /// should be run post-link. |
+ /// </summary> |
+ public string TranslateARM { get; set; } |
+ |
+ /// <summary> |
+ /// Property set only in PNaCl builds to signal that the translator |
+ /// should be run post-link. |
+ /// </summary> |
+ public string TranslateX86 { get; set; } |
+ |
+ /// <summary> |
+ /// Property set only in PNaCl builds to signal that the translator |
+ /// should be run post-link. |
+ /// </summary> |
+ public string TranslateX64 { get; set; } |
+ |
[Required] |
public string OutputCommandLine { get; set; } |
@@ -23,51 +40,87 @@ namespace NaCl.Build.CPPTasks |
public string NaClLinkerPath { get; set; } |
[Required] |
- public virtual string OutputFile { get; set; } |
+ public string Platform { get; set; } |
[Required] |
- public string PropertiesFile { get; set; } |
+ public virtual string OutputFile { get; set; } |
[Required] |
- public virtual ITaskItem[] Sources { get; set; } |
+ public string PropertiesFile { get; set; } |
[Required] |
public string ConfigurationType { get; set; } |
- public NaClLink() |
- : base(new ResourceManager("NaCl.Build.CPPTasks.Properties.Resources", Assembly.GetExecutingAssembly())) |
+ protected override CanonicalTrackedOutputFiles OutputWriteTLog(ITaskItem[] inputs) |
{ |
- this.EnvironmentVariables = new string[] { "CYGWIN=nodosfilewarning", "LC_CTYPE=C" }; |
- } |
+ string path = Path.Combine(TlogDirectory, WriteTLogFilename); |
+ TaskItem item = new TaskItem(path); |
+ CanonicalTrackedOutputFiles trackedFiles = |
+ new CanonicalTrackedOutputFiles(new TaskItem[] { item }); |
- protected override string CommandTLogName |
- { |
- get |
+ foreach (ITaskItem sourceItem in Sources) |
{ |
- return "default.link.command.tlog"; |
+ //remove this entry associated with compiled source which is about to be recomputed |
+ trackedFiles.RemoveEntriesForSource(sourceItem); |
+ |
+ //add entry with updated information |
+ string upper = Path.GetFullPath(sourceItem.ItemSpec).ToUpperInvariant(); |
+ trackedFiles.AddComputedOutputForSourceRoot(upper, OutputFile); |
} |
+ |
+ //output tlog |
+ trackedFiles.SaveTlog(); |
+ |
+ return trackedFiles; |
} |
- protected override string[] ReadTLogNames |
+ protected override void OutputReadTLog(ITaskItem[] compiledSources, CanonicalTrackedOutputFiles outputs) |
{ |
- get |
+ string trackerPath = Path.GetFullPath(TlogDirectory + ReadTLogFilenames[0]); |
+ |
+ using (StreamWriter writer = new StreamWriter(trackerPath, false, Encoding.Unicode)) |
{ |
- return new string[] { |
- "default.link.read.tlog" |
- }; |
+ string sourcePath = ""; |
+ foreach (ITaskItem source in Sources) |
+ { |
+ if (sourcePath != "") |
+ sourcePath += "|"; |
+ sourcePath += Path.GetFullPath(source.ItemSpec).ToUpperInvariant(); |
+ } |
+ |
+ writer.WriteLine("^" + sourcePath); |
+ foreach (ITaskItem source in Sources) |
+ { |
+ writer.WriteLine(Path.GetFullPath(source.ItemSpec).ToUpperInvariant()); |
+ } |
+ writer.WriteLine(Path.GetFullPath(OutputFile).ToUpperInvariant()); |
} |
} |
- protected override string[] WriteTLogNames |
+ protected override void OutputCommandTLog(ITaskItem[] compiledSources) |
{ |
- get |
+ using (StreamWriter writer = new StreamWriter(TLogCommandFile.GetMetadata("FullPath"), false, Encoding.Unicode)) |
{ |
- return new string[] { |
- "default.link.write.tlog" |
- }; |
+ string cmds = GenerateResponseFileCommands(); |
+ string sourcePath = ""; |
+ foreach (ITaskItem source in Sources) |
+ { |
+ if (sourcePath != "") |
+ sourcePath += "|"; |
+ sourcePath += Path.GetFullPath(source.ItemSpec).ToUpperInvariant(); |
+ } |
+ |
+ writer.WriteLine("^" + sourcePath); |
+ writer.WriteLine(cmds); |
} |
} |
+ public NaClLink() |
+ : base(new ResourceManager("NaCl.Build.CPPTasks.Properties.Resources", Assembly.GetExecutingAssembly())) |
+ { |
+ this.EnvironmentVariables = new string[] { "CYGWIN=nodosfilewarning", "LC_CTYPE=C" }; |
+ } |
+ |
protected override void LogEventsFromTextOutput(string singleLine, MessageImportance messageImportance) |
{ |
base.LogEventsFromTextOutput(GCCUtilities.ConvertGCCOutput(singleLine), messageImportance); |
@@ -88,20 +141,58 @@ namespace NaCl.Build.CPPTasks |
} |
responseFileCmds.Append("-Wl,--end-group "); |
- responseFileCmds.Append(m_XamlParser.Parse(Sources[0], false)); |
+ responseFileCmds.Append(xamlParser.Parse(Sources[0], false)); |
return responseFileCmds.ToString(); |
} |
+ private bool Translate(string arch) |
+ { |
+ string nexeBase = Path.GetFileNameWithoutExtension(OutputFile) + "_" + arch + ".nexe"; |
+ string outfile = Path.Combine(Path.GetDirectoryName(OutputFile), nexeBase); |
+ |
+ string commandLineCommands = String.Format("-arch {0} \"{1}\" -o \"{2}\"", arch, OutputFile, outfile); |
+ |
+ string translateTool = Path.Combine(Path.GetDirectoryName(GenerateFullPathToTool()), "pnacl-translate.bat"); |
+ if (OutputCommandLine != "true") |
+ Log.LogMessage("pnacl-translate {0}", Path.GetFileName(nexeBase)); |
+ |
+ if (ExecuteTool(translateTool, commandLineCommands, string.Empty) != 0) |
+ { |
+ return false; |
+ } |
+ |
+ return true; |
+ } |
+ |
public override bool Execute() |
{ |
+ if (Platform.Equals("pnacl", StringComparison.OrdinalIgnoreCase)) |
+ { |
+ if (!GCCUtilities.FindPython()) |
+ { |
+ Log.LogError("PNaCl linking requires python in your executable path."); |
+ return false; |
+ } |
+ } |
+ |
bool returnResult = false; |
try |
{ |
- m_XamlParser = new XamlParser(PropertiesFile); |
- |
+ xamlParser = new XamlParser(PropertiesFile); |
+ if (!Setup()) |
+ return false; |
returnResult = base.Execute(); |
+ |
+ if (TranslateX64 == "true" && !Translate("x86_64")) |
+ return false; |
+ |
+ if (TranslateX86 == "true" && !Translate("i686")) |
+ return false; |
+ |
+ if (TranslateARM == "true" && !Translate("arm")) |
+ return false; |
} |
finally |
{ |
@@ -121,29 +212,11 @@ namespace NaCl.Build.CPPTasks |
return base.ExecuteTool(pathToTool, responseFileCommands, commandLineCommands); |
} |
- protected override void PostProcessSwitchList() |
- { |
- //skip default behavior |
- } |
- |
protected override string GenerateFullPathToTool() |
{ |
return this.ToolName; |
} |
- protected override string TrackerIntermediateDirectory |
- { |
- get |
- { |
- if (this.TrackerLogDirectory != null) |
- { |
- return this.TrackerLogDirectory; |
- } |
- |
- return string.Empty; |
- } |
- } |
- |
protected override Encoding ResponseFileEncoding |
{ |
get |
@@ -152,38 +225,37 @@ namespace NaCl.Build.CPPTasks |
} |
} |
- protected override ITaskItem[] TrackedInputFiles |
+ protected override string ToolName |
{ |
get |
{ |
- return this.Sources; |
+ return NaClLinkerPath; |
} |
} |
- protected override bool MaintainCompositeRootingMarkers |
+ protected override string CommandTLogFilename |
{ |
get |
{ |
- return true; |
+ return BaseTool() + ".link.command.1.tlog"; |
} |
- |
} |
- protected override string ToolName |
+ protected override string[] ReadTLogFilenames |
{ |
get |
{ |
- return NaClLinkerPath; |
+ return new string[] { BaseTool() + ".link.read.1.tlog" }; |
} |
} |
- public override bool AttributeFileTracking |
+ protected override string WriteTLogFilename |
{ |
get |
{ |
- return true; |
+ return BaseTool() + ".link.write.1.tlog"; |
} |
- } |
+ } |
public virtual string PlatformToolset |
{ |
@@ -193,8 +265,6 @@ namespace NaCl.Build.CPPTasks |
} |
set |
{} |
- } |
- |
- public string TrackerLogDirectory { get; set; } |
- } |
+ } |
+ } |
} |