]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Java/Source/GenBuild/org/tianocore/build/GenBuildTask.java
Changed the way of handling not supported ARCH for a module. It should not break...
[mirror_edk2.git] / Tools / Java / Source / GenBuild / org / tianocore / build / GenBuildTask.java
CommitLineData
878ddf1f 1/** @file\r
ff225cbb 2 This file is ANT task GenBuild.\r
3\r
4 The file is used to parse a specified Module, and generate its build time\r
878ddf1f 5 ANT script build.xml, then call the the ANT script to build the module.\r
ff225cbb 6\r
878ddf1f 7Copyright (c) 2006, Intel Corporation\r
8All rights reserved. This program and the accompanying materials\r
9are licensed and made available under the terms and conditions of the BSD License\r
10which accompanies this distribution. The full text of the license may be found at\r
11http://opensource.org/licenses/bsd-license.php\r
12\r
13THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
14WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
15**/\r
16package org.tianocore.build;\r
17\r
18import java.io.File;\r
aca6c736 19import java.util.Hashtable;\r
878ddf1f 20import java.util.Iterator;\r
21import java.util.LinkedHashSet;\r
22import java.util.List;\r
23import java.util.Map;\r
24import java.util.Set;\r
25import java.util.Vector;\r
878ddf1f 26\r
878ddf1f 27import org.apache.tools.ant.BuildException;\r
aca6c736 28import org.apache.tools.ant.BuildListener;\r
700279a9 29import org.apache.tools.ant.Location;\r
aca6c736 30import org.apache.tools.ant.Project;\r
878ddf1f 31import org.apache.tools.ant.taskdefs.Ant;\r
a29c47e0 32import org.apache.tools.ant.taskdefs.Property;\r
878ddf1f 33import org.apache.xmlbeans.XmlObject;\r
136adffc 34import org.tianocore.build.autogen.AutoGen;\r
892b0e7a 35import org.tianocore.build.exception.AutoGenException;\r
36import org.tianocore.build.exception.GenBuildException;\r
37import org.tianocore.build.exception.PcdAutogenException;\r
38import org.tianocore.build.exception.PlatformPcdPreprocessBuildException;\r
878ddf1f 39import org.tianocore.build.fpd.FpdParserTask;\r
40import org.tianocore.build.global.GlobalData;\r
41import org.tianocore.build.global.OutputManager;\r
42import org.tianocore.build.global.SurfaceAreaQuery;\r
a29c47e0 43import org.tianocore.build.id.FpdModuleIdentification;\r
44import org.tianocore.build.id.ModuleIdentification;\r
45import org.tianocore.build.id.PackageIdentification;\r
46import org.tianocore.build.id.PlatformIdentification;\r
47import org.tianocore.build.tools.ModuleItem;\r
700279a9 48import org.tianocore.common.definitions.ToolDefinitions;\r
49import org.tianocore.common.exception.EdkException;\r
50import org.tianocore.common.logger.EdkLog;\r
878ddf1f 51\r
52/**\r
53 <p>\r
54 <code>GenBuildTask</code> is an ANT task that can be used in ANT build\r
4a6a5026 55 system. \r
56 \r
57 <p>The main function of this task is to parse module's surface area (MSA),\r
878ddf1f 58 then generate the corresponding <em>BaseName_build.xml</em> (the real ANT\r
a29c47e0 59 build script) and call this to build the module. The whole process including:\r
4b5f5549 60 \r
2d16dcec 61 <pre>\r
4a6a5026 62 1. generate AutoGen.c and AutoGen.h; \r
63 2. build all dependent library instances;\r
64 3. build all source files inlcude AutoGen.c; \r
65 4. generate sections;\r
ff225cbb 66 5. generate FFS file if it is driver module while LIB file if it is Library module.\r
2d16dcec 67 </pre>\r
68\r
ff225cbb 69\r
878ddf1f 70 <p>\r
71 The usage is (take module <em>HelloWorld</em> for example):\r
72 </p>\r
ff225cbb 73\r
878ddf1f 74 <pre>\r
4b5f5549 75 &lt;GenBuild \r
76 msaFile="${PACKAGE_DIR}/Application/HelloWorld/HelloWorld.msa"\r
77 type="cleanall" /&gt;\r
878ddf1f 78 </pre>\r
ff225cbb 79\r
878ddf1f 80 <p>\r
81 This task calls <code>AutoGen</code> to generate <em>AutoGen.c</em> and\r
4b5f5549 82 <em>AutoGen.h</em>. \r
878ddf1f 83 </p>\r
ff225cbb 84\r
4b5f5549 85 <p>\r
86 This task will also set properties for current module, such as PACKAGE, \r
87 PACKAGE_GUID, PACKAGE_VERSION, PACKAGE_DIR, PACKAGE_RELATIVE_DIR \r
88 (relative to Workspace), MODULE or BASE_NAME, GUID, VERSION, MODULE_DIR, \r
89 MODULE_RELATIVE_DIR (relative to Package), CONFIG_DIR, BIN_DIR, \r
90 DEST_DIR_DEBUG, DEST_DIR_OUTPUT, TARGET, ARCH, TOOLCHAIN, TOOLCHAIN_FAMILY, \r
91 SUBSYSTEM, ENTRYPOINT, EBC_TOOL_LIB_PATH, all compiler command related \r
92 properties (CC, CC_FLAGS, CC_DPATH, CC_SPATH, CC_FAMILY, CC_EXT). \r
93 </p>\r
94 \r
878ddf1f 95 @since GenBuild 1.0\r
96**/\r
a29c47e0 97public class GenBuildTask extends Ant {\r
ff225cbb 98\r
878ddf1f 99 ///\r
100 /// Module surface area file.\r
101 ///\r
a29c47e0 102 File msaFile;\r
19bf6b15 103 \r
104 public ModuleIdentification parentId;\r
105 \r
82516887 106 private String type = "all"; \r
107 \r
878ddf1f 108 ///\r
a29c47e0 109 /// Module's Identification.\r
878ddf1f 110 ///\r
a29c47e0 111 private ModuleIdentification moduleId;\r
878ddf1f 112\r
a29c47e0 113 private Vector<Property> properties = new Vector<Property>();\r
de4bb9f6 114\r
de4bb9f6 115 private boolean isSingleModuleBuild = false;\r
83fba802 116 \r
117 private SurfaceAreaQuery saq = null;\r
ff225cbb 118\r
878ddf1f 119 /**\r
120 Public construct method. It is necessary for ANT task.\r
121 **/\r
122 public GenBuildTask() {\r
123 }\r
124\r
125 /**\r
ff225cbb 126\r
878ddf1f 127 @throws BuildException\r
128 From module build, exception from module surface area invalid.\r
129 **/\r
130 public void execute() throws BuildException {\r
89e1408f 131 this.setTaskName("GenBuild");\r
892b0e7a 132 try {\r
133 processGenBuild();\r
134 } catch (PcdAutogenException e) {\r
47412835 135 BuildException buildException = new BuildException(e.getMessage());\r
136 buildException.setStackTrace(e.getStackTrace());\r
137 throw buildException;\r
892b0e7a 138 } catch (AutoGenException e) {\r
47412835 139 BuildException buildException = new BuildException(e.getMessage());\r
140 buildException.setStackTrace(e.getStackTrace());\r
141 throw buildException;\r
892b0e7a 142 } catch (PlatformPcdPreprocessBuildException e) {\r
47412835 143 BuildException buildException = new BuildException(e.getMessage());\r
144 buildException.setStackTrace(e.getStackTrace());\r
145 throw buildException;\r
892b0e7a 146 } catch (GenBuildException e) {\r
47412835 147 BuildException buildException = new BuildException(e.getMessage());\r
148 buildException.setStackTrace(e.getStackTrace());\r
149 throw buildException;\r
892b0e7a 150 } catch (EdkException e) {\r
47412835 151 BuildException buildException = new BuildException(e.getMessage());\r
152 buildException.setStackTrace(e.getStackTrace());\r
153 throw buildException;\r
700279a9 154 } catch (Exception e) {\r
155 BuildException buildException = new BuildException(e.getMessage());\r
156 buildException.setStackTrace(e.getStackTrace());\r
157 throw buildException;\r
892b0e7a 158 }\r
159 }\r
160\r
161 private void processGenBuild() throws EdkException, BuildException, GenBuildException, AutoGenException, PcdAutogenException, PlatformPcdPreprocessBuildException {\r
aca6c736 162 if (!FrameworkBuildTask.multithread) {\r
163 cleanupProperties();\r
164 }\r
82516887 165\r
878ddf1f 166 //\r
a29c47e0 167 // Enable all specified properties\r
878ddf1f 168 //\r
a29c47e0 169 Iterator<Property> iter = properties.iterator();\r
170 while (iter.hasNext()) {\r
171 Property item = iter.next();\r
aca6c736 172 getProject().setProperty(item.getName(), item.getValue());\r
878ddf1f 173 }\r
ff225cbb 174\r
878ddf1f 175 //\r
a29c47e0 176 // GenBuild should specify either msaFile or moduleGuid & packageGuid\r
878ddf1f 177 //\r
a29c47e0 178 if (msaFile == null ) {\r
179 String moduleGuid = getProject().getProperty("MODULE_GUID");\r
180 String moduleVersion = getProject().getProperty("MODULE_VERSION");\r
181 String packageGuid = getProject().getProperty("PACKAGE_GUID");\r
182 String packageVersion = getProject().getProperty("PACKAGE_VERSION");\r
892b0e7a 183 //\r
184 // If one of module Guid or package Guid is not specified, report error\r
185 //\r
a29c47e0 186 if (moduleGuid == null || packageGuid == null) {\r
391dbbb1 187 throw new BuildException("GenBuild parameter error.");\r
878ddf1f 188 }\r
892b0e7a 189 \r
a29c47e0 190 PackageIdentification packageId = new PackageIdentification(packageGuid, packageVersion);\r
892b0e7a 191 GlobalData.refreshPackageIdentification(packageId);\r
a29c47e0 192 moduleId = new ModuleIdentification(moduleGuid, moduleVersion);\r
193 moduleId.setPackage(packageId);\r
892b0e7a 194 GlobalData.refreshModuleIdentification(moduleId);\r
a29c47e0 195 Map<String, XmlObject> doc = GlobalData.getNativeMsa(moduleId);\r
83fba802 196 saq = new SurfaceAreaQuery(doc);\r
82516887 197 } else {\r
a29c47e0 198 Map<String, XmlObject> doc = GlobalData.getNativeMsa(msaFile);\r
83fba802 199 saq = new SurfaceAreaQuery(doc);\r
200 moduleId = saq.getMsaHeader();\r
89e1408f 201 moduleId.setMsaFile(msaFile);\r
878ddf1f 202 }\r
892b0e7a 203 \r
700279a9 204 String[] producedLibraryClasses = saq.getLibraryClasses("ALWAYS_PRODUCED", null, null);\r
a29c47e0 205 if (producedLibraryClasses.length == 0) {\r
206 moduleId.setLibrary(false);\r
82516887 207 } else {\r
a29c47e0 208 moduleId.setLibrary(true);\r
878ddf1f 209 }\r
2c9b03f2 210 moduleId.setBinary(saq.getBinaryModule());\r
ff225cbb 211\r
878ddf1f 212 //\r
a29c47e0 213 // Judge whether it is single module build or not\r
878ddf1f 214 //\r
de4bb9f6 215 if (isSingleModuleBuild) {\r
878ddf1f 216 //\r
a29c47e0 217 // Single Module build\r
878ddf1f 218 //\r
a29c47e0 219 prepareSingleModuleBuild();\r
878ddf1f 220 }\r
ff225cbb 221\r
a29c47e0 222 //\r
82516887 223 // If single module : get arch from pass down, otherwise intersection MSA \r
224 // supported ARCHs and tools def\r
a29c47e0 225 //\r
ff225cbb 226 Set<String> archListSupByToolChain = new LinkedHashSet<String>();\r
227 String[] archs = GlobalData.getToolChainInfo().getArchs();\r
228\r
3c696250 229 for (int i = 0; i < archs.length; i ++) {\r
230 archListSupByToolChain.add(archs[i]);\r
231 }\r
ff225cbb 232\r
3c696250 233 Set<String> archSet = new LinkedHashSet<String>();\r
bc022470 234 String archString = getProject().getProperty("ARCH");\r
de093b3c 235 if (archString != null && archString.length() > 0) {\r
bc022470 236 String[] fpdArchList = archString.split(" ");\r
ff225cbb 237\r
3c696250 238 for (int i = 0; i < fpdArchList.length; i++) {\r
239 if (archListSupByToolChain.contains(fpdArchList[i])) {\r
240 archSet.add(fpdArchList[i]);\r
241 }\r
242 }\r
82516887 243 } else {\r
244 archSet = archListSupByToolChain; \r
3c696250 245 }\r
ff225cbb 246\r
3c696250 247 String[] archList = archSet.toArray(new String[archSet.size()]);\r
ff225cbb 248\r
a29c47e0 249 //\r
250 // Judge if arch is all supported by current module. If not, throw Exception.\r
251 //\r
83fba802 252 List moduleSupportedArchs = saq.getModuleSupportedArchs();\r
a29c47e0 253 if (moduleSupportedArchs != null) {\r
254 for (int k = 0; k < archList.length; k++) {\r
9821fa9a 255 if (!moduleSupportedArchs.contains(archList[k])) {\r
256 EdkLog.log(this, EdkLog.EDK_WARNING, "Specified architecture [" + archList[k] + "] is not supported by " + moduleId + ". The module " + moduleId + " only supports [" + moduleSupportedArchs + "] architectures.");\r
257 archList[k] = "";\r
a29c47e0 258 }\r
259 }\r
878ddf1f 260 }\r
ff225cbb 261\r
c340a28e 262 if (archList.length == 0) {\r
bc022470 263 EdkLog.log(this, EdkLog.EDK_WARNING, "Warning: " + "[" + archString + "] is not supported for " + moduleId + " in this build!\n");\r
c340a28e 264 }\r
265\r
a29c47e0 266 for (int k = 0; k < archList.length; k++) {\r
9821fa9a 267 if (archList[k] == "") {\r
268 continue;\r
269 }\r
ff225cbb 270\r
aca6c736 271 getProject().setProperty("ARCH", archList[k]);\r
ff225cbb 272\r
a29c47e0 273 FpdModuleIdentification fpdModuleId = new FpdModuleIdentification(moduleId, archList[k]);\r
ff225cbb 274\r
878ddf1f 275 //\r
a29c47e0 276 // Whether the module is built before\r
878ddf1f 277 //\r
34281092 278 if (moduleId.isLibrary() == false && GlobalData.hasFpdModuleSA(fpdModuleId) == false) {\r
d965d1f6 279 EdkLog.log(this, EdkLog.EDK_WARNING, "Warning: " + moduleId + " for " + archList[k] + " was not found in current platform FPD file!\n");\r
34281092 280 continue;\r
281 } else if (GlobalData.isModuleBuilt(fpdModuleId)) {\r
1fa1cb75 282 break;\r
34281092 283 } else {\r
a29c47e0 284 GlobalData.registerBuiltModule(fpdModuleId);\r
285 }\r
ff225cbb 286\r
878ddf1f 287 //\r
a29c47e0 288 // For Every TOOLCHAIN, TARGET\r
289 //\r
290 String[] targetList = GlobalData.getToolChainInfo().getTargets();\r
291 for (int i = 0; i < targetList.length; i ++){\r
292 //\r
293 // Prepare for target related common properties\r
294 // TARGET\r
295 //\r
aca6c736 296 getProject().setProperty("TARGET", targetList[i]);\r
a29c47e0 297 String[] toolchainList = GlobalData.getToolChainInfo().getTagnames();\r
298 for(int j = 0; j < toolchainList.length; j ++){\r
c773bec0 299 //\r
300 // check if any tool is defined for current target + toolchain + arch\r
301 // don't do anything if no tools found\r
ff225cbb 302 //\r
c773bec0 303 if (GlobalData.isCommandSet(targetList[i], toolchainList[j], archList[k]) == false) {\r
fd6c41f5 304 EdkLog.log(this, EdkLog.EDK_WARNING, "Warning: No build issued. No tools found for [target=" + targetList[i] + " toolchain=" + toolchainList[j] + " arch=" + archList[k] + "]\n");\r
c773bec0 305 continue;\r
306 }\r
307\r
a29c47e0 308 //\r
309 // Prepare for toolchain related common properties\r
310 // TOOLCHAIN\r
311 //\r
aca6c736 312 getProject().setProperty("TOOLCHAIN", toolchainList[j]);\r
a29c47e0 313\r
d965d1f6 314 EdkLog.log(this, "Build " + moduleId + " start >>>");\r
315 EdkLog.log(this, "Target: " + targetList[i] + " Tagname: " + toolchainList[j] + " Arch: " + archList[k]);\r
83fba802 316 saq.push(GlobalData.getDoc(fpdModuleId));\r
ff225cbb 317\r
a29c47e0 318 //\r
319 // Prepare for all other common properties\r
320 // PACKAGE, PACKAGE_GUID, PACKAGE_VERSION, PACKAGE_DIR, PACKAGE_RELATIVE_DIR\r
321 // MODULE or BASE_NAME, GUID or FILE_GUID, VERSION, MODULE_TYPE\r
322 // MODULE_DIR, MODULE_RELATIVE_DIR\r
323 // SUBSYSTEM, ENTRYPOINT, EBC_TOOL_LIB_PATH\r
a29c47e0 324 //\r
325 setModuleCommonProperties(archList[k]);\r
ff225cbb 326\r
a29c47e0 327 //\r
ff225cbb 328 // OutputManage prepare for\r
a29c47e0 329 // BIN_DIR, DEST_DIR_DEBUG, DEST_DIR_OUTPUT, BUILD_DIR, FV_DIR\r
330 //\r
331 OutputManager.getInstance().update(getProject());\r
ff225cbb 332\r
a29c47e0 333 if (type.equalsIgnoreCase("all") || type.equalsIgnoreCase("build")) {\r
334 applyBuild(targetList[i], toolchainList[j], fpdModuleId);\r
e3cc4061 335 } else {\r
336 applyNonBuildTarget(fpdModuleId);\r
a29c47e0 337 }\r
338 }\r
339 }\r
878ddf1f 340 }\r
878ddf1f 341 }\r
342\r
343 /**\r
ff225cbb 344 This method is used to prepare Platform-related information.\r
345\r
a29c47e0 346 <p>In Single Module Build mode, platform-related information is not ready.\r
ff225cbb 347 The method read the system environment variable <code>ACTIVE_PLATFORM</code>\r
a29c47e0 348 and search in the Framework Database. Note that platform name in the Framework\r
349 Database must be unique. </p>\r
ff225cbb 350\r
878ddf1f 351 **/\r
892b0e7a 352 private void prepareSingleModuleBuild() throws EdkException {\r
878ddf1f 353 //\r
a29c47e0 354 // Find out the package which the module belongs to\r
878ddf1f 355 //\r
a29c47e0 356 PackageIdentification packageId = GlobalData.getPackageForModule(moduleId);\r
892b0e7a 357 GlobalData.refreshPackageIdentification(packageId);\r
a29c47e0 358 moduleId.setPackage(packageId);\r
892b0e7a 359 GlobalData.refreshModuleIdentification(moduleId);\r
ff225cbb 360\r
878ddf1f 361 //\r
82516887 362 // Read ACTIVE_PLATFORM's FPD file \r
878ddf1f 363 //\r
de4bb9f6 364 String filename = getProject().getProperty("PLATFORM_FILE");\r
ff225cbb 365\r
de4bb9f6 366 if (filename == null){\r
391dbbb1 367 throw new BuildException("Please set ACTIVE_PLATFORM in the file: Tools/Conf/target.txt if you want to build a single module!");\r
878ddf1f 368 }\r
ff225cbb 369\r
de4bb9f6 370 PlatformIdentification platformId = GlobalData.getPlatform(filename);\r
ff225cbb 371\r
878ddf1f 372 //\r
82516887 373 // Read FPD file (Call FpdParserTask's method)\r
878ddf1f 374 //\r
a29c47e0 375 FpdParserTask fpdParser = new FpdParserTask();\r
376 fpdParser.setProject(getProject());\r
07193171 377 fpdParser.parseFpdFile(platformId.getFpdFile());\r
aca6c736 378 getProject().setProperty("ARCH", fpdParser.getAllArchForModule(moduleId));\r
878ddf1f 379 }\r
380\r
aca6c736 381 private void cleanupProperties() {\r
382 Project newProject = new Project();\r
383\r
384 Hashtable<String, String> passdownProperties = FrameworkBuildTask.originalProperties;\r
385 Iterator<String> iter = passdownProperties.keySet().iterator();\r
386 while (iter.hasNext()) {\r
387 String item = iter.next();\r
388 newProject.setProperty(item, passdownProperties.get(item));\r
389 }\r
390\r
391 newProject.setInputHandler(getProject().getInputHandler());\r
392\r
393 Iterator listenerIter = getProject().getBuildListeners().iterator();\r
394 while (listenerIter.hasNext()) {\r
395 newProject.addBuildListener((BuildListener) listenerIter.next());\r
396 }\r
397\r
398 getProject().initSubProject(newProject);\r
399\r
400 setProject(newProject);\r
401 }\r
878ddf1f 402\r
403 /**\r
a29c47e0 404 Set Module-Related information to properties.\r
82516887 405 \r
406 @param arch current build ARCH\r
878ddf1f 407 **/\r
a29c47e0 408 private void setModuleCommonProperties(String arch) {\r
878ddf1f 409 //\r
a29c47e0 410 // Prepare for all other common properties\r
411 // PACKAGE, PACKAGE_GUID, PACKAGE_VERSION, PACKAGE_DIR, PACKAGE_RELATIVE_DIR\r
878ddf1f 412 //\r
a29c47e0 413 PackageIdentification packageId = moduleId.getPackage();\r
aca6c736 414 getProject().setProperty("PACKAGE", packageId.getName());\r
415 getProject().setProperty("PACKAGE_GUID", packageId.getGuid());\r
416 getProject().setProperty("PACKAGE_VERSION", packageId.getVersion());\r
417 getProject().setProperty("PACKAGE_DIR", packageId.getPackageDir().replaceAll("(\\\\)", "/"));\r
418 getProject().setProperty("PACKAGE_RELATIVE_DIR", packageId.getPackageRelativeDir().replaceAll("(\\\\)", "/"));\r
ff225cbb 419\r
a29c47e0 420 //\r
421 // MODULE or BASE_NAME, GUID or FILE_GUID, VERSION, MODULE_TYPE\r
422 // MODULE_DIR, MODULE_RELATIVE_DIR\r
423 //\r
aca6c736 424 getProject().setProperty("MODULE", moduleId.getName());\r
83fba802 425 String baseName = saq.getModuleOutputFileBasename();\r
a29c47e0 426 if (baseName == null) {\r
aca6c736 427 getProject().setProperty("BASE_NAME", moduleId.getName());\r
82516887 428 } else {\r
aca6c736 429 getProject().setProperty("BASE_NAME", baseName);\r
a29c47e0 430 }\r
aca6c736 431 getProject().setProperty("GUID", moduleId.getGuid());\r
432 getProject().setProperty("FILE_GUID", moduleId.getGuid());\r
433 getProject().setProperty("VERSION", moduleId.getVersion());\r
434 getProject().setProperty("MODULE_TYPE", moduleId.getModuleType());\r
86f3fef0 435 File msaFile = moduleId.getMsaFile();\r
436 String msaFileName = msaFile.getName();\r
437 getProject().setProperty("MODULE_DIR", msaFile.getParent().replaceAll("(\\\\)", "/"));\r
438 getProject().setProperty("MODULE_RELATIVE_DIR", moduleId.getModuleRelativePath().replaceAll("(\\\\)", "/") \r
bc022470 439 + File.separatorChar + msaFileName.substring(0, msaFileName.lastIndexOf('.')));\r
ff225cbb 440\r
a29c47e0 441 //\r
442 // SUBSYSTEM\r
443 //\r
444 String[][] subsystemMap = { { "BASE", "EFI_BOOT_SERVICE_DRIVER"},\r
ff225cbb 445 { "SEC", "EFI_BOOT_SERVICE_DRIVER" },\r
446 { "PEI_CORE", "EFI_BOOT_SERVICE_DRIVER" },\r
447 { "PEIM", "EFI_BOOT_SERVICE_DRIVER" },\r
a29c47e0 448 { "DXE_CORE", "EFI_BOOT_SERVICE_DRIVER" },\r
ff225cbb 449 { "DXE_DRIVER", "EFI_BOOT_SERVICE_DRIVER" },\r
450 { "DXE_RUNTIME_DRIVER", "EFI_RUNTIME_DRIVER" },\r
451 { "DXE_SAL_DRIVER", "EFI_BOOT_SERVICE_DRIVER" },\r
452 { "DXE_SMM_DRIVER", "EFI_BOOT_SERVICE_DRIVER" },\r
453 { "TOOL", "EFI_BOOT_SERVICE_DRIVER" },\r
a29c47e0 454 { "UEFI_DRIVER", "EFI_BOOT_SERVICE_DRIVER" },\r
ff225cbb 455 { "UEFI_APPLICATION", "EFI_APPLICATION" },\r
456 { "USER_DEFINED", "EFI_BOOT_SERVICE_DRIVER"} };\r
457\r
a29c47e0 458 String subsystem = "EFI_BOOT_SERVICE_DRIVER";\r
459 for (int i = 0; i < subsystemMap.length; i++) {\r
460 if (moduleId.getModuleType().equalsIgnoreCase(subsystemMap[i][0])) {\r
461 subsystem = subsystemMap[i][1];\r
462 break ;\r
878ddf1f 463 }\r
464 }\r
aca6c736 465 getProject().setProperty("SUBSYSTEM", subsystem);\r
ff225cbb 466\r
a29c47e0 467 //\r
468 // ENTRYPOINT\r
469 //\r
470 if (arch.equalsIgnoreCase("EBC")) {\r
aca6c736 471 getProject().setProperty("ENTRYPOINT", "EfiStart");\r
82516887 472 } else {\r
aca6c736 473 getProject().setProperty("ENTRYPOINT", "_ModuleEntryPoint");\r
878ddf1f 474 }\r
ff225cbb 475\r
aca6c736 476 getProject().setProperty("OBJECTS", "");\r
878ddf1f 477 }\r
478\r
a29c47e0 479 private void getCompilerFlags(String target, String toolchain, FpdModuleIdentification fpdModuleId) throws EdkException {\r
480 String[] cmd = GlobalData.getToolChainInfo().getCommands();\r
481 for ( int m = 0; m < cmd.length; m++) {\r
878ddf1f 482 //\r
a29c47e0 483 // Set cmd, like CC, DLINK\r
878ddf1f 484 //\r
a29c47e0 485 String[] key = new String[]{target, toolchain, fpdModuleId.getArch(), cmd[m], null};\r
4a6a5026 486 key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_PATH;\r
a29c47e0 487 String cmdPath = GlobalData.getCommandSetting(key, fpdModuleId);\r
4a6a5026 488 key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_NAME;\r
a29c47e0 489 String cmdName = GlobalData.getCommandSetting(key, fpdModuleId);\r
1549f516 490 if (cmdName.length() == 0) {\r
fd6c41f5 491 EdkLog.log(this, EdkLog.EDK_VERBOSE, "Warning: " + cmd[m] + " hasn't been defined!");\r
492 getProject().setProperty(cmd[m], "");\r
1549f516 493 continue;\r
494 }\r
a29c47e0 495 File cmdFile = new File(cmdPath + File.separatorChar + cmdName);\r
aca6c736 496 getProject().setProperty(cmd[m], cmdFile.getPath().replaceAll("(\\\\)", "/"));\r
ff225cbb 497\r
878ddf1f 498 //\r
a29c47e0 499 // set CC_FLAGS\r
878ddf1f 500 //\r
4a6a5026 501 key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FLAGS;\r
a29c47e0 502 String cmdFlags = GlobalData.getCommandSetting(key, fpdModuleId);\r
e04a8a9a 503 if (cmdFlags != null) \r
504 {\r
e04a8a9a 505 getProject().setProperty(cmd[m] + "_FLAGS", cmdFlags);\r
506 } \r
507 else \r
508 {\r
509 getProject().setProperty(cmd[m] + "_FLAGS", "");\r
510 }\r
511\r
878ddf1f 512 //\r
a29c47e0 513 // Set CC_EXT\r
878ddf1f 514 //\r
4a6a5026 515 key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_EXT;\r
a29c47e0 516 String extName = GlobalData.getCommandSetting(key, fpdModuleId);\r
a29c47e0 517 if ( extName != null && ! extName.equalsIgnoreCase("")) {\r
aca6c736 518 getProject().setProperty(cmd[m] + "_EXT", extName);\r
82516887 519 } else {\r
aca6c736 520 getProject().setProperty(cmd[m] + "_EXT", "");\r
878ddf1f 521 }\r
ff225cbb 522\r
878ddf1f 523 //\r
a29c47e0 524 // set CC_FAMILY\r
878ddf1f 525 //\r
4a6a5026 526 key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FAMILY;\r
a29c47e0 527 String toolChainFamily = GlobalData.getCommandSetting(key, fpdModuleId);\r
a29c47e0 528 if (toolChainFamily != null) {\r
aca6c736 529 getProject().setProperty(cmd[m] + "_FAMILY", toolChainFamily);\r
878ddf1f 530 }\r
ff225cbb 531\r
878ddf1f 532 //\r
a29c47e0 533 // set CC_SPATH\r
878ddf1f 534 //\r
4a6a5026 535 key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_SPATH;\r
a29c47e0 536 String spath = GlobalData.getCommandSetting(key, fpdModuleId);\r
a29c47e0 537 if (spath != null) {\r
aca6c736 538 getProject().setProperty(cmd[m] + "_SPATH", spath.replaceAll("(\\\\)", "/"));\r
82516887 539 } else {\r
aca6c736 540 getProject().setProperty(cmd[m] + "_SPATH", "");\r
878ddf1f 541 }\r
ff225cbb 542\r
878ddf1f 543 //\r
a29c47e0 544 // set CC_DPATH\r
878ddf1f 545 //\r
4a6a5026 546 key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_DPATH;\r
a29c47e0 547 String dpath = GlobalData.getCommandSetting(key, fpdModuleId);\r
a29c47e0 548 if (dpath != null) {\r
aca6c736 549 getProject().setProperty(cmd[m] + "_DPATH", dpath.replaceAll("(\\\\)", "/"));\r
82516887 550 } else {\r
aca6c736 551 getProject().setProperty(cmd[m] + "_DPATH", "");\r
878ddf1f 552 }\r
c639781e 553 \r
554 //\r
555 // Set CC_LIBPATH\r
556 //\r
557 key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_LIBPATH;\r
558 String libpath = GlobalData.getCommandSetting(key, fpdModuleId);\r
559 if (libpath != null) {\r
560 getProject().setProperty(cmd[m] + "_LIBPATH", libpath.replaceAll("(\\\\)", "/"));\r
561 } else {\r
562 getProject().setProperty(cmd[m] + "_LIBPATH", "");\r
563 }\r
564 \r
565 //\r
566 // Set CC_INCLUDEPATH\r
567 //\r
568 key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_INCLUDEPATH;\r
569 String includepath = GlobalData.getCommandSetting(key, fpdModuleId);\r
570 if (dpath != null) {\r
571 getProject().setProperty(cmd[m] + "_INCLUDEPATH", includepath.replaceAll("(\\\\)", "/"));\r
572 } else {\r
573 getProject().setProperty(cmd[m] + "_INCLUDEPATH", "");\r
574 }\r
878ddf1f 575 }\r
a29c47e0 576 }\r
ff225cbb 577\r
a29c47e0 578 public void setMsaFile(File msaFile) {\r
579 this.msaFile = msaFile;\r
878ddf1f 580 }\r
581\r
582 /**\r
ff225cbb 583 Method is for ANT to initialize MSA file.\r
584\r
a29c47e0 585 @param msaFilename MSA file name\r
878ddf1f 586 **/\r
a29c47e0 587 public void setMsaFile(String msaFilename) {\r
588 String moduleDir = getProject().getProperty("MODULE_DIR");\r
ff225cbb 589\r
a29c47e0 590 //\r
591 // If is Single Module Build, then use the Base Dir defined in build.xml\r
592 //\r
593 if (moduleDir == null) {\r
594 moduleDir = getProject().getBaseDir().getPath();\r
878ddf1f 595 }\r
a29c47e0 596 msaFile = new File(moduleDir + File.separatorChar + msaFilename);\r
597 }\r
ff225cbb 598\r
a29c47e0 599 public void addConfiguredModuleItem(ModuleItem moduleItem) {\r
600 PackageIdentification packageId = new PackageIdentification(moduleItem.getPackageGuid(), moduleItem.getPackageVersion());\r
601 ModuleIdentification moduleId = new ModuleIdentification(moduleItem.getModuleGuid(), moduleItem.getModuleVersion());\r
602 moduleId.setPackage(packageId);\r
603 this.moduleId = moduleId;\r
604 }\r
ff225cbb 605\r
a29c47e0 606 /**\r
ff225cbb 607 Add a property.\r
608\r
a29c47e0 609 @param p property\r
610 **/\r
611 public void addProperty(Property p) {\r
612 properties.addElement(p);\r
613 }\r
614\r
615 public void setType(String type) {\r
616 this.type = type;\r
617 }\r
ff225cbb 618\r
892b0e7a 619 private void applyBuild(String buildTarget, String buildTagname, FpdModuleIdentification fpdModuleId) throws EdkException {\r
a29c47e0 620 //\r
83fba802 621 // Call AutoGen to generate AutoGen.c and AutoGen.h\r
a29c47e0 622 //\r
2eb7d78d 623 AutoGen autogen = new AutoGen(getProject().getProperty("FV_DIR"), getProject().getProperty("DEST_DIR_DEBUG"), fpdModuleId.getModule(),fpdModuleId.getArch(), saq, parentId);\r
136adffc 624 autogen.genAutogen();\r
ff225cbb 625\r
a29c47e0 626 //\r
627 // Get compiler flags\r
628 //\r
82516887 629 try {\r
630 getCompilerFlags(buildTarget, buildTagname, fpdModuleId);\r
631 }\r
632 catch (EdkException ee) {\r
633 throw new BuildException(ee.getMessage());\r
634 }\r
635 \r
a29c47e0 636 //\r
637 // Prepare LIBS\r
638 //\r
83fba802 639 ModuleIdentification[] libinstances = saq.getLibraryInstance(fpdModuleId.getArch());\r
a29c47e0 640 String propertyLibs = "";\r
641 for (int i = 0; i < libinstances.length; i++) {\r
498e9021 642 propertyLibs += getProject().getProperty("BIN_DIR") + File.separatorChar + libinstances[i].getName() + ".lib" + " ";\r
878ddf1f 643 }\r
aca6c736 644 getProject().setProperty("LIBS", propertyLibs.replaceAll("(\\\\)", "/"));\r
ff225cbb 645\r
bf3a7173 646 //\r
647 // Get all includepath and set to INCLUDE_PATHS\r
648 //\r
649 String[] includes = prepareIncludePaths(fpdModuleId);\r
650 \r
a29c47e0 651 //\r
652 // if it is CUSTOM_BUILD\r
653 // then call the exist BaseName_build.xml directly.\r
654 //\r
98840b10 655 String buildFilename = "";\r
656 if ((buildFilename = GetCustomizedBuildFile(fpdModuleId.getArch())) != "") {\r
657 EdkLog.log(this, "Call user-defined " + buildFilename);\r
82516887 658 \r
98840b10 659 String antFilename = getProject().getProperty("MODULE_DIR") + File.separatorChar + buildFilename;\r
82516887 660 antCall(antFilename, null);\r
661 \r
a29c47e0 662 return ;\r
878ddf1f 663 }\r
ff225cbb 664\r
878ddf1f 665 //\r
a29c47e0 666 // Generate ${BASE_NAME}_build.xml\r
667 // TBD\r
878ddf1f 668 //\r
83fba802 669 String ffsKeyword = saq.getModuleFfsKeyword();\r
670 ModuleBuildFileGenerator fileGenerator = new ModuleBuildFileGenerator(getProject(), ffsKeyword, fpdModuleId, includes, saq);\r
98840b10 671 buildFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml";\r
a29c47e0 672 fileGenerator.genBuildFile(buildFilename);\r
ff225cbb 673\r
a29c47e0 674 //\r
675 // Ant call ${BASE_NAME}_build.xml\r
676 //\r
82516887 677 String antFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml";\r
678 antCall(antFilename, null);\r
a29c47e0 679 }\r
ff225cbb 680\r
e3cc4061 681 private void applyNonBuildTarget(FpdModuleIdentification fpdModuleId){\r
682 //\r
683 // if it is CUSTOM_BUILD\r
684 // then call the exist BaseName_build.xml directly.\r
685 //\r
686 if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) {\r
687 EdkLog.log(this, "Calling user-defined " + moduleId.getName() + "_build.xml");\r
688 \r
689 String antFilename = getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml";\r
690 antCall(antFilename, this.type);\r
691 \r
692 return ;\r
693 }\r
694\r
695 String antFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml";\r
696 antCall(antFilename, this.type);\r
697 }\r
698\r
a29c47e0 699 private void applyClean(FpdModuleIdentification fpdModuleId){\r
700 //\r
701 // if it is CUSTOM_BUILD\r
702 // then call the exist BaseName_build.xml directly.\r
703 //\r
704 if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) {\r
d965d1f6 705 EdkLog.log(this, "Calling user-defined " + moduleId.getName() + "_build.xml");\r
82516887 706 \r
707 String antFilename = getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml";\r
708 antCall(antFilename, "clean");\r
709 \r
a29c47e0 710 return ;\r
878ddf1f 711 }\r
ff225cbb 712\r
82516887 713 String antFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml";\r
714 antCall(antFilename, "clean");\r
a29c47e0 715 }\r
ff225cbb 716\r
a29c47e0 717 private void applyCleanall(FpdModuleIdentification fpdModuleId){\r
718 //\r
719 // if it is CUSTOM_BUILD\r
720 // then call the exist BaseName_build.xml directly.\r
721 //\r
722 if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) {\r
d965d1f6 723 EdkLog.log(this, "Calling user-defined " + moduleId.getName() + "_build.xml");\r
82516887 724\r
725 String antFilename = getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml";\r
726 antCall(antFilename, "cleanall");\r
727 \r
a29c47e0 728 return ;\r
878ddf1f 729 }\r
82516887 730 \r
731 String antFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml";\r
732 antCall(antFilename, "cleanall");\r
733 }\r
ff225cbb 734\r
82516887 735 private void antCall(String antFilename, String target) {\r
a29c47e0 736 Ant ant = new Ant();\r
737 ant.setProject(getProject());\r
82516887 738 ant.setAntfile(antFilename);\r
739 if (target != null) {\r
740 ant.setTarget(target);\r
741 }\r
a29c47e0 742 ant.setInheritAll(true);\r
743 ant.init();\r
744 ant.execute();\r
878ddf1f 745 }\r
746\r
de4bb9f6 747 public void setSingleModuleBuild(boolean isSingleModuleBuild) {\r
748 this.isSingleModuleBuild = isSingleModuleBuild;\r
749 }\r
bf3a7173 750 \r
892b0e7a 751 private String[] prepareIncludePaths(FpdModuleIdentification fpdModuleId) throws EdkException{\r
bf3a7173 752 //\r
753 // Prepare the includes: PackageDependencies and Output debug direactory\r
754 //\r
755 Set<String> includes = new LinkedHashSet<String>();\r
756 String arch = fpdModuleId.getArch();\r
757 \r
758 //\r
759 // WORKSPACE\r
760 //\r
761 includes.add("${WORKSPACE_DIR}" + File.separatorChar);\r
762 \r
763 //\r
764 // Module iteself\r
765 //\r
766 includes.add("${MODULE_DIR}");\r
767 includes.add("${MODULE_DIR}" + File.separatorChar + archDir(arch));\r
768 \r
769 //\r
770 // Packages in PackageDenpendencies\r
771 //\r
83fba802 772 PackageIdentification[] packageDependencies = saq.getDependencePkg(fpdModuleId.getArch());\r
bf3a7173 773 for (int i = 0; i < packageDependencies.length; i++) {\r
774 GlobalData.refreshPackageIdentification(packageDependencies[i]);\r
775 File packageFile = packageDependencies[i].getSpdFile();\r
776 includes.add(packageFile.getParent() + File.separatorChar + "Include");\r
777 includes.add(packageFile.getParent() + File.separatorChar + "Include" + File.separatorChar + archDir(arch));\r
778 }\r
779\r
780 //\r
781 // All Dependency Library Instance's PackageDependencies\r
782 //\r
83fba802 783 ModuleIdentification[] libinstances = saq.getLibraryInstance(fpdModuleId.getArch());\r
bf3a7173 784 for (int i = 0; i < libinstances.length; i++) {\r
83fba802 785 saq.push(GlobalData.getDoc(libinstances[i], fpdModuleId.getArch()));\r
786 PackageIdentification[] libraryPackageDependencies = saq.getDependencePkg(fpdModuleId.getArch());\r
bf3a7173 787 for (int j = 0; j < libraryPackageDependencies.length; j++) {\r
788 GlobalData.refreshPackageIdentification(libraryPackageDependencies[j]);\r
789 File packageFile = libraryPackageDependencies[j].getSpdFile();\r
790 includes.add(packageFile.getParent() + File.separatorChar + "Include");\r
791 includes.add(packageFile.getParent() + File.separatorChar + "Include" + File.separatorChar + archDir(arch));\r
792 }\r
83fba802 793 saq.pop();\r
bf3a7173 794 }\r
795 \r
796 \r
797 //\r
798 // The package which the module belongs to\r
799 // TBD\r
800 includes.add(fpdModuleId.getModule().getPackage().getPackageDir() + File.separatorChar + "Include");\r
801 includes.add(fpdModuleId.getModule().getPackage().getPackageDir() + File.separatorChar + "Include" + File.separatorChar + archDir(arch));\r
802\r
803 //\r
804 // Debug files output directory\r
805 //\r
806 includes.add("${DEST_DIR_DEBUG}");\r
807 \r
808 //\r
809 // set to INCLUDE_PATHS property\r
810 //\r
811 Iterator<String> iter = includes.iterator();\r
812 StringBuffer includePaths = new StringBuffer();\r
813 while (iter.hasNext()) {\r
814 includePaths.append(iter.next());\r
815 includePaths.append("; ");\r
816 }\r
aca6c736 817 getProject().setProperty("INCLUDE_PATHS", getProject().replaceProperties(includePaths.toString()).replaceAll("(\\\\)", "/"));\r
bf3a7173 818 \r
819 return includes.toArray(new String[includes.size()]);\r
820 }\r
821 \r
822 /**\r
823 Return the name of the directory that corresponds to the architecture.\r
824 This is a translation from the XML Schema tag to a directory that\r
825 corresponds to our directory name coding convention.\r
826 \r
827 **/\r
828 private String archDir(String arch) {\r
829 return arch.replaceFirst("X64", "x64")\r
830 .replaceFirst("IPF", "Ipf")\r
831 .replaceFirst("IA32", "Ia32")\r
832 .replaceFirst("ARM", "Arm")\r
833 .replaceFirst("EBC", "Ebc");\r
19bf6b15 834 }\r
835 \r
836 \r
837 public void setExternalProperties(Vector<Property> v) {\r
838 this.properties = v;\r
839 }\r
98840b10 840\r
841 private String GetCustomizedBuildFile(String arch) {\r
842 String[][] files = saq.getSourceFiles(arch);\r
843 for (int i = 0; i < files.length; ++i) {\r
844 if (files[i][1].endsWith("build.xml")) {\r
845 return files[i][1];\r
846 }\r
847 }\r
848\r
849 return "";\r
850 }\r
878ddf1f 851}\r