Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(203)

Unified Diff: visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClLink.cs

Issue 11348050: [VS Addin] Add automatic nmf creation (Closed) Base URL: http://nativeclient-sdk.googlecode.com/svn/trunk/src
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 c623a931121318ec0e6ea81290c83aec2d678d5f..82a43bed8e31305a28210a0d8a93de2282e9d045 100644
--- a/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClLink.cs
+++ b/visual_studio/NativeClientVSAddIn/NaCl.Build.CPPTasks/NaClLink.cs
@@ -19,30 +19,42 @@ namespace NaCl.Build.CPPTasks
/// Property set only in PNaCl builds to signal that the translator
/// should be run post-link.
/// </summary>
- public string TranslateARM { get; set; }
+ public bool 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; }
+ public bool 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; }
+ public bool TranslateX64 { get; set; }
[Required]
- public string OutputCommandLine { get; set; }
+ public bool OutputCommandLine { get; set; }
+
+ [Required]
+ public bool CreateNMF { get; set; }
[Required]
public string NaClLinkerPath { get; set; }
[Required]
+ public string ProjectName { get; set; }
+
+ [Required]
+ public string ToolchainName { get; set; }
+
+ [Required]
public string Platform { get; set; }
[Required]
+ public string CreateNMFPath { get; set; }
+
+ [Required]
public virtual string OutputFile { get; set; }
[Required]
@@ -146,18 +158,26 @@ namespace NaCl.Build.CPPTasks
return responseFileCmds.ToString();
}
- private bool Translate(string arch)
+ private static string PexeToNexe(string pexe, 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));
+ string basename = Path.GetFileNameWithoutExtension(pexe) + "_" + arch + ".nexe";
+ return Path.Combine(Path.GetDirectoryName(pexe), basename);
+ }
- if (ExecuteTool(translateTool, commandLineCommands, string.Empty) != 0)
+ private bool Translate(string arch, string pnacl_arch=null)
+ {
+ if (pnacl_arch == null)
+ pnacl_arch = arch;
+ string outfile = PexeToNexe(OutputFile, arch);
+ string cmd = String.Format("-arch {0} \"{1}\" -o \"{2}\"",
+ pnacl_arch, OutputFile, outfile);
+
+ string dirname = Path.GetDirectoryName(GenerateFullPathToTool();
+ string translateTool = Path.Combine(dirname, "pnacl-translate.bat");
+ if (!OutputCommandLine)
+ Log.LogMessage("pnacl-translate {0}", Path.GetFileName(outfile));
+
+ if (ExecuteTool(translateTool, cmd, string.Empty) != 0)
{
return false;
}
@@ -165,9 +185,14 @@ namespace NaCl.Build.CPPTasks
return true;
}
+ private bool IsPNaCl()
+ {
+ return Platform.Equals("pnacl", StringComparison.OrdinalIgnoreCase);
+ }
+
public override bool Execute()
{
- if (Platform.Equals("pnacl", StringComparison.OrdinalIgnoreCase))
+ if (IsPNaCl())
{
if (!SDKUtilities.FindPython())
{
@@ -176,37 +201,99 @@ namespace NaCl.Build.CPPTasks
}
}
- bool returnResult = false;
+ xamlParser = new XamlParser(PropertiesFile);
+ if (!Setup())
+ return false;
- try
- {
- xamlParser = new XamlParser(PropertiesFile);
- if (!Setup())
- return false;
- returnResult = base.Execute();
+ if (!OutputCommandLine)
+ Log.LogMessage("Linking: {0}", Path.GetFileName(OutputFile));
- if (TranslateX64 == "true" && !Translate("x86_64"))
+ if (!base.Execute())
+ return false;
+
+ if (!PostLink())
+ return false;
+
+ return true;
+ }
+
+ protected bool PostLink()
+ {
+ if (IsPNaCl())
+ {
+ if (TranslateX64 && !Translate("64", "x86-64"))
return false;
- if (TranslateX86 == "true" && !Translate("i686"))
+ if (TranslateX86 && !Translate("32", "i686"))
return false;
- if (TranslateARM == "true" && !Translate("arm"))
+ if (TranslateARM && !Translate("arm"))
return false;
}
- finally
+
+ if (CreateNMF)
{
+ if (!GCCUtilities.FindPython())
+ {
+ Log.LogError("Automatic NMF creation requires python in your executable path.");
+ return false;
+ }
+
+ string outputRoot = ToolchainName;
+ if (IsPNaCl())
+ outputRoot = "PNaCl";
+
+ if (!Directory.Exists(outputRoot))
+ Directory.CreateDirectory(outputRoot);
+
+ string nmfPath = Path.Combine(outputRoot, Path.ChangeExtension(ProjectName, ".nmf"));
+ string cmd = "\"" + CreateNMFPath + "\" -o \"" + nmfPath + "\"";
+ cmd += " -t " + ToolchainName + " -s " + ToolchainName;
+
+ if (IsPNaCl())
+ {
+ if (!TranslateARM && !TranslateX64 && !TranslateX86)
+ // Don't run create_nmf unless we actaully produced a nexe file.
+ return true;
+
+ foreach (var arch in new string []{ "arm", "32", "64" })
+ {
+ string nexe = PexeToNexe(OutputFile, arch);
+ if (File.Exists(nexe))
+ cmd += " \"" + nexe + "\"";
+ }
+ }
+ else
+ {
+ if (ToolchainName == "glibc")
+ {
+ string bindir = Path.GetDirectoryName(NaClLinkerPath);
+ string tcroot = Path.GetDirectoryName(bindir);
+ cmd += " -D \"" + Path.Combine(bindir, "x86_64-nacl-objdump.exe") + "\"";
+ cmd += " -L \"" + Path.Combine(tcroot, "x86_64-nacl", "lib") + "\"";
+ cmd += " -L \"" + Path.Combine(tcroot, "x86_64-nacl", "lib32") + "\"";
+ }
+ cmd += " \"" + OutputFile + "\"";
+ }
+
+ if (!OutputCommandLine)
+ Log.LogMessage("CreateNMF");
+
+ if (ExecuteTool("python", string.Empty, cmd) != 0)
+ {
+ return false;
+ }
}
- return returnResult;
+ return true;
}
protected override int ExecuteTool(string pathToTool, string responseFileCommands, string commandLineCommands)
{
- if (OutputCommandLine == "true")
+ if (OutputCommandLine)
{
- Log.LogMessage(MessageImportance.High, pathToTool + " " + responseFileCommands);
+ Log.LogMessage(MessageImportance.High, pathToTool + " " + responseFileCommands + " " + commandLineCommands);
}
return base.ExecuteTool(pathToTool, responseFileCommands, commandLineCommands);

Powered by Google App Engine
This is Rietveld 408576698