3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 package org
.tianocore
.build
.fpd
;
15 import java
.util
.Iterator
;
19 import javax
.xml
.parsers
.DocumentBuilder
;
20 import javax
.xml
.parsers
.DocumentBuilderFactory
;
21 import javax
.xml
.transform
.OutputKeys
;
22 import javax
.xml
.transform
.Result
;
23 import javax
.xml
.transform
.Source
;
24 import javax
.xml
.transform
.Transformer
;
25 import javax
.xml
.transform
.TransformerFactory
;
26 import javax
.xml
.transform
.dom
.DOMSource
;
27 import javax
.xml
.transform
.stream
.StreamResult
;
29 import org
.apache
.tools
.ant
.BuildException
;
30 import org
.apache
.tools
.ant
.Project
;
31 import org
.tianocore
.build
.global
.GlobalData
;
32 import org
.tianocore
.build
.global
.SurfaceAreaQuery
;
33 import org
.tianocore
.build
.id
.FpdModuleIdentification
;
34 import org
.tianocore
.build
.id
.ModuleIdentification
;
35 import org
.w3c
.dom
.Comment
;
36 import org
.w3c
.dom
.Document
;
37 import org
.w3c
.dom
.Element
;
38 import org
.w3c
.dom
.Node
;
40 public class PlatformBuildFileGenerator
{
42 private String platformName
;
45 /// Mapping from modules identification to out put file name
47 private Map
<FpdModuleIdentification
, String
> outfiles
;
50 /// Mapping from FV name to its modules
52 private Map
<String
, Set
<FpdModuleIdentification
>> fvs
;
55 /// Mapping from sequence number to FV names
57 private Map
<String
, Set
<String
>> sequences
;
59 private boolean isUnified
= true;
61 private Project project
;
63 private String info
= "DO NOT EDIT \n"
64 + "File auto-generated by build utility\n"
67 + "Auto-generated ANT build file for building of EFI Modules/Platforms\n";
69 public PlatformBuildFileGenerator(Project project
, Map
<FpdModuleIdentification
, String
> outfiles
, Map
<String
, Set
<FpdModuleIdentification
>> fvs
, Map
<String
, Set
<String
>> sequences
, boolean isUnified
){
70 this.project
= project
;
71 this.outfiles
= outfiles
;
73 this.sequences
= sequences
;
74 this.isUnified
= isUnified
;
75 this.platformName
= project
.getProperty("PLATFORM");
79 Generate build.out.xml file.
81 @throws BuildException
82 build.out.xml XML document create error
84 public void genBuildFile() throws BuildException
{
85 DocumentBuilderFactory domfac
= DocumentBuilderFactory
.newInstance();
87 DocumentBuilder dombuilder
= domfac
.newDocumentBuilder();
88 Document document
= dombuilder
.newDocument();
89 Comment rootComment
= document
.createComment(info
);
91 // create root element and its attributes
93 Element root
= document
.createElement("project");
94 root
.setAttribute("name", project
.getProperty("PLATFORM"));
95 root
.setAttribute("default", "all");
96 root
.setAttribute("basedir", ".");
99 // element for External ANT tasks
101 root
.appendChild(document
.createComment("Apply external ANT tasks"));
102 Element ele
= document
.createElement("taskdef");
103 ele
.setAttribute("resource", "GenBuild.tasks");
104 root
.appendChild(ele
);
106 ele
= document
.createElement("taskdef");
107 ele
.setAttribute("resource", "frameworktasks.tasks");
108 root
.appendChild(ele
);
110 ele
= document
.createElement("property");
111 ele
.setAttribute("environment", "env");
112 root
.appendChild(ele
);
114 Set
<String
> sequenceKeys
= sequences
.keySet();
115 Iterator sequenceIter
= sequenceKeys
.iterator();
116 String dependsStr
= "";
117 while (sequenceIter
.hasNext()) {
118 String num
= (String
)sequenceIter
.next();
119 if (dependsStr
.length() > 0) {
122 dependsStr
+= "modules" + num
+ ", fvs" + num
;
128 root
.appendChild(document
.createComment("Default target"));
129 ele
= document
.createElement("target");
130 ele
.setAttribute("name", "all");
131 ele
.setAttribute("depends", dependsStr
+ ", userextensions");
132 root
.appendChild(ele
);
135 // Modules and Fvs Target
137 sequenceIter
= sequenceKeys
.iterator();
138 while (sequenceIter
.hasNext()) {
139 String num
= (String
)sequenceIter
.next();
140 applyModules(document
, root
, num
);
141 applyFvs(document
, root
, num
);
147 applyClean(document
, root
);
152 applyCleanall(document
, root
);
157 applyUserExtensions(document
, root
);
159 document
.appendChild(rootComment
);
160 document
.appendChild(root
);
162 // Prepare the DOM document for writing
164 Source source
= new DOMSource(document
);
166 // Prepare the output file
168 File file
= new File(project
.getProperty("PLATFORM_DIR") + File
.separatorChar
+ platformName
+ "_build.xml");
170 // generate all directory path
172 (new File(file
.getParent())).mkdirs();
173 Result result
= new StreamResult(file
);
175 // Write the DOM document to the file
177 Transformer xformer
= TransformerFactory
.newInstance().newTransformer();
178 xformer
.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
179 xformer
.setOutputProperty(OutputKeys
.INDENT
, "yes");
180 xformer
.transform(source
, result
);
181 } catch (Exception ex
) {
182 ex
.printStackTrace();
183 throw new BuildException("Generate " + platformName
+ "_build.xml failed. \n" + ex
.getMessage());
186 private void applyModules(Document document
, Node root
, String num
) {
187 root
.appendChild(document
.createComment("Modules target"));
188 Element ele
= document
.createElement("target");
189 ele
.setAttribute("name", "modules" + num
);
191 Set
<String
> fvNameSet
= sequences
.get(num
);
193 Iterator fvNameIter
= fvNameSet
.iterator();
194 while (fvNameIter
.hasNext()) {
195 String fvName
= (String
)fvNameIter
.next();
196 Set
<FpdModuleIdentification
> set
= fvs
.get(fvName
);
197 Iterator iter
= set
.iterator();
198 while (iter
.hasNext()) {
199 FpdModuleIdentification fpdModuleId
= (FpdModuleIdentification
) iter
.next();
200 ModuleIdentification moduleId
= fpdModuleId
.getModule();
201 Element moduleEle
= document
.createElement("GenBuild");
202 moduleEle
.setAttribute("type", "build");
204 // Inherit Properties.
205 //{"ARCH", "PACKAGE", "PACKAGE_GUID", "PACKAGE_VERSION", "MODULE_DIR"}
211 Element property
= document
.createElement("property");
212 property
.setAttribute("name", "ARCH");
213 property
.setAttribute("value", fpdModuleId
.getArch());
214 moduleEle
.appendChild(property
);
219 property
= document
.createElement("property");
220 property
.setAttribute("name", "MODULE_GUID");
221 property
.setAttribute("value", moduleId
.getGuid());
222 moduleEle
.appendChild(property
);
227 property
= document
.createElement("property");
228 property
.setAttribute("name", "MODULE_VERSION");
229 property
.setAttribute("value", moduleId
.getVersion());
230 moduleEle
.appendChild(property
);
235 property
= document
.createElement("property");
236 property
.setAttribute("name", "PACKAGE_GUID");
237 property
.setAttribute("value", moduleId
.getPackage().getGuid());
238 moduleEle
.appendChild(property
);
243 property
= document
.createElement("property");
244 property
.setAttribute("name", "PACKAGE_VERSION");
245 property
.setAttribute("value", moduleId
.getPackage().getVersion());
246 moduleEle
.appendChild(property
);
248 ele
.appendChild(moduleEle
);
251 root
.appendChild(ele
);
254 private void applyFvs(Document document
, Node root
, String num
) {
255 Set
<String
> fvNameSet
= sequences
.get(num
);
259 root
.appendChild(document
.createComment("FVs target"));
260 Element ele
= document
.createElement("target");
261 ele
.setAttribute("name", "fvs" + num
);
264 // For every Target and ToolChain
266 String
[] targetList
= GlobalData
.getToolChainInfo().getTargets();
267 for (int i
= 0; i
< targetList
.length
; i
++){
268 String
[] toolchainList
= GlobalData
.getToolChainInfo().getTagnames();
269 for(int j
= 0; j
< toolchainList
.length
; j
++){
270 String fvOutputDir
= project
.getProperty("BUILD_DIR") + File
.separatorChar
271 + targetList
[i
] + File
.separatorChar
272 + toolchainList
[i
] + File
.separatorChar
+ "FV";
273 String
[] validFv
= SurfaceAreaQuery
.getFpdValidImageNames();
274 for (int k
= 0; k
< validFv
.length
; k
++) {
275 if (fvNameSet
.contains(validFv
[k
]) || ! isListInSequence(validFv
[k
])) {
276 String inputFile
= fvOutputDir
+ "" + File
.separatorChar
+ validFv
[k
].toUpperCase() + ".inf";
277 Element fvEle
= document
.createElement("genfvimage");
278 fvEle
.setAttribute("infFile", inputFile
);
279 fvEle
.setAttribute("outputDir", fvOutputDir
);
280 ele
.appendChild(fvEle
);
285 root
.appendChild(ele
);
288 private void applyClean(Document document
, Node root
) {
292 root
.appendChild(document
.createComment("Clean target"));
293 Element ele
= document
.createElement("target");
294 ele
.setAttribute("name", "clean");
297 Element cleanEle
= document
.createElement("delete");
298 cleanEle
.setAttribute("includeemptydirs", "true");
299 Element filesetEle
= document
.createElement("fileset");
300 filesetEle
.setAttribute("dir", project
.getProperty("BUILD_DIR"));
301 filesetEle
.setAttribute("includes", "**\\OUTPUT\\**");
302 cleanEle
.appendChild(filesetEle
);
303 ele
.appendChild(cleanEle
);
305 Set set
= outfiles
.keySet();
306 Iterator iter
= set
.iterator();
307 while (iter
.hasNext()) {
308 FpdModuleIdentification fpdModuleId
= (FpdModuleIdentification
) iter
.next();
309 ModuleIdentification moduleId
= fpdModuleId
.getModule();
311 Element ifEle
= document
.createElement("if");
312 Element availableEle
= document
.createElement("available");
313 availableEle
.setAttribute("file", moduleId
.getMsaFile().getParent() + File
.separatorChar
315 ifEle
.appendChild(availableEle
);
316 Element elseEle
= document
.createElement("then");
318 Element moduleEle
= document
.createElement("ant");
319 moduleEle
.setAttribute("antfile", moduleId
.getMsaFile().getParent() + File
.separatorChar
321 moduleEle
.setAttribute("target", "clean");
323 // Inherit Properties.
324 //{"ARCH", "PACKAGE", "PACKAGE_GUID", "PACKAGE_VERSION", "MODULE_DIR"}
330 Element property
= document
.createElement("property");
331 property
.setAttribute("name", "ARCH");
332 property
.setAttribute("value", fpdModuleId
.getArch());
333 moduleEle
.appendChild(property
);
338 property
= document
.createElement("property");
339 property
.setAttribute("name", "PACKAGE");
340 property
.setAttribute("value", moduleId
.getPackage().getName());
341 moduleEle
.appendChild(property
);
346 property
= document
.createElement("property");
347 property
.setAttribute("name", "PACKAGE_GUID");
348 property
.setAttribute("value", moduleId
.getPackage().getGuid());
349 moduleEle
.appendChild(property
);
354 property
= document
.createElement("property");
355 property
.setAttribute("name", "PACKAGE_VERSION");
356 property
.setAttribute("value", moduleId
.getPackage().getVersion());
357 moduleEle
.appendChild(property
);
362 property
= document
.createElement("property");
363 property
.setAttribute("name", "MODULE_DIR");
364 property
.setAttribute("value", moduleId
.getMsaFile().getParent());
365 moduleEle
.appendChild(property
);
366 elseEle
.appendChild(moduleEle
);
367 ifEle
.appendChild(elseEle
);
368 ele
.appendChild(ifEle
);
371 root
.appendChild(ele
);
374 private void applyCleanall(Document document
, Node root
) {
378 root
.appendChild(document
.createComment("Clean All target"));
379 Element ele
= document
.createElement("target");
380 ele
.setAttribute("name", "cleanall");
383 Element cleanAllEle
= document
.createElement("delete");
384 cleanAllEle
.setAttribute("dir", project
.getProperty("BUILD_DIR"));
385 ele
.appendChild(cleanAllEle
);
387 Set set
= outfiles
.keySet();
388 Iterator iter
= set
.iterator();
389 while (iter
.hasNext()) {
390 FpdModuleIdentification fpdModuleId
= (FpdModuleIdentification
) iter
.next();
391 ModuleIdentification moduleId
= fpdModuleId
.getModule();
393 Element ifEle
= document
.createElement("if");
394 Element availableEle
= document
.createElement("available");
395 availableEle
.setAttribute("file", moduleId
.getMsaFile().getParent() + File
.separatorChar
397 ifEle
.appendChild(availableEle
);
398 Element elseEle
= document
.createElement("then");
400 Element moduleEle
= document
.createElement("ant");
401 moduleEle
.setAttribute("antfile", moduleId
.getMsaFile().getParent() + File
.separatorChar
403 moduleEle
.setAttribute("target", "cleanall");
405 // Inherit Properties.
406 //{"ARCH", "PACKAGE", "PACKAGE_GUID", "PACKAGE_VERSION", "MODULE_DIR"}
412 Element property
= document
.createElement("property");
413 property
.setAttribute("name", "ARCH");
414 property
.setAttribute("value", fpdModuleId
.getArch());
415 moduleEle
.appendChild(property
);
420 property
= document
.createElement("property");
421 property
.setAttribute("name", "PACKAGE");
422 property
.setAttribute("value", moduleId
.getPackage().getName());
423 moduleEle
.appendChild(property
);
428 property
= document
.createElement("property");
429 property
.setAttribute("name", "PACKAGE_GUID");
430 property
.setAttribute("value", moduleId
.getPackage().getGuid());
431 moduleEle
.appendChild(property
);
436 property
= document
.createElement("property");
437 property
.setAttribute("name", "PACKAGE_VERSION");
438 property
.setAttribute("value", moduleId
.getPackage().getVersion());
439 moduleEle
.appendChild(property
);
444 property
= document
.createElement("property");
445 property
.setAttribute("name", "MODULE_DIR");
446 property
.setAttribute("value", moduleId
.getMsaFile().getParent());
447 moduleEle
.appendChild(property
);
448 elseEle
.appendChild(moduleEle
);
449 ifEle
.appendChild(elseEle
);
450 ele
.appendChild(ifEle
);
453 root
.appendChild(ele
);
456 private void applyUserExtensions(Document document
, Node root
) {
460 root
.appendChild(document
.createComment("User Extensions"));
461 Element ele
= document
.createElement("target");
462 ele
.setAttribute("name", "userextensions");
464 root
.appendChild(ele
);
468 private boolean isListInSequence(String fvName
) {
469 Set
<String
> numbers
= sequences
.keySet();
470 Iterator
<String
> iter
= numbers
.iterator();
471 while (iter
.hasNext()) {
472 Set
<String
> fvNameSet
= sequences
.get(iter
.next());
473 if (fvNameSet
.contains(fvName
)) {