]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/GenBuild/org/tianocore/build/GenBuildTask.java
Add class header to FrameworkBuildTask. Remove some unused code from top level build...
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / GenBuildTask.java
index 1f020b3cc15df0b17b2d66dd247f1901a25b8f4c..c8cc4ad74890729a245d705ac896467b4ca0d5be 100644 (file)
@@ -1,9 +1,9 @@
 /** @file\r
 /** @file\r
-  This file is ANT task GenBuild. \r
\r
-  The file is used to parse a specified Module, and generate its build time \r
+  This file is ANT task GenBuild.\r
+\r
+  The file is used to parse a specified Module, and generate its build time\r
   ANT script build.xml, then call the the ANT script to build the module.\r
   ANT script build.xml, then call the the ANT script to build the module.\r
\r
+\r
 Copyright (c) 2006, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 Copyright (c) 2006, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
@@ -16,7 +16,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 package org.tianocore.build;\r
 \r
 import java.io.File;\r
 package org.tianocore.build;\r
 \r
 import java.io.File;\r
-import java.util.ArrayList;\r
 import java.util.Hashtable;\r
 import java.util.Iterator;\r
 import java.util.LinkedHashSet;\r
 import java.util.Hashtable;\r
 import java.util.Iterator;\r
 import java.util.LinkedHashSet;\r
@@ -33,6 +32,9 @@ import org.apache.tools.ant.taskdefs.Ant;
 import org.apache.tools.ant.taskdefs.Property;\r
 import org.apache.xmlbeans.XmlObject;\r
 \r
 import org.apache.tools.ant.taskdefs.Property;\r
 import org.apache.xmlbeans.XmlObject;\r
 \r
+import org.tianocore.common.definitions.ToolDefinitions;\r
+import org.tianocore.common.exception.EdkException;\r
+import org.tianocore.common.logger.EdkLog;\r
 import org.tianocore.build.autogen.AutoGen;\r
 import org.tianocore.build.fpd.FpdParserTask;\r
 import org.tianocore.build.global.GenBuildLogger;\r
 import org.tianocore.build.autogen.AutoGen;\r
 import org.tianocore.build.fpd.FpdParserTask;\r
 import org.tianocore.build.global.GenBuildLogger;\r
@@ -44,56 +46,57 @@ import org.tianocore.build.id.ModuleIdentification;
 import org.tianocore.build.id.PackageIdentification;\r
 import org.tianocore.build.id.PlatformIdentification;\r
 import org.tianocore.build.tools.ModuleItem;\r
 import org.tianocore.build.id.PackageIdentification;\r
 import org.tianocore.build.id.PlatformIdentification;\r
 import org.tianocore.build.tools.ModuleItem;\r
-import org.tianocore.exception.EdkException;\r
-import org.tianocore.logger.EdkLog;\r
 \r
 /**\r
   <p>\r
   <code>GenBuildTask</code> is an ANT task that can be used in ANT build\r
 \r
 /**\r
   <p>\r
   <code>GenBuildTask</code> is an ANT task that can be used in ANT build\r
-  system. The main function of this task is to parse module's surface area,\r
+  system. \r
+  \r
+  <p>The main function of this task is to parse module's surface area (MSA),\r
   then generate the corresponding <em>BaseName_build.xml</em> (the real ANT\r
   build script) and call this to build the module. The whole process including:\r
   then generate the corresponding <em>BaseName_build.xml</em> (the real ANT\r
   build script) and call this to build the module. The whole process including:\r
-  1. generate AutoGen.c and AutoGen.h; 2. build all dependent library instances; \r
-  3. build all source files inlcude AutoGen.c; 4. generate sections;\r
-  5. generate FFS file if it is driver module while LIB file if it is Library module. \r
-  </p>\r
-  \r
+  <pre>\r
+  1. generate AutoGen.c and AutoGen.h; \r
+  2. build all dependent library instances;\r
+  3. build all source files inlcude AutoGen.c; \r
+  4. generate sections;\r
+  5. generate FFS file if it is driver module while LIB file if it is Library module.\r
+  </pre>\r
+\r
+\r
   <p>\r
   The usage is (take module <em>HelloWorld</em> for example):\r
   </p>\r
   <p>\r
   The usage is (take module <em>HelloWorld</em> for example):\r
   </p>\r
-  \r
+\r
   <pre>\r
   <pre>\r
-   &lt;GenBuild  \r
-             msaFilename=&quot;HelloWorld.msa&quot;/&gt; \r
+   &lt;GenBuild\r
+             msaFilename=&quot;HelloWorld.msa&quot;/&gt;\r
              processTo=&quot;ALL&quot;/&gt;\r
   </pre>\r
              processTo=&quot;ALL&quot;/&gt;\r
   </pre>\r
-  \r
-  <p><code>processTo</code> provides a way to customize the whole build process. \r
-  processTo can be one value of ALL, AUTOGEN, FILES, LIBRARYINSTANCES, SECTIONS, NONE. \r
-  Default is ALL, means whole \r
+\r
+  <p><code>processTo</code> provides a way to customize the whole build process.\r
+  processTo can be one value of ALL, AUTOGEN, FILES, LIBRARYINSTANCES, SECTIONS, NONE.\r
+  Default is ALL, means whole\r
   </p>\r
   </p>\r
-  \r
+\r
   <p>\r
   This task calls <code>AutoGen</code> to generate <em>AutoGen.c</em> and\r
   <em>AutoGen.h</em>. The task also parses the development environment\r
   configuration files, such as collecting package information, setting compiler\r
   flags and so on.\r
   </p>\r
   <p>\r
   This task calls <code>AutoGen</code> to generate <em>AutoGen.c</em> and\r
   <em>AutoGen.h</em>. The task also parses the development environment\r
   configuration files, such as collecting package information, setting compiler\r
   flags and so on.\r
   </p>\r
-  \r
-  \r
+\r
+\r
   @since GenBuild 1.0\r
 **/\r
 public class GenBuildTask extends Ant {\r
   @since GenBuild 1.0\r
 **/\r
 public class GenBuildTask extends Ant {\r
-    \r
+\r
     ///\r
     /// Module surface area file.\r
     ///\r
     File msaFile;\r
 \r
     ///\r
     /// Module surface area file.\r
     ///\r
     File msaFile;\r
 \r
-    ///\r
-    /// \r
-    ///\r
-    private String type = "all"; // = "build";\r
+    private String type = "all"; \r
     \r
     ///\r
     /// Module's Identification.\r
     \r
     ///\r
     /// Module's Identification.\r
@@ -103,9 +106,9 @@ public class GenBuildTask extends Ant {
     private Vector<Property> properties = new Vector<Property>();\r
 \r
     private static Stack<Hashtable> backupPropertiesStack = new Stack<Hashtable>();\r
     private Vector<Property> properties = new Vector<Property>();\r
 \r
     private static Stack<Hashtable> backupPropertiesStack = new Stack<Hashtable>();\r
-    \r
+\r
     private boolean isSingleModuleBuild = false;\r
     private boolean isSingleModuleBuild = false;\r
-    \r
+\r
     /**\r
       Public construct method. It is necessary for ANT task.\r
     **/\r
     /**\r
       Public construct method. It is necessary for ANT task.\r
     **/\r
@@ -113,7 +116,7 @@ public class GenBuildTask extends Ant {
     }\r
 \r
     /**\r
     }\r
 \r
     /**\r
-  \r
+\r
       @throws BuildException\r
               From module build, exception from module surface area invalid.\r
     **/\r
       @throws BuildException\r
               From module build, exception from module surface area invalid.\r
     **/\r
@@ -124,8 +127,7 @@ public class GenBuildTask extends Ant {
         GenBuildLogger logger = new GenBuildLogger(getProject());\r
         EdkLog.setLogLevel(getProject().getProperty("env.LOGLEVEL"));\r
         EdkLog.setLogger(logger);\r
         GenBuildLogger logger = new GenBuildLogger(getProject());\r
         EdkLog.setLogLevel(getProject().getProperty("env.LOGLEVEL"));\r
         EdkLog.setLogger(logger);\r
-        // remove !!\r
-        try {\r
+\r
         pushProperties();\r
         //\r
         // Enable all specified properties\r
         pushProperties();\r
         //\r
         // Enable all specified properties\r
@@ -135,7 +137,7 @@ public class GenBuildTask extends Ant {
             Property item = iter.next();\r
             getProject().setProperty(item.getName(), item.getValue());\r
         }\r
             Property item = iter.next();\r
             getProject().setProperty(item.getName(), item.getValue());\r
         }\r
-        \r
+\r
         //\r
         // GenBuild should specify either msaFile or moduleGuid & packageGuid\r
         //\r
         //\r
         // GenBuild should specify either msaFile or moduleGuid & packageGuid\r
         //\r
@@ -145,7 +147,7 @@ public class GenBuildTask extends Ant {
             String packageGuid = getProject().getProperty("PACKAGE_GUID");\r
             String packageVersion = getProject().getProperty("PACKAGE_VERSION");\r
             if (moduleGuid == null || packageGuid == null) {\r
             String packageGuid = getProject().getProperty("PACKAGE_GUID");\r
             String packageVersion = getProject().getProperty("PACKAGE_VERSION");\r
             if (moduleGuid == null || packageGuid == null) {\r
-                throw new BuildException("GenBuild parameters error. ");\r
+                throw new BuildException("GenBuild parameter error.");\r
             }\r
             PackageIdentification packageId = new PackageIdentification(packageGuid, packageVersion);\r
             moduleId = new ModuleIdentification(moduleGuid, moduleVersion);\r
             }\r
             PackageIdentification packageId = new PackageIdentification(packageGuid, packageVersion);\r
             moduleId = new ModuleIdentification(moduleGuid, moduleVersion);\r
@@ -153,8 +155,7 @@ public class GenBuildTask extends Ant {
             Map<String, XmlObject> doc = GlobalData.getNativeMsa(moduleId);\r
             SurfaceAreaQuery.setDoc(doc);\r
             moduleId = SurfaceAreaQuery.getMsaHeader();\r
             Map<String, XmlObject> doc = GlobalData.getNativeMsa(moduleId);\r
             SurfaceAreaQuery.setDoc(doc);\r
             moduleId = SurfaceAreaQuery.getMsaHeader();\r
-        }\r
-        else {\r
+        } else {\r
             Map<String, XmlObject> doc = GlobalData.getNativeMsa(msaFile);\r
             SurfaceAreaQuery.setDoc(doc);\r
             moduleId = SurfaceAreaQuery.getMsaHeader();\r
             Map<String, XmlObject> doc = GlobalData.getNativeMsa(msaFile);\r
             SurfaceAreaQuery.setDoc(doc);\r
             moduleId = SurfaceAreaQuery.getMsaHeader();\r
@@ -162,11 +163,10 @@ public class GenBuildTask extends Ant {
         String[] producedLibraryClasses = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED",null);\r
         if (producedLibraryClasses.length == 0) {\r
             moduleId.setLibrary(false);\r
         String[] producedLibraryClasses = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED",null);\r
         if (producedLibraryClasses.length == 0) {\r
             moduleId.setLibrary(false);\r
-        }\r
-        else {\r
+        } else {\r
             moduleId.setLibrary(true);\r
         }\r
             moduleId.setLibrary(true);\r
         }\r
-        \r
+\r
         //\r
         // Judge whether it is single module build or not\r
         //\r
         //\r
         // Judge whether it is single module build or not\r
         //\r
@@ -175,8 +175,7 @@ public class GenBuildTask extends Ant {
             // Single Module build\r
             //\r
             prepareSingleModuleBuild();\r
             // Single Module build\r
             //\r
             prepareSingleModuleBuild();\r
-        }\r
-        else {\r
+        } else {\r
             //\r
             // Platform build. Restore the platform related info\r
             //\r
             //\r
             // Platform build. Restore the platform related info\r
             //\r
@@ -184,41 +183,40 @@ public class GenBuildTask extends Ant {
             PlatformIdentification platformId = GlobalData.getPlatform(filename);\r
             getProject().setProperty("PLATFORM_DIR", platformId.getFpdFile().getParent().replaceAll("(\\\\)", "/"));\r
             getProject().setProperty("PLATFORM_RELATIVE_DIR", platformId.getPlatformRelativeDir().replaceAll("(\\\\)", "/"));\r
             PlatformIdentification platformId = GlobalData.getPlatform(filename);\r
             getProject().setProperty("PLATFORM_DIR", platformId.getFpdFile().getParent().replaceAll("(\\\\)", "/"));\r
             getProject().setProperty("PLATFORM_RELATIVE_DIR", platformId.getPlatformRelativeDir().replaceAll("(\\\\)", "/"));\r
-            \r
+\r
             String packageGuid = getProject().getProperty("PACKAGE_GUID");\r
             String packageVersion = getProject().getProperty("PACKAGE_VERSION");\r
             PackageIdentification packageId = new PackageIdentification(packageGuid, packageVersion);\r
             moduleId.setPackage(packageId);\r
         }\r
             String packageGuid = getProject().getProperty("PACKAGE_GUID");\r
             String packageVersion = getProject().getProperty("PACKAGE_VERSION");\r
             PackageIdentification packageId = new PackageIdentification(packageGuid, packageVersion);\r
             moduleId.setPackage(packageId);\r
         }\r
-        \r
+\r
         //\r
         //\r
-        // If single module : intersection MSA supported ARCHs and tools def!!\r
-        // else, get arch from pass down\r
+        // If single module : get arch from pass down, otherwise intersection MSA \r
+        // supported ARCHs and tools def\r
         //\r
         //\r
-        Set<String> archListSupByToolChain = new LinkedHashSet<String>(); \r
-        String[] archs = GlobalData.getToolChainInfo().getArchs(); \r
-        \r
+        Set<String> archListSupByToolChain = new LinkedHashSet<String>();\r
+        String[] archs = GlobalData.getToolChainInfo().getArchs();\r
+\r
         for (int i = 0; i < archs.length; i ++) {\r
             archListSupByToolChain.add(archs[i]);\r
         }\r
         for (int i = 0; i < archs.length; i ++) {\r
             archListSupByToolChain.add(archs[i]);\r
         }\r
-        \r
+\r
         Set<String> archSet = new LinkedHashSet<String>();\r
         Set<String> archSet = new LinkedHashSet<String>();\r
-        \r
+\r
         if ( getProject().getProperty("ARCH") != null) {\r
             String[] fpdArchList = getProject().getProperty("ARCH").split(" ");\r
         if ( getProject().getProperty("ARCH") != null) {\r
             String[] fpdArchList = getProject().getProperty("ARCH").split(" ");\r
-            \r
+\r
             for (int i = 0; i < fpdArchList.length; i++) {\r
                 if (archListSupByToolChain.contains(fpdArchList[i])) {\r
                     archSet.add(fpdArchList[i]);\r
                 }\r
             }\r
             for (int i = 0; i < fpdArchList.length; i++) {\r
                 if (archListSupByToolChain.contains(fpdArchList[i])) {\r
                     archSet.add(fpdArchList[i]);\r
                 }\r
             }\r
-        }\r
-        else {\r
+        } else {\r
             archSet = archListSupByToolChain; \r
         }\r
             archSet = archListSupByToolChain; \r
         }\r
-  \r
+\r
         String[] archList = archSet.toArray(new String[archSet.size()]);\r
         String[] archList = archSet.toArray(new String[archSet.size()]);\r
-        \r
+\r
         //\r
         // Judge if arch is all supported by current module. If not, throw Exception.\r
         //\r
         //\r
         // Judge if arch is all supported by current module. If not, throw Exception.\r
         //\r
@@ -226,28 +224,29 @@ public class GenBuildTask extends Ant {
         if (moduleSupportedArchs != null) {\r
             for (int k = 0; k < archList.length; k++) {\r
                 if ( ! moduleSupportedArchs.contains(archList[k])) {\r
         if (moduleSupportedArchs != null) {\r
             for (int k = 0; k < archList.length; k++) {\r
                 if ( ! moduleSupportedArchs.contains(archList[k])) {\r
-                    throw new BuildException("ARCH [" + archList[k] + "] is not supported by " + moduleId + ". " + moduleId + " only supports [" + moduleSupportedArchs + "].");\r
+                    throw new BuildException("Specified architecture [" + archList[k] + "] is not supported by " + moduleId + ". The module " + moduleId + " only supports [" + moduleSupportedArchs + "] architectures.");\r
                 }\r
             }\r
         }\r
                 }\r
             }\r
         }\r
-        \r
+\r
         for (int k = 0; k < archList.length; k++) {\r
         for (int k = 0; k < archList.length; k++) {\r
-            \r
+\r
             getProject().setProperty("ARCH", archList[k]);\r
             getProject().setProperty("ARCH", archList[k]);\r
-            \r
+\r
             FpdModuleIdentification fpdModuleId = new FpdModuleIdentification(moduleId, archList[k]);\r
             FpdModuleIdentification fpdModuleId = new FpdModuleIdentification(moduleId, archList[k]);\r
-            \r
+\r
             //\r
             // Whether the module is built before\r
             //\r
             //\r
             // Whether the module is built before\r
             //\r
-            if ((moduleId.isLibrary() == false && GlobalData.hasFpdModuleSA(fpdModuleId) == false) \r
-                || GlobalData.isModuleBuilt(fpdModuleId)) {\r
+            if (moduleId.isLibrary() == false && GlobalData.hasFpdModuleSA(fpdModuleId) == false) {\r
+                System.out.println("\nWARNING: " + moduleId + " for " + archList[k] + " was not found in current platform FPD file!\n");\r
                 continue;\r
                 continue;\r
-            }\r
-            else {\r
+            } else if (GlobalData.isModuleBuilt(fpdModuleId)) {\r
+                return;\r
+            } else {\r
                 GlobalData.registerBuiltModule(fpdModuleId);\r
             }\r
                 GlobalData.registerBuiltModule(fpdModuleId);\r
             }\r
-            \r
+\r
             //\r
             // For Every TOOLCHAIN, TARGET\r
             //\r
             //\r
             // For Every TOOLCHAIN, TARGET\r
             //\r
@@ -263,9 +262,9 @@ public class GenBuildTask extends Ant {
                     //\r
                     // check if any tool is defined for current target + toolchain + arch\r
                     // don't do anything if no tools found\r
                     //\r
                     // check if any tool is defined for current target + toolchain + arch\r
                     // don't do anything if no tools found\r
-                    // \r
+                    //\r
                     if (GlobalData.isCommandSet(targetList[i], toolchainList[j], archList[k]) == false) {\r
                     if (GlobalData.isCommandSet(targetList[i], toolchainList[j], archList[k]) == false) {\r
-                        System.out.println("Warning: No build issued. No tools found for [target=" + targetList[i] + " toolchain=" + toolchainList[j] + " arch=" + archList[k] + "]\n");\r
+                        System.out.println("Warning: No build issued.  No tools were found for [target=" + targetList[i] + " toolchain=" + toolchainList[j] + " arch=" + archList[k] + "]\n");\r
                         continue;\r
                     }\r
 \r
                         continue;\r
                     }\r
 \r
@@ -278,49 +277,44 @@ public class GenBuildTask extends Ant {
                     System.out.println("Build " + moduleId + " start >>>");\r
                     System.out.println("Target: " + targetList[i] + " Tagname: " + toolchainList[j] + " Arch: " + archList[k]);\r
                     SurfaceAreaQuery.setDoc(GlobalData.getDoc(fpdModuleId));\r
                     System.out.println("Build " + moduleId + " start >>>");\r
                     System.out.println("Target: " + targetList[i] + " Tagname: " + toolchainList[j] + " Arch: " + archList[k]);\r
                     SurfaceAreaQuery.setDoc(GlobalData.getDoc(fpdModuleId));\r
-                    \r
+\r
                     //\r
                     // Prepare for all other common properties\r
                     // PACKAGE, PACKAGE_GUID, PACKAGE_VERSION, PACKAGE_DIR, PACKAGE_RELATIVE_DIR\r
                     // MODULE or BASE_NAME, GUID or FILE_GUID, VERSION, MODULE_TYPE\r
                     // MODULE_DIR, MODULE_RELATIVE_DIR\r
                     // SUBSYSTEM, ENTRYPOINT, EBC_TOOL_LIB_PATH\r
                     //\r
                     // Prepare for all other common properties\r
                     // PACKAGE, PACKAGE_GUID, PACKAGE_VERSION, PACKAGE_DIR, PACKAGE_RELATIVE_DIR\r
                     // MODULE or BASE_NAME, GUID or FILE_GUID, VERSION, MODULE_TYPE\r
                     // MODULE_DIR, MODULE_RELATIVE_DIR\r
                     // SUBSYSTEM, ENTRYPOINT, EBC_TOOL_LIB_PATH\r
-                    // LIBS, OBJECTS, SDB_FILES\r
                     //\r
                     setModuleCommonProperties(archList[k]);\r
                     //\r
                     setModuleCommonProperties(archList[k]);\r
-                    \r
+\r
                     //\r
                     //\r
-                    // OutputManage prepare for \r
+                    // OutputManage prepare for\r
                     // BIN_DIR, DEST_DIR_DEBUG, DEST_DIR_OUTPUT, BUILD_DIR, FV_DIR\r
                     //\r
                     OutputManager.getInstance().update(getProject());\r
                     // BIN_DIR, DEST_DIR_DEBUG, DEST_DIR_OUTPUT, BUILD_DIR, FV_DIR\r
                     //\r
                     OutputManager.getInstance().update(getProject());\r
-                    \r
+\r
                     if (type.equalsIgnoreCase("all") || type.equalsIgnoreCase("build")) {\r
                         applyBuild(targetList[i], toolchainList[j], fpdModuleId);\r
                     if (type.equalsIgnoreCase("all") || type.equalsIgnoreCase("build")) {\r
                         applyBuild(targetList[i], toolchainList[j], fpdModuleId);\r
-                    }\r
-                    else if (type.equalsIgnoreCase("clean")) {\r
+                    } else if (type.equalsIgnoreCase("clean")) {\r
                         applyClean(fpdModuleId);\r
                         applyClean(fpdModuleId);\r
-                    }\r
-                    else if (type.equalsIgnoreCase("cleanall")) {\r
+                    } else if (type.equalsIgnoreCase("cleanall")) {\r
                         applyCleanall(fpdModuleId);\r
                     }\r
                 }\r
             }\r
         }\r
                         applyCleanall(fpdModuleId);\r
                     }\r
                 }\r
             }\r
         }\r
+        \r
         popProperties();\r
         popProperties();\r
-        }catch (Exception e){\r
-            throw new BuildException(e.getMessage());\r
-        }\r
     }\r
 \r
     /**\r
     }\r
 \r
     /**\r
-      This method is used to prepare Platform-related information. \r
-      \r
+      This method is used to prepare Platform-related information.\r
+\r
       <p>In Single Module Build mode, platform-related information is not ready.\r
       <p>In Single Module Build mode, platform-related information is not ready.\r
-      The method read the system environment variable <code>ACTIVE_PLATFORM</code> \r
+      The method read the system environment variable <code>ACTIVE_PLATFORM</code>\r
       and search in the Framework Database. Note that platform name in the Framework\r
       Database must be unique. </p>\r
       and search in the Framework Database. Note that platform name in the Framework\r
       Database must be unique. </p>\r
-     \r
+\r
     **/\r
     private void prepareSingleModuleBuild(){\r
         //\r
     **/\r
     private void prepareSingleModuleBuild(){\r
         //\r
@@ -328,27 +322,27 @@ public class GenBuildTask extends Ant {
         // TBD: Enhance it!!!!\r
         //\r
         PackageIdentification packageId = GlobalData.getPackageForModule(moduleId);\r
         // TBD: Enhance it!!!!\r
         //\r
         PackageIdentification packageId = GlobalData.getPackageForModule(moduleId);\r
-        \r
+\r
         moduleId.setPackage(packageId);\r
         moduleId.setPackage(packageId);\r
-        \r
+\r
         //\r
         //\r
-        // Read ACTIVE_PLATFORM's FPD file (Call FpdParserTask's method)\r
+        // Read ACTIVE_PLATFORM's FPD file \r
         //\r
         String filename = getProject().getProperty("PLATFORM_FILE");\r
         //\r
         String filename = getProject().getProperty("PLATFORM_FILE");\r
-        \r
+\r
         if (filename == null){\r
         if (filename == null){\r
-            throw new BuildException("Plese set ACTIVE_PLATFORM if you want to build a single module. ");\r
+            throw new BuildException("Please set ACTIVE_PLATFORM in the file: Tools/Conf/target.txt if you want to build a single module!");\r
         }\r
         }\r
-        \r
+\r
         PlatformIdentification platformId = GlobalData.getPlatform(filename);\r
         PlatformIdentification platformId = GlobalData.getPlatform(filename);\r
-        \r
+\r
         //\r
         //\r
-        // Read FPD file\r
+        // Read FPD file (Call FpdParserTask's method)\r
         //\r
         FpdParserTask fpdParser = new FpdParserTask();\r
         fpdParser.setProject(getProject());\r
         fpdParser.parseFpdFile(platformId.getFpdFile());\r
         //\r
         FpdParserTask fpdParser = new FpdParserTask();\r
         fpdParser.setProject(getProject());\r
         fpdParser.parseFpdFile(platformId.getFpdFile());\r
-        \r
+\r
         //\r
         // Prepare for Platform related common properties\r
         // PLATFORM, PLATFORM_DIR, PLATFORM_RELATIVE_DIR\r
         //\r
         // Prepare for Platform related common properties\r
         // PLATFORM, PLATFORM_DIR, PLATFORM_RELATIVE_DIR\r
@@ -361,6 +355,8 @@ public class GenBuildTask extends Ant {
 \r
     /**\r
       Set Module-Related information to properties.\r
 \r
     /**\r
       Set Module-Related information to properties.\r
+      \r
+      @param arch current build ARCH\r
     **/\r
     private void setModuleCommonProperties(String arch) {\r
         //\r
     **/\r
     private void setModuleCommonProperties(String arch) {\r
         //\r
@@ -373,7 +369,7 @@ public class GenBuildTask extends Ant {
         getProject().setProperty("PACKAGE_VERSION", packageId.getVersion());\r
         getProject().setProperty("PACKAGE_DIR", packageId.getPackageDir().replaceAll("(\\\\)", "/"));\r
         getProject().setProperty("PACKAGE_RELATIVE_DIR", packageId.getPackageRelativeDir().replaceAll("(\\\\)", "/"));\r
         getProject().setProperty("PACKAGE_VERSION", packageId.getVersion());\r
         getProject().setProperty("PACKAGE_DIR", packageId.getPackageDir().replaceAll("(\\\\)", "/"));\r
         getProject().setProperty("PACKAGE_RELATIVE_DIR", packageId.getPackageRelativeDir().replaceAll("(\\\\)", "/"));\r
-        \r
+\r
         //\r
         // MODULE or BASE_NAME, GUID or FILE_GUID, VERSION, MODULE_TYPE\r
         // MODULE_DIR, MODULE_RELATIVE_DIR\r
         //\r
         // MODULE or BASE_NAME, GUID or FILE_GUID, VERSION, MODULE_TYPE\r
         // MODULE_DIR, MODULE_RELATIVE_DIR\r
@@ -382,8 +378,7 @@ public class GenBuildTask extends Ant {
         String baseName = SurfaceAreaQuery.getModuleOutputFileBasename();\r
         if (baseName == null) {\r
             getProject().setProperty("BASE_NAME", moduleId.getName());\r
         String baseName = SurfaceAreaQuery.getModuleOutputFileBasename();\r
         if (baseName == null) {\r
             getProject().setProperty("BASE_NAME", moduleId.getName());\r
-        }\r
-        else {\r
+        } else {\r
             getProject().setProperty("BASE_NAME", baseName);\r
         }\r
         getProject().setProperty("GUID", moduleId.getGuid());\r
             getProject().setProperty("BASE_NAME", baseName);\r
         }\r
         getProject().setProperty("GUID", moduleId.getGuid());\r
@@ -392,24 +387,24 @@ public class GenBuildTask extends Ant {
         getProject().setProperty("MODULE_TYPE", moduleId.getModuleType());\r
         getProject().setProperty("MODULE_DIR", moduleId.getMsaFile().getParent().replaceAll("(\\\\)", "/"));\r
         getProject().setProperty("MODULE_RELATIVE_DIR", moduleId.getModuleRelativePath().replaceAll("(\\\\)", "/"));\r
         getProject().setProperty("MODULE_TYPE", moduleId.getModuleType());\r
         getProject().setProperty("MODULE_DIR", moduleId.getMsaFile().getParent().replaceAll("(\\\\)", "/"));\r
         getProject().setProperty("MODULE_RELATIVE_DIR", moduleId.getModuleRelativePath().replaceAll("(\\\\)", "/"));\r
-        \r
+\r
         //\r
         // SUBSYSTEM\r
         //\r
         String[][] subsystemMap = { { "BASE", "EFI_BOOT_SERVICE_DRIVER"},\r
         //\r
         // SUBSYSTEM\r
         //\r
         String[][] subsystemMap = { { "BASE", "EFI_BOOT_SERVICE_DRIVER"},\r
-                                    { "SEC", "EFI_BOOT_SERVICE_DRIVER" }, \r
-                                    { "PEI_CORE", "EFI_BOOT_SERVICE_DRIVER" }, \r
-                                    { "PEIM", "EFI_BOOT_SERVICE_DRIVER" }, \r
+                                    { "SEC", "EFI_BOOT_SERVICE_DRIVER" },\r
+                                    { "PEI_CORE", "EFI_BOOT_SERVICE_DRIVER" },\r
+                                    { "PEIM", "EFI_BOOT_SERVICE_DRIVER" },\r
                                     { "DXE_CORE", "EFI_BOOT_SERVICE_DRIVER" },\r
                                     { "DXE_CORE", "EFI_BOOT_SERVICE_DRIVER" },\r
-                                    { "DXE_DRIVER", "EFI_BOOT_SERVICE_DRIVER" }, \r
-                                    { "DXE_RUNTIME_DRIVER", "EFI_RUNTIME_DRIVER" }, \r
-                                    { "DXE_SAL_DRIVER", "EFI_BOOT_SERVICE_DRIVER" }, \r
-                                    { "DXE_SMM_DRIVER", "EFI_BOOT_SERVICE_DRIVER" }, \r
-                                    { "TOOL", "EFI_BOOT_SERVICE_DRIVER" }, \r
+                                    { "DXE_DRIVER", "EFI_BOOT_SERVICE_DRIVER" },\r
+                                    { "DXE_RUNTIME_DRIVER", "EFI_RUNTIME_DRIVER" },\r
+                                    { "DXE_SAL_DRIVER", "EFI_BOOT_SERVICE_DRIVER" },\r
+                                    { "DXE_SMM_DRIVER", "EFI_BOOT_SERVICE_DRIVER" },\r
+                                    { "TOOL", "EFI_BOOT_SERVICE_DRIVER" },\r
                                     { "UEFI_DRIVER", "EFI_BOOT_SERVICE_DRIVER" },\r
                                     { "UEFI_DRIVER", "EFI_BOOT_SERVICE_DRIVER" },\r
-                                    { "UEFI_APPLICATION", "EFI_APPLICATION" }, \r
-                                    { "USER_DEFINED", "EFI_BOOT_SERVICE_DRIVER"} }; \r
-        \r
+                                    { "UEFI_APPLICATION", "EFI_APPLICATION" },\r
+                                    { "USER_DEFINED", "EFI_BOOT_SERVICE_DRIVER"} };\r
+\r
         String subsystem = "EFI_BOOT_SERVICE_DRIVER";\r
         for (int i = 0; i < subsystemMap.length; i++) {\r
             if (moduleId.getModuleType().equalsIgnoreCase(subsystemMap[i][0])) {\r
         String subsystem = "EFI_BOOT_SERVICE_DRIVER";\r
         for (int i = 0; i < subsystemMap.length; i++) {\r
             if (moduleId.getModuleType().equalsIgnoreCase(subsystemMap[i][0])) {\r
@@ -418,23 +413,17 @@ public class GenBuildTask extends Ant {
             }\r
         }\r
         getProject().setProperty("SUBSYSTEM", subsystem);\r
             }\r
         }\r
         getProject().setProperty("SUBSYSTEM", subsystem);\r
-        \r
+\r
         //\r
         // ENTRYPOINT\r
         //\r
         if (arch.equalsIgnoreCase("EBC")) {\r
             getProject().setProperty("ENTRYPOINT", "EfiStart");\r
         //\r
         // ENTRYPOINT\r
         //\r
         if (arch.equalsIgnoreCase("EBC")) {\r
             getProject().setProperty("ENTRYPOINT", "EfiStart");\r
-        }\r
-        else {\r
+        } else {\r
             getProject().setProperty("ENTRYPOINT", "_ModuleEntryPoint");\r
         }\r
             getProject().setProperty("ENTRYPOINT", "_ModuleEntryPoint");\r
         }\r
-        \r
-        //\r
-        // LIBS, OBJECTS, SDB_FILES\r
-        //\r
+\r
         getProject().setProperty("OBJECTS", "");\r
         getProject().setProperty("OBJECTS", "");\r
-        getProject().setProperty("SDB_FILES", "");\r
-        getProject().setProperty("LIBS", "");\r
     }\r
 \r
     private void getCompilerFlags(String target, String toolchain, FpdModuleIdentification fpdModuleId) throws EdkException {\r
     }\r
 \r
     private void getCompilerFlags(String target, String toolchain, FpdModuleIdentification fpdModuleId) throws EdkException {\r
@@ -444,82 +433,79 @@ public class GenBuildTask extends Ant {
             // Set cmd, like CC, DLINK\r
             //\r
             String[] key = new String[]{target, toolchain, fpdModuleId.getArch(), cmd[m], null};\r
             // Set cmd, like CC, DLINK\r
             //\r
             String[] key = new String[]{target, toolchain, fpdModuleId.getArch(), cmd[m], null};\r
-            key[4] = "PATH";\r
+            key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_PATH;\r
             String cmdPath = GlobalData.getCommandSetting(key, fpdModuleId);\r
             String cmdPath = GlobalData.getCommandSetting(key, fpdModuleId);\r
-            key[4] = "NAME";\r
+            key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_NAME;\r
             String cmdName = GlobalData.getCommandSetting(key, fpdModuleId);\r
             File cmdFile = new File(cmdPath + File.separatorChar + cmdName);\r
             getProject().setProperty(cmd[m], cmdFile.getPath().replaceAll("(\\\\)", "/"));\r
             String cmdName = GlobalData.getCommandSetting(key, fpdModuleId);\r
             File cmdFile = new File(cmdPath + File.separatorChar + cmdName);\r
             getProject().setProperty(cmd[m], cmdFile.getPath().replaceAll("(\\\\)", "/"));\r
-            \r
+\r
             //\r
             // set CC_FLAGS\r
             //\r
             //\r
             // set CC_FLAGS\r
             //\r
-            key[4] = "FLAGS";\r
+            key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FLAGS;\r
             String cmdFlags = GlobalData.getCommandSetting(key, fpdModuleId);\r
             Set<String> addset = new LinkedHashSet<String>();\r
             Set<String> subset = new LinkedHashSet<String>();\r
             putFlagsToSet(addset, cmdFlags);\r
             getProject().setProperty(cmd[m] + "_FLAGS", getProject().replaceProperties(getFlags(addset, subset)));\r
             String cmdFlags = GlobalData.getCommandSetting(key, fpdModuleId);\r
             Set<String> addset = new LinkedHashSet<String>();\r
             Set<String> subset = new LinkedHashSet<String>();\r
             putFlagsToSet(addset, cmdFlags);\r
             getProject().setProperty(cmd[m] + "_FLAGS", getProject().replaceProperties(getFlags(addset, subset)));\r
-            \r
+\r
             //\r
             // Set CC_EXT\r
             //\r
             //\r
             // Set CC_EXT\r
             //\r
-            key[4] = "EXT";\r
+            key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_EXT;\r
             String extName = GlobalData.getCommandSetting(key, fpdModuleId);\r
             if ( extName != null && ! extName.equalsIgnoreCase("")) {\r
                 getProject().setProperty(cmd[m] + "_EXT", extName);\r
             String extName = GlobalData.getCommandSetting(key, fpdModuleId);\r
             if ( extName != null && ! extName.equalsIgnoreCase("")) {\r
                 getProject().setProperty(cmd[m] + "_EXT", extName);\r
-            }\r
-            else {\r
+            } else {\r
                 getProject().setProperty(cmd[m] + "_EXT", "");\r
             }\r
                 getProject().setProperty(cmd[m] + "_EXT", "");\r
             }\r
-            \r
+\r
             //\r
             // set CC_FAMILY\r
             //\r
             //\r
             // set CC_FAMILY\r
             //\r
-            key[4] = "FAMILY";\r
+            key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FAMILY;\r
             String toolChainFamily = GlobalData.getCommandSetting(key, fpdModuleId);\r
             if (toolChainFamily != null) {\r
                 getProject().setProperty(cmd[m] + "_FAMILY", toolChainFamily);\r
             }\r
             String toolChainFamily = GlobalData.getCommandSetting(key, fpdModuleId);\r
             if (toolChainFamily != null) {\r
                 getProject().setProperty(cmd[m] + "_FAMILY", toolChainFamily);\r
             }\r
-            \r
+\r
             //\r
             // set CC_SPATH\r
             //\r
             //\r
             // set CC_SPATH\r
             //\r
-            key[4] = "SPATH";\r
+            key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_SPATH;\r
             String spath = GlobalData.getCommandSetting(key, fpdModuleId);\r
             if (spath != null) {\r
                 getProject().setProperty(cmd[m] + "_SPATH", spath.replaceAll("(\\\\)", "/"));\r
             String spath = GlobalData.getCommandSetting(key, fpdModuleId);\r
             if (spath != null) {\r
                 getProject().setProperty(cmd[m] + "_SPATH", spath.replaceAll("(\\\\)", "/"));\r
-            }\r
-            else {\r
+            } else {\r
                 getProject().setProperty(cmd[m] + "_SPATH", "");\r
             }\r
                 getProject().setProperty(cmd[m] + "_SPATH", "");\r
             }\r
-            \r
+\r
             //\r
             // set CC_DPATH\r
             //\r
             //\r
             // set CC_DPATH\r
             //\r
-            key[4] = "DPATH";\r
+            key[4] = ToolDefinitions.TOOLS_DEF_ATTRIBUTE_DPATH;\r
             String dpath = GlobalData.getCommandSetting(key, fpdModuleId);\r
             if (dpath != null) {\r
                 getProject().setProperty(cmd[m] + "_DPATH", dpath.replaceAll("(\\\\)", "/"));\r
             String dpath = GlobalData.getCommandSetting(key, fpdModuleId);\r
             if (dpath != null) {\r
                 getProject().setProperty(cmd[m] + "_DPATH", dpath.replaceAll("(\\\\)", "/"));\r
-            }\r
-            else {\r
+            } else {\r
                 getProject().setProperty(cmd[m] + "_DPATH", "");\r
             }\r
         }\r
     }\r
                 getProject().setProperty(cmd[m] + "_DPATH", "");\r
             }\r
         }\r
     }\r
-    \r
+\r
     public void setMsaFile(File msaFile) {\r
         this.msaFile = msaFile;\r
     }\r
 \r
     /**\r
     public void setMsaFile(File msaFile) {\r
         this.msaFile = msaFile;\r
     }\r
 \r
     /**\r
-      Method is for ANT to initialize MSA file. \r
-      \r
+      Method is for ANT to initialize MSA file.\r
+\r
       @param msaFilename MSA file name\r
     **/\r
     public void setMsaFile(String msaFilename) {\r
         String moduleDir = getProject().getProperty("MODULE_DIR");\r
       @param msaFilename MSA file name\r
     **/\r
     public void setMsaFile(String msaFilename) {\r
         String moduleDir = getProject().getProperty("MODULE_DIR");\r
-        \r
+\r
         //\r
         // If is Single Module Build, then use the Base Dir defined in build.xml\r
         //\r
         //\r
         // If is Single Module Build, then use the Base Dir defined in build.xml\r
         //\r
@@ -528,17 +514,17 @@ public class GenBuildTask extends Ant {
         }\r
         msaFile = new File(moduleDir + File.separatorChar + msaFilename);\r
     }\r
         }\r
         msaFile = new File(moduleDir + File.separatorChar + msaFilename);\r
     }\r
-    \r
+\r
     public void addConfiguredModuleItem(ModuleItem moduleItem) {\r
         PackageIdentification packageId = new PackageIdentification(moduleItem.getPackageGuid(), moduleItem.getPackageVersion());\r
         ModuleIdentification moduleId = new ModuleIdentification(moduleItem.getModuleGuid(), moduleItem.getModuleVersion());\r
         moduleId.setPackage(packageId);\r
         this.moduleId = moduleId;\r
     }\r
     public void addConfiguredModuleItem(ModuleItem moduleItem) {\r
         PackageIdentification packageId = new PackageIdentification(moduleItem.getPackageGuid(), moduleItem.getPackageVersion());\r
         ModuleIdentification moduleId = new ModuleIdentification(moduleItem.getModuleGuid(), moduleItem.getModuleVersion());\r
         moduleId.setPackage(packageId);\r
         this.moduleId = moduleId;\r
     }\r
-    \r
+\r
     /**\r
     /**\r
-      Add a property. \r
-    \r
+      Add a property.\r
+\r
       @param p property\r
     **/\r
     public void addProperty(Property p) {\r
       @param p property\r
     **/\r
     public void addProperty(Property p) {\r
@@ -548,20 +534,25 @@ public class GenBuildTask extends Ant {
     public void setType(String type) {\r
         this.type = type;\r
     }\r
     public void setType(String type) {\r
         this.type = type;\r
     }\r
-    \r
-    private void applyBuild(String buildTarget, String buildTagname, FpdModuleIdentification fpdModuleId) throws EdkException{\r
+\r
+    private void applyBuild(String buildTarget, String buildTagname, FpdModuleIdentification fpdModuleId) throws BuildException{\r
         //\r
         // AutoGen\r
         //\r
         //\r
         // AutoGen\r
         //\r
-        \r
+\r
         AutoGen autogen = new AutoGen(getProject().getProperty("FV_DIR"), getProject().getProperty("DEST_DIR_DEBUG"), fpdModuleId.getModule(),fpdModuleId.getArch());\r
         autogen.genAutogen();\r
         AutoGen autogen = new AutoGen(getProject().getProperty("FV_DIR"), getProject().getProperty("DEST_DIR_DEBUG"), fpdModuleId.getModule(),fpdModuleId.getArch());\r
         autogen.genAutogen();\r
-        \r
-        \r
+\r
+\r
         //\r
         // Get compiler flags\r
         //\r
         //\r
         // Get compiler flags\r
         //\r
-        getCompilerFlags(buildTarget, buildTagname, fpdModuleId);\r
+        try {\r
+            getCompilerFlags(buildTarget, buildTagname, fpdModuleId);\r
+        }\r
+        catch (EdkException ee) {\r
+            throw new BuildException(ee.getMessage());\r
+        }\r
         \r
         //\r
         // Prepare LIBS\r
         \r
         //\r
         // Prepare LIBS\r
@@ -572,22 +563,20 @@ public class GenBuildTask extends Ant {
             propertyLibs += " " + getProject().getProperty("BIN_DIR") + File.separatorChar + libinstances[i].getName() + ".lib";\r
         }\r
         getProject().setProperty("LIBS", propertyLibs.replaceAll("(\\\\)", "/"));\r
             propertyLibs += " " + getProject().getProperty("BIN_DIR") + File.separatorChar + libinstances[i].getName() + ".lib";\r
         }\r
         getProject().setProperty("LIBS", propertyLibs.replaceAll("(\\\\)", "/"));\r
-        \r
+\r
         //\r
         // if it is CUSTOM_BUILD\r
         // then call the exist BaseName_build.xml directly.\r
         //\r
         if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) {\r
             GlobalData.log.info("Call user-defined " + moduleId.getName() + "_build.xml");\r
         //\r
         // if it is CUSTOM_BUILD\r
         // then call the exist BaseName_build.xml directly.\r
         //\r
         if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) {\r
             GlobalData.log.info("Call user-defined " + moduleId.getName() + "_build.xml");\r
-            Ant ant = new Ant();\r
-            ant.setProject(getProject());\r
-            ant.setAntfile(getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml");\r
-            ant.setInheritAll(true);\r
-            ant.init();\r
-            ant.execute();\r
+            \r
+            String antFilename = getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml";\r
+            antCall(antFilename, null);\r
+            \r
             return ;\r
         }\r
             return ;\r
         }\r
-        \r
+\r
         //\r
         // Generate ${BASE_NAME}_build.xml\r
         // TBD\r
         //\r
         // Generate ${BASE_NAME}_build.xml\r
         // TBD\r
@@ -596,94 +585,76 @@ public class GenBuildTask extends Ant {
         ModuleBuildFileGenerator fileGenerator = new ModuleBuildFileGenerator(getProject(), ffsKeyword, fpdModuleId);\r
         String buildFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml";\r
         fileGenerator.genBuildFile(buildFilename);\r
         ModuleBuildFileGenerator fileGenerator = new ModuleBuildFileGenerator(getProject(), ffsKeyword, fpdModuleId);\r
         String buildFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml";\r
         fileGenerator.genBuildFile(buildFilename);\r
-        \r
+\r
         //\r
         // Ant call ${BASE_NAME}_build.xml\r
         //\r
         //\r
         // Ant call ${BASE_NAME}_build.xml\r
         //\r
-        Ant ant = new Ant();\r
-        ant.setProject(getProject());\r
-        ant.setAntfile(getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml");\r
-        ant.setInheritAll(true);\r
-        ant.init();\r
-        ant.execute();\r
+        String antFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml";\r
+        antCall(antFilename, null);\r
     }\r
     }\r
-    \r
+\r
     private void applyClean(FpdModuleIdentification fpdModuleId){\r
         //\r
         // if it is CUSTOM_BUILD\r
         // then call the exist BaseName_build.xml directly.\r
         //\r
         if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) {\r
     private void applyClean(FpdModuleIdentification fpdModuleId){\r
         //\r
         // if it is CUSTOM_BUILD\r
         // then call the exist BaseName_build.xml directly.\r
         //\r
         if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) {\r
-            GlobalData.log.info("Call user-defined " + moduleId.getName() + "_build.xml");\r
-            Ant ant = new Ant();\r
-            ant.setProject(getProject());\r
-            ant.setAntfile(getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml");\r
-            ant.setTarget("clean");\r
-            ant.setInheritAll(true);\r
-            ant.init();\r
-            ant.execute();\r
+            GlobalData.log.info("Calling user-defined " + moduleId.getName() + "_build.xml");\r
+            \r
+            String antFilename = getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml";\r
+            antCall(antFilename, "clean");\r
+            \r
             return ;\r
         }\r
             return ;\r
         }\r
-        \r
-        Ant ant = new Ant();\r
-        ant.setProject(getProject());\r
-        ant.setAntfile(getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml");\r
-        ant.setTarget("clean");\r
-        ant.setInheritAll(true);\r
-        ant.init();\r
-        ant.execute();\r
-        \r
-        //\r
-        // Delete current module's DEST_DIR_OUTPUT\r
-        // TBD\r
+\r
+        String antFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml";\r
+        antCall(antFilename, "clean");\r
     }\r
     }\r
-    \r
+\r
     private void applyCleanall(FpdModuleIdentification fpdModuleId){\r
         //\r
         // if it is CUSTOM_BUILD\r
         // then call the exist BaseName_build.xml directly.\r
         //\r
         if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) {\r
     private void applyCleanall(FpdModuleIdentification fpdModuleId){\r
         //\r
         // if it is CUSTOM_BUILD\r
         // then call the exist BaseName_build.xml directly.\r
         //\r
         if (moduleId.getModuleType().equalsIgnoreCase("USER_DEFINED")) {\r
-            GlobalData.log.info("Call user-defined " + moduleId.getName() + "_build.xml");\r
-            Ant ant = new Ant();\r
-            ant.setProject(getProject());\r
-            ant.setAntfile(getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml");\r
-            ant.setTarget("cleanall");\r
-            ant.setInheritAll(true);\r
-            ant.init();\r
-            ant.execute();\r
+            GlobalData.log.info("Calling user-defined " + moduleId.getName() + "_build.xml");\r
+\r
+            String antFilename = getProject().getProperty("MODULE_DIR") + File.separatorChar + moduleId.getName() + "_build.xml";\r
+            antCall(antFilename, "cleanall");\r
+            \r
             return ;\r
         }\r
         \r
             return ;\r
         }\r
         \r
+        String antFilename = getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml";\r
+        antCall(antFilename, "cleanall");\r
+    }\r
+\r
+    private void antCall(String antFilename, String target) {\r
         Ant ant = new Ant();\r
         ant.setProject(getProject());\r
         Ant ant = new Ant();\r
         ant.setProject(getProject());\r
-        ant.setAntfile(getProject().getProperty("DEST_DIR_OUTPUT") + File.separatorChar + moduleId.getName() + "_build.xml");\r
-        ant.setTarget("cleanall");\r
+        ant.setAntfile(antFilename);\r
+        if (target != null) {\r
+            ant.setTarget(target);\r
+        }\r
         ant.setInheritAll(true);\r
         ant.init();\r
         ant.execute();\r
         ant.setInheritAll(true);\r
         ant.init();\r
         ant.execute();\r
-        \r
-        //\r
-        // Delete current module's DEST_DIR_OUTPUT\r
-        // TBD\r
     }\r
 \r
 \r
     }\r
 \r
 \r
-\r
-\r
     /**\r
       Separate the string and instore in set.\r
     /**\r
       Separate the string and instore in set.\r
-       \r
-      <p> String is separated by Java Regulation Expression \r
+\r
+      <p> String is separated by Java Regulation Expression\r
       "[^\\\\]?(\".*?[^\\\\]\")[ \t,]+". </p>\r
       "[^\\\\]?(\".*?[^\\\\]\")[ \t,]+". </p>\r
-      \r
+\r
       <p>For example: </p>\r
       <p>For example: </p>\r
-      \r
+\r
       <pre>\r
         "/nologo", "/W3", "/WX"\r
         "/C", "/DSTRING_DEFINES_FILE=\"BdsStrDefs.h\""\r
       </pre>\r
       <pre>\r
         "/nologo", "/W3", "/WX"\r
         "/C", "/DSTRING_DEFINES_FILE=\"BdsStrDefs.h\""\r
       </pre>\r
-      \r
+\r
       @param set store the separated string\r
       @param str string to separate\r
     **/\r
       @param set store the separated string\r
       @param str string to separate\r
     **/\r
@@ -699,10 +670,10 @@ public class GenBuildTask extends Ant {
             set.add(item);\r
         }\r
     }\r
             set.add(item);\r
         }\r
     }\r
-    \r
+\r
     /**\r
     /**\r
-      Generate the final flags string will be used by compile command. \r
-      \r
+      Generate the final flags string will be used by compile command.\r
+\r
       @param add the add flags set\r
       @param sub the sub flags set\r
       @return final flags after add set substract sub set\r
       @param add the add flags set\r
       @param sub the sub flags set\r
       @return final flags after add set substract sub set\r
@@ -718,64 +689,10 @@ public class GenBuildTask extends Ant {
         return result;\r
     }\r
 \r
         return result;\r
     }\r
 \r
-    /**\r
-      Generate the flags string with original format. The format is defined by \r
-      Java Regulation Expression "[^\\\\]?(\".*?[^\\\\]\")[ \t,]+". </p>\r
-      \r
-      <p>For example: </p>\r
-      \r
-      <pre>\r
-        "/nologo", "/W3", "/WX"\r
-        "/C", "/DSTRING_DEFINES_FILE=\"BdsStrDefs.h\""\r
-      </pre>\r
-      \r
-      @param add the add flags set\r
-      @param sub the sub flags set\r
-      @return flags with original format\r
-    **/\r
-    private String getRawFlags(Set<String> add, Set<String> sub) {\r
-        String result = null;\r
-        add.removeAll(sub);\r
-        Iterator iter = add.iterator();\r
-        while (iter.hasNext()) {\r
-            String str = (String) iter.next();\r
-            result += "\"" + str.substring(1, str.length() - 1) + "\", ";\r
-        }\r
-        return result;\r
-    }\r
-\r
-    private String parseOptionString(String optionString, Set<String> addSet, Set<String> subSet) {\r
-        boolean overrideOption = false;\r
-        Pattern pattern = Pattern.compile("ADD\\.\\[(.+)\\]");\r
-        Matcher matcher = pattern.matcher(optionString);\r
-\r
-        while (matcher.find()) {\r
-            overrideOption = true;\r
-            String addOption = optionString.substring(matcher.start(1), matcher.end(1)).trim();\r
-            putFlagsToSet(addSet, addOption);\r
-            \r
-        }\r
-\r
-        pattern = Pattern.compile("SUB\\.\\[(.+)\\]");\r
-        matcher = pattern.matcher(optionString);\r
-\r
-        while (matcher.find()) {\r
-            overrideOption = true;\r
-            String subOption = optionString.substring(matcher.start(1), matcher.end(1)).trim();\r
-            putFlagsToSet(subSet, subOption);\r
-        }\r
-\r
-        if (overrideOption == true) {\r
-            return null;\r
-        }\r
-\r
-        return optionString;\r
-    }\r
-    \r
     private void pushProperties() {\r
         backupPropertiesStack.push(getProject().getProperties());\r
     }\r
     private void pushProperties() {\r
         backupPropertiesStack.push(getProject().getProperties());\r
     }\r
-    \r
+\r
     private void popProperties() {\r
         Hashtable backupProperties = backupPropertiesStack.pop();\r
         Set keys = backupProperties.keySet();\r
     private void popProperties() {\r
         Hashtable backupProperties = backupPropertiesStack.pop();\r
         Set keys = backupProperties.keySet();\r