]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/GenBuild/org/tianocore/build/tools/DefaultBuildFileGenerator.java
set MaxDatumSize for PcdData.
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / tools / DefaultBuildFileGenerator.java
CommitLineData
6ec40aef 1/** @file\r
2 This file is an ANT task.\r
3 \r
4 LibBuildFileGenerator task is used to generate module's build.xml file.\r
5\r
6Copyright (c) 2006, Intel Corporation\r
7All rights reserved. This program and the accompanying materials\r
8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11\r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16package org.tianocore.build.tools;\r
17\r
18import java.io.File;\r
19import java.util.Iterator;\r
20import java.util.LinkedHashSet;\r
21import java.util.Set;\r
22\r
23import javax.xml.parsers.DocumentBuilder;\r
24import javax.xml.parsers.DocumentBuilderFactory;\r
25import javax.xml.transform.OutputKeys;\r
26import javax.xml.transform.Result;\r
27import javax.xml.transform.Source;\r
28import javax.xml.transform.Transformer;\r
29import javax.xml.transform.TransformerFactory;\r
30import javax.xml.transform.dom.DOMSource;\r
31import javax.xml.transform.stream.StreamResult;\r
32\r
33import org.apache.tools.ant.BuildException;\r
34import org.apache.tools.ant.Task;\r
35import org.tianocore.build.global.GlobalData;\r
36import org.tianocore.build.id.ModuleIdentification;\r
37import org.tianocore.build.id.PackageIdentification;\r
38import org.w3c.dom.Document;\r
39import org.w3c.dom.Element;\r
40\r
41public class DefaultBuildFileGenerator extends Task {\r
42\r
43 private Set<ModuleIdentification> modules = new LinkedHashSet<ModuleIdentification>();\r
44 \r
45 private Set<PackageIdentification> packages = new LinkedHashSet<PackageIdentification>();\r
46 \r
47 //\r
48 // <DefaultBuildFileGenerator mode="WORKSPACE | PACKAGE | MODULE">\r
49 // <PackageItem packageName="" packageGuid="" packageVersion="" />\r
50 // <ModuleItem moduleName="HelloWorld" moduleGuid="" moduleVersion="" packageName="" packageGuid="" packageVersion="" />\r
51 // </DefaultBuildFileGenerator>\r
52 //\r
53 private String mode = "MODULE";\r
54 \r
55 private String license = " Copyright (c) 2006, Intel Corporation \n"\r
56 + "All rights reserved. This program and the accompanying materials \n"\r
57 + "are licensed and made available under the terms and conditions of the BSD License \n"\r
58 + "which accompanies this distribution. The full text of the license may be found at \n"\r
59 + "http://opensource.org/licenses/bsd-license.php \n"\r
60 + "\n"\r
61 + "THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN \"AS IS\" BASIS, \n"\r
62 + "WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.";\r
63 \r
64 /**\r
65 Public construct method. It is necessary for ANT task.\r
66 **/\r
67 public DefaultBuildFileGenerator () {\r
68 }\r
69\r
70 public void execute() throws BuildException {\r
71 //\r
72 // Global Data initialization\r
73 //\r
74 GlobalData.initInfo("Tools" + File.separatorChar + "Conf" + File.separatorChar + "FrameworkDatabase.db",\r
75 getProject().getProperty("WORKSPACE_DIR"), "tools_def.txt");\r
76 \r
77 if (mode.equalsIgnoreCase("WORKSPACE")) {\r
78 modules.clear();\r
79 packages = GlobalData.getPackageList();\r
80 } \r
81 else if (mode.equalsIgnoreCase("PACKAGE")) {\r
82 modules.clear();\r
83 }\r
84 if (mode.equalsIgnoreCase("WORKSPACE") || mode.equalsIgnoreCase("PACKAGE")) {\r
85 Iterator iter = packages.iterator();\r
86 while (iter.hasNext()) {\r
87 PackageIdentification packageId = (PackageIdentification)iter.next();\r
88 modules.addAll(GlobalData.getModules(packageId));\r
89 }\r
90 }\r
91 \r
92 Iterator iter = modules.iterator();\r
93 while (iter.hasNext()) {\r
94 ModuleIdentification moduleId = (ModuleIdentification)iter.next();\r
95 genBuildFile (moduleId);\r
96 }\r
97 }\r
98 \r
99 private void genBuildFile(ModuleIdentification moduleId) {\r
100 DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();\r
101 try {\r
102 DocumentBuilder dombuilder = domfac.newDocumentBuilder();\r
103 Document document = dombuilder.newDocument();\r
104 //\r
105 // create root element and its attributes\r
106 //\r
107 document.appendChild(document.createComment(license));\r
108 Element root = document.createElement("project");\r
109 root.setAttribute("default", "all");\r
110 root.setAttribute("basedir", ".");\r
111 root.setAttribute("name", moduleId.getName());\r
112 \r
113 //\r
114 // element for External ANT tasks\r
115 //\r
116 root.appendChild(document.createComment("Apply external ANT tasks"));\r
117 Element ele = document.createElement("taskdef");\r
118 ele.setAttribute("resource", "GenBuild.tasks");\r
119 root.appendChild(ele);\r
120 \r
121 //\r
122 // <taskdef resource="net/sf/antcontrib/antlib.xml" />\r
123 //\r
124 ele = document.createElement("taskdef");\r
125 ele.setAttribute("resource", "net/sf/antcontrib/antlib.xml");\r
126 root.appendChild(ele);\r
127 \r
128 ele = document.createElement("property");\r
129 ele.setAttribute("environment", "env");\r
130 root.appendChild(ele);\r
131\r
132 ele = document.createElement("property");\r
133 ele.setAttribute("name", "WORKSPACE_DIR");\r
134 ele.setAttribute("value", "${env.WORKSPACE}");\r
135 root.appendChild(ele);\r
136 \r
137 ele = document.createElement("property");\r
138 ele.setAttribute("name", "MSA_FILENAME");\r
139 ele.setAttribute("value", GlobalData.getMsaFile(moduleId).getName());\r
140 root.appendChild(ele);\r
141 \r
142 ele = document.createElement("property");\r
143 ele.setAttribute("name", "BASE_NAME");\r
144 ele.setAttribute("value", moduleId.getName());\r
145 root.appendChild(ele);\r
146 \r
147 //\r
148 // Don't change it!!\r
149 //\r
150 ele = document.createElement("import");\r
151 ele.setAttribute("file", "${WORKSPACE_DIR}/Tools/Conf/BuildMacro.xml");\r
152 root.appendChild(ele);\r
153 \r
154 //\r
155 // <target name="all">\r
156 // <GenBuild msaFile="HelloWorld.msa"/>\r
157 // </target>\r
158 //\r
159 Element targetEle = document.createElement("target");\r
160 targetEle.setAttribute("name", "all");\r
161 \r
162 ele = document.createElement("GenBuild");\r
163 ele.setAttribute("msaFile", "${MSA_FILENAME}");\r
164 targetEle.appendChild(ele);\r
165 \r
166 root.appendChild(targetEle);\r
167 \r
168 //\r
169 // <target name="clean">\r
170 // <OutputDirSetup msaFile="HelloWorld.msa"/>\r
171 // <if>\r
172 // <available file="${DEST_DIR_OUTPUT}/HelloWorld_build.xml"/>\r
173 // <then>\r
174 // <ant antfile="${DEST_DIR_OUTPUT}/HelloWorld_build.xml" target="clean"/>\r
175 // </then>\r
176 // </if>\r
177 // <delete dir="${DEST_DIR_OUTPUT}" excludes="*.xml"/>\r
178 // </target>\r
179 //\r
180 targetEle = document.createElement("target");\r
181 targetEle.setAttribute("name", "clean");\r
182 \r
183 ele = document.createElement("OutputDirSetup");\r
184 ele.setAttribute("msaFile", "${MSA_FILENAME}");\r
185 targetEle.appendChild(ele);\r
186 \r
187 ele = document.createElement("if");\r
188 \r
189 Element availableEle = document.createElement("available");\r
190 availableEle.setAttribute("file", "${DEST_DIR_OUTPUT}/${BASE_NAME}_build.xml");\r
191 ele.appendChild(availableEle);\r
192 \r
193 Element thenEle = document.createElement("then");\r
194 Element antEle = document.createElement("ant");\r
195 antEle.setAttribute("antfile", "${DEST_DIR_OUTPUT}/${BASE_NAME}_build.xml");\r
196 antEle.setAttribute("target", "clean");\r
197 thenEle.appendChild(antEle);\r
198 ele.appendChild(thenEle);\r
199 targetEle.appendChild(ele);\r
200 \r
201 ele = document.createElement("delete");\r
202 ele.setAttribute("dir", "${DEST_DIR_OUTPUT}");\r
203 ele.setAttribute("excludes", "*.xml");\r
204 targetEle.appendChild(ele);\r
205 \r
206 root.appendChild(targetEle);\r
207 \r
208 //\r
209 // <target name="cleanall">\r
210 // <OutputDirSetup msaFile="HelloWorld.msa"/>\r
211 // <if>\r
212 // <available file="${DEST_DIR_OUTPUT}/HelloWorld_build.xml"/>\r
213 // <then>\r
214 // <ant antfile="${DEST_DIR_OUTPUT}/HelloWorld_build.xml" target="cleanall"/>\r
215 // </then>\r
216 // </if>\r
217 // <delete dir="${DEST_DIR_OUTPUT}"/>\r
218 // <delete dir="${DEST_DIR_DEBUG}"/>\r
219 // <delete>\r
220 // <fileset dir="${BIN_DIR}" includes="**HelloWorld*"/>\r
221 // </delete>\r
222 // </target>\r
223 //\r
224 targetEle = document.createElement("target");\r
225 targetEle.setAttribute("name", "cleanall");\r
226 \r
227 ele = document.createElement("OutputDirSetup");\r
228 ele.setAttribute("msaFile", "${MSA_FILENAME}");\r
229 targetEle.appendChild(ele);\r
230 \r
231 ele = document.createElement("if");\r
232 \r
233 availableEle = document.createElement("available");\r
234 availableEle.setAttribute("file", "${DEST_DIR_OUTPUT}/${BASE_NAME}_build.xml");\r
235 ele.appendChild(availableEle);\r
236 \r
237 thenEle = document.createElement("then");\r
238 antEle = document.createElement("ant");\r
239 antEle.setAttribute("antfile", "${DEST_DIR_OUTPUT}/${BASE_NAME}_build.xml");\r
240 antEle.setAttribute("target", "cleanall");\r
241 thenEle.appendChild(antEle);\r
242 ele.appendChild(thenEle);\r
243 targetEle.appendChild(ele);\r
244 \r
245 ele = document.createElement("delete");\r
246 ele.setAttribute("dir", "${DEST_DIR_OUTPUT}");\r
247 targetEle.appendChild(ele);\r
248 \r
249 ele = document.createElement("delete");\r
250 ele.setAttribute("dir", "${DEST_DIR_DEBUG}");\r
251 targetEle.appendChild(ele);\r
252 \r
253 ele = document.createElement("delete");\r
254 \r
255 Element filesetEle = document.createElement("fileset");\r
256 filesetEle.setAttribute("dir", "${BIN_DIR}");\r
257 filesetEle.setAttribute("includes", "**${BASE_NAME}*");\r
258 ele.appendChild(filesetEle);\r
259 \r
260 targetEle.appendChild(ele);\r
261 \r
262 root.appendChild(targetEle);\r
263\r
264 \r
265 document.appendChild(root);\r
266 \r
267 //\r
268 // Prepare the DOM document for writing\r
269 //\r
270 Source source = new DOMSource(document);\r
271 \r
272 //\r
273 // Prepare the output file\r
274 //\r
275 String filename = GlobalData.getMsaFile(moduleId).getParent() + File.separatorChar + "build.xml";\r
276 File file = new File(getProject().replaceProperties(filename));\r
277 \r
278 GlobalData.log.info("File generating - " + filename);\r
279 //\r
280 // generate all directory path\r
281 //\r
282 Result result = new StreamResult(file);\r
283 \r
284 //\r
285 // Write the DOM document to the file\r
286 //\r
287 Transformer xformer = TransformerFactory.newInstance()\r
288 .newTransformer();\r
289 xformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");\r
290 xformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
291 xformer.transform(source, result);\r
292 } catch (Exception ex) {\r
293 System.out.println("##" + ex);\r
294 }\r
295 \r
296 }\r
297 \r
298 public void addConfiguredModuleItem(ModuleItem moduleItem) {\r
299 PackageIdentification packageId = new PackageIdentification(moduleItem.getPackageName(), moduleItem.getPackageGuid(), moduleItem.getPackageVersion());\r
300 ModuleIdentification moduleId = new ModuleIdentification(moduleItem.getModuleName(), moduleItem.getModuleGuid(), moduleItem.getModuleVersion());\r
301 moduleId.setPackage(packageId);\r
302 modules.add(moduleId);\r
303 }\r
304 \r
305 public void addConfiguredPackageItem(PackageItem packageItem) {\r
306 PackageIdentification packageId = new PackageIdentification(packageItem.getPackageName(), packageItem.getPackageGuid(), packageItem.getPackageVersion());\r
307 packages.add(packageId);\r
308 }\r
309\r
310 public void setMode(String mode) {\r
311 this.mode = mode;\r
312 }\r
313}\r