OLD | NEW |
1 | 1 |
2 using System; | 2 using System; |
3 using System.IO; | 3 using System.IO; |
4 using System.Resources; | 4 using System.Resources; |
5 using System.Reflection; | 5 using System.Reflection; |
6 using System.Text; | 6 using System.Text; |
7 using Microsoft.Build.Framework; | 7 using Microsoft.Build.Framework; |
8 using Microsoft.Build.CPPTasks; | 8 using Microsoft.Build.CPPTasks; |
9 using Microsoft.Build.Utilities; | 9 using Microsoft.Build.Utilities; |
10 | 10 |
11 | 11 |
12 namespace NaCl.Build.CPPTasks | 12 namespace NaCl.Build.CPPTasks |
13 { | 13 { |
14 public class NaClLink : NaClToolTask | 14 public class NaClLink : NaClToolTask |
15 { | 15 { |
16 public bool BuildingInIDE { get; set; } | 16 public bool BuildingInIDE { get; set; } |
17 | 17 |
18 /// <summary> | 18 /// <summary> |
19 /// Property set only in PNaCl builds to signal that the translator | 19 /// Property set only in PNaCl builds to signal that the translator |
20 /// should be run post-link. | 20 /// should be run post-link. |
21 /// </summary> | 21 /// </summary> |
22 public string TranslateARM { get; set; } | 22 public bool TranslateARM { get; set; } |
23 | 23 |
24 /// <summary> | 24 /// <summary> |
25 /// Property set only in PNaCl builds to signal that the translator | 25 /// Property set only in PNaCl builds to signal that the translator |
26 /// should be run post-link. | 26 /// should be run post-link. |
27 /// </summary> | 27 /// </summary> |
28 public string TranslateX86 { get; set; } | 28 public bool TranslateX86 { get; set; } |
29 | 29 |
30 /// <summary> | 30 /// <summary> |
31 /// Property set only in PNaCl builds to signal that the translator | 31 /// Property set only in PNaCl builds to signal that the translator |
32 /// should be run post-link. | 32 /// should be run post-link. |
33 /// </summary> | 33 /// </summary> |
34 public string TranslateX64 { get; set; } | 34 public bool TranslateX64 { get; set; } |
35 | 35 |
36 [Required] | 36 [Required] |
37 public string OutputCommandLine { get; set; } | 37 public bool OutputCommandLine { get; set; } |
| 38 |
| 39 [Required] |
| 40 public bool CreateNMF { get; set; } |
38 | 41 |
39 [Required] | 42 [Required] |
40 public string NaClLinkerPath { get; set; } | 43 public string NaClLinkerPath { get; set; } |
41 | 44 |
42 [Required] | 45 [Required] |
| 46 public string ProjectName { get; set; } |
| 47 |
| 48 [Required] |
| 49 public string ToolchainName { get; set; } |
| 50 |
| 51 [Required] |
43 public string Platform { get; set; } | 52 public string Platform { get; set; } |
44 | 53 |
45 [Required] | 54 [Required] |
| 55 public string CreateNMFPath { get; set; } |
| 56 |
| 57 [Required] |
46 public virtual string OutputFile { get; set; } | 58 public virtual string OutputFile { get; set; } |
47 | 59 |
48 [Required] | 60 [Required] |
49 public string PropertiesFile { get; set; } | 61 public string PropertiesFile { get; set; } |
50 | 62 |
51 [Required] | 63 [Required] |
52 public string ConfigurationType { get; set; } | 64 public string ConfigurationType { get; set; } |
53 | 65 |
54 protected override CanonicalTrackedOutputFiles OutputWriteTLog(ITaskItem
[] inputs) | 66 protected override CanonicalTrackedOutputFiles OutputWriteTLog(ITaskItem
[] inputs) |
55 { | 67 { |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 responseFileCmds.Append(GCCUtilities.ConvertPathWindowsToPosix(s
ourceFile.GetMetadata("Identity"))); | 151 responseFileCmds.Append(GCCUtilities.ConvertPathWindowsToPosix(s
ourceFile.GetMetadata("Identity"))); |
140 responseFileCmds.Append(" "); | 152 responseFileCmds.Append(" "); |
141 } | 153 } |
142 responseFileCmds.Append("-Wl,--end-group "); | 154 responseFileCmds.Append("-Wl,--end-group "); |
143 | 155 |
144 responseFileCmds.Append(xamlParser.Parse(Sources[0], false)); | 156 responseFileCmds.Append(xamlParser.Parse(Sources[0], false)); |
145 | 157 |
146 return responseFileCmds.ToString(); | 158 return responseFileCmds.ToString(); |
147 } | 159 } |
148 | 160 |
149 private bool Translate(string arch) | 161 private static string PexeToNexe(string pexe, string arch) |
150 { | 162 { |
151 string nexeBase = Path.GetFileNameWithoutExtension(OutputFile) + "_"
+ arch + ".nexe"; | 163 string basename = Path.GetFileNameWithoutExtension(pexe) + "_" + arc
h + ".nexe"; |
152 string outfile = Path.Combine(Path.GetDirectoryName(OutputFile), nex
eBase); | 164 return Path.Combine(Path.GetDirectoryName(pexe), basename); |
| 165 } |
153 | 166 |
154 string commandLineCommands = String.Format("-arch {0} \"{1}\" -o \"{
2}\"", arch, OutputFile, outfile); | 167 private bool Translate(string arch, string pnacl_arch=null) |
| 168 { |
| 169 if (pnacl_arch == null) |
| 170 pnacl_arch = arch; |
| 171 string outfile = PexeToNexe(OutputFile, arch); |
| 172 string cmd = String.Format("-arch {0} \"{1}\" -o \"{2}\"", |
| 173 pnacl_arch, OutputFile, outfile); |
155 | 174 |
156 string translateTool = Path.Combine(Path.GetDirectoryName(GenerateFu
llPathToTool()), "pnacl-translate.bat"); | 175 string dirname = Path.GetDirectoryName(GenerateFullPathToTool(); |
157 if (OutputCommandLine != "true") | 176 string translateTool = Path.Combine(dirname, "pnacl-translate.bat"); |
158 Log.LogMessage("pnacl-translate {0}", Path.GetFileName(nexeBase)
); | 177 if (!OutputCommandLine) |
| 178 Log.LogMessage("pnacl-translate {0}", Path.GetFileName(outfile))
; |
159 | 179 |
160 if (ExecuteTool(translateTool, commandLineCommands, string.Empty) !=
0) | 180 if (ExecuteTool(translateTool, cmd, string.Empty) != 0) |
161 { | 181 { |
162 return false; | 182 return false; |
163 } | 183 } |
164 | 184 |
165 return true; | 185 return true; |
166 } | 186 } |
167 | 187 |
| 188 private bool IsPNaCl() |
| 189 { |
| 190 return Platform.Equals("pnacl", StringComparison.OrdinalIgnoreCase); |
| 191 } |
| 192 |
168 public override bool Execute() | 193 public override bool Execute() |
169 { | 194 { |
170 if (Platform.Equals("pnacl", StringComparison.OrdinalIgnoreCase)) | 195 if (IsPNaCl()) |
171 { | 196 { |
172 if (!SDKUtilities.FindPython()) | 197 if (!SDKUtilities.FindPython()) |
173 { | 198 { |
174 Log.LogError("PNaCl linking requires python in your executab
le path."); | 199 Log.LogError("PNaCl linking requires python in your executab
le path."); |
175 return false; | 200 return false; |
176 } | 201 } |
177 } | 202 } |
178 | 203 |
179 bool returnResult = false; | 204 xamlParser = new XamlParser(PropertiesFile); |
| 205 if (!Setup()) |
| 206 return false; |
180 | 207 |
181 try | 208 if (!OutputCommandLine) |
| 209 Log.LogMessage("Linking: {0}", Path.GetFileName(OutputFile)); |
| 210 |
| 211 if (!base.Execute()) |
| 212 return false; |
| 213 |
| 214 if (!PostLink()) |
| 215 return false; |
| 216 |
| 217 return true; |
| 218 } |
| 219 |
| 220 protected bool PostLink() |
| 221 { |
| 222 if (IsPNaCl()) |
182 { | 223 { |
183 xamlParser = new XamlParser(PropertiesFile); | 224 if (TranslateX64 && !Translate("64", "x86-64")) |
184 if (!Setup()) | |
185 return false; | |
186 returnResult = base.Execute(); | |
187 | |
188 if (TranslateX64 == "true" && !Translate("x86_64")) | |
189 return false; | 225 return false; |
190 | 226 |
191 if (TranslateX86 == "true" && !Translate("i686")) | 227 if (TranslateX86 && !Translate("32", "i686")) |
192 return false; | 228 return false; |
193 | 229 |
194 if (TranslateARM == "true" && !Translate("arm")) | 230 if (TranslateARM && !Translate("arm")) |
195 return false; | 231 return false; |
196 } | 232 } |
197 finally | 233 |
| 234 if (CreateNMF) |
198 { | 235 { |
| 236 if (!GCCUtilities.FindPython()) |
| 237 { |
| 238 Log.LogError("Automatic NMF creation requires python in your
executable path."); |
| 239 return false; |
| 240 } |
199 | 241 |
| 242 string outputRoot = ToolchainName; |
| 243 if (IsPNaCl()) |
| 244 outputRoot = "PNaCl"; |
| 245 |
| 246 if (!Directory.Exists(outputRoot)) |
| 247 Directory.CreateDirectory(outputRoot); |
| 248 |
| 249 string nmfPath = Path.Combine(outputRoot, Path.ChangeExtension(P
rojectName, ".nmf")); |
| 250 |
| 251 string cmd = "\"" + CreateNMFPath + "\" -o \"" + nmfPath + "\""; |
| 252 cmd += " -t " + ToolchainName + " -s " + ToolchainName; |
| 253 |
| 254 if (IsPNaCl()) |
| 255 { |
| 256 if (!TranslateARM && !TranslateX64 && !TranslateX86) |
| 257 // Don't run create_nmf unless we actaully produced a ne
xe file. |
| 258 return true; |
| 259 |
| 260 foreach (var arch in new string []{ "arm", "32", "64" }) |
| 261 { |
| 262 string nexe = PexeToNexe(OutputFile, arch); |
| 263 if (File.Exists(nexe)) |
| 264 cmd += " \"" + nexe + "\""; |
| 265 } |
| 266 } |
| 267 else |
| 268 { |
| 269 if (ToolchainName == "glibc") |
| 270 { |
| 271 string bindir = Path.GetDirectoryName(NaClLinkerPath); |
| 272 string tcroot = Path.GetDirectoryName(bindir); |
| 273 cmd += " -D \"" + Path.Combine(bindir, "x86_64-nacl-objd
ump.exe") + "\""; |
| 274 cmd += " -L \"" + Path.Combine(tcroot, "x86_64-nacl", "l
ib") + "\""; |
| 275 cmd += " -L \"" + Path.Combine(tcroot, "x86_64-nacl", "l
ib32") + "\""; |
| 276 } |
| 277 cmd += " \"" + OutputFile + "\""; |
| 278 } |
| 279 |
| 280 if (!OutputCommandLine) |
| 281 Log.LogMessage("CreateNMF"); |
| 282 |
| 283 if (ExecuteTool("python", string.Empty, cmd) != 0) |
| 284 { |
| 285 return false; |
| 286 } |
200 } | 287 } |
201 | 288 |
202 return returnResult; | 289 return true; |
203 } | 290 } |
204 | 291 |
205 protected override int ExecuteTool(string pathToTool, string responseFil
eCommands, string commandLineCommands) | 292 protected override int ExecuteTool(string pathToTool, string responseFil
eCommands, string commandLineCommands) |
206 { | 293 { |
207 if (OutputCommandLine == "true") | 294 if (OutputCommandLine) |
208 { | 295 { |
209 Log.LogMessage(MessageImportance.High, pathToTool + " " + respo
nseFileCommands); | 296 Log.LogMessage(MessageImportance.High, pathToTool + " " + respo
nseFileCommands + " " + commandLineCommands); |
210 } | 297 } |
211 | 298 |
212 return base.ExecuteTool(pathToTool, responseFileCommands, commandLin
eCommands); | 299 return base.ExecuteTool(pathToTool, responseFileCommands, commandLin
eCommands); |
213 } | 300 } |
214 | 301 |
215 protected override string GenerateFullPathToTool() | 302 protected override string GenerateFullPathToTool() |
216 { | 303 { |
217 return this.ToolName; | 304 return this.ToolName; |
218 } | 305 } |
219 | 306 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 { | 348 { |
262 get | 349 get |
263 { | 350 { |
264 return "GCC"; | 351 return "GCC"; |
265 } | 352 } |
266 set | 353 set |
267 {} | 354 {} |
268 } | 355 } |
269 } | 356 } |
270 } | 357 } |
OLD | NEW |