]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Java/Source/GenBuild/org/tianocore/build/FrameworkBuildTask.java
Fixed EDKT482. Added support for multiple msa files in the same directory.
[mirror_edk2.git] / Tools / Java / Source / GenBuild / org / tianocore / build / FrameworkBuildTask.java
index 440510b522dbb106969ba8a1550e57d7a73f3c73..84e799d00c63245f1f5fcb8cd628752165e08a9c 100644 (file)
  **/\r
 package org.tianocore.build;\r
 \r
-import java.io.BufferedReader;\r
 import java.io.File;\r
 import java.io.IOException;\r
-import java.io.InputStreamReader;\r
 import java.util.Hashtable;\r
 import java.util.Iterator;\r
 import java.util.LinkedHashSet;\r
@@ -57,8 +55,7 @@ import org.tianocore.common.logger.EdkLog;
   4. No MSA file, and ACTIVE_PLATFORM is specified, build the active platform;\r
   5. No MSA file, no ACTIVE_PLATFORM, and no FPD file, report error;\r
   6. No MSA file, no ACTIVE_PLATFORM, and only one FPD file, build the platform;\r
-  7. No MSA file, no ACTIVE_PLATFORM, and more than one FPD files, list all platform\r
-  and let user choose one. \r
+  7. No MSA file, no ACTIVE_PLATFORM, and more than one FPD files, Report Error!\r
   </pre>\r
   \r
   <p>\r
@@ -76,15 +73,13 @@ import org.tianocore.common.logger.EdkLog;
 **/\r
 public class FrameworkBuildTask extends Task{\r
 \r
-    private Set<File> buildFiles = new LinkedHashSet<File>();\r
-    \r
     private Set<File> fpdFiles = new LinkedHashSet<File>();\r
     \r
     private Set<File> msaFiles = new LinkedHashSet<File>();\r
     \r
-    //\r
-    // This is only for none-multi-thread build to reduce overriding message\r
-    //\r
+    ///\r
+    /// This is only for none-multi-thread build to reduce overriding message\r
+    ///\r
     public static Hashtable<String, String> originalProperties = new Hashtable<String, String>();\r
     \r
     String toolsDefFilename = ToolDefinitions.DEFAULT_TOOLS_DEF_FILE_PATH;\r
@@ -115,11 +110,17 @@ public class FrameworkBuildTask extends Task{
         // set Logger\r
         //\r
         GenBuildLogger logger = new GenBuildLogger(getProject());\r
+        EdkLog.setLogLevel(EdkLog.EDK_DEBUG);\r
         EdkLog.setLogLevel(getProject().getProperty("env.LOGLEVEL"));\r
         EdkLog.setLogger(logger);\r
         \r
         try {\r
             processFrameworkBuild();\r
+        }catch (BuildException e) {\r
+            //\r
+            // Add more logic process here\r
+            //\r
+            throw new BuildException(e.getMessage());\r
         } catch (PcdAutogenException e) {\r
             //\r
             // Add more logic process here\r
@@ -149,32 +150,27 @@ public class FrameworkBuildTask extends Task{
     }\r
     \r
     private void processFrameworkBuild() throws EdkException, GenBuildException, AutoGenException, PcdAutogenException, PlatformPcdPreprocessBuildException {\r
-        //\r
-        // Seach build.xml -> .FPD -> .MSA file\r
-        //\r
         try {\r
             //\r
-            // Gen Current Working Directory\r
+            // Get current working dir\r
             //\r
             File dummyFile = new File(".");\r
             File cwd = dummyFile.getCanonicalFile();\r
             File[] files = cwd.listFiles();\r
+            \r
+            //\r
+            // Scan current dir, and find out all .FPD and .MSA files\r
+            //\r
             for (int i = 0; i < files.length; i++) {\r
                 if (files[i].isFile()) {\r
-                    if (files[i].getName().equalsIgnoreCase("build.xml")) {\r
+                    if (files[i].getName().endsWith(ToolDefinitions.FPD_EXTENSION)) {\r
                         //\r
-                        // First, search build.xml, if found, ANT call it\r
-                        //\r
-                        buildFiles.add(files[i]);\r
-\r
-                    } else if (files[i].getName().endsWith(ToolDefinitions.FPD_EXTENSION)) {\r
-                        //\r
-                        // Second, search FPD file, if found, build it\r
+                        // Found FPD file\r
                         //\r
                         fpdFiles.add(files[i]);\r
                     } else if (files[i].getName().endsWith(ToolDefinitions.MSA_EXTENSION)) {\r
                         //\r
-                        // Third, search MSA file, if found, build it\r
+                        // Found MSA file\r
                         //\r
                         msaFiles.add(files[i]);\r
                     }\r
@@ -187,9 +183,9 @@ public class FrameworkBuildTask extends Task{
         }\r
         \r
         //\r
-        // Deal with all environment variable (Add them to properties)\r
+        // Import all system environment variables to ANT properties\r
         //\r
-        backupSystemProperties();\r
+        importSystemEnvVariables();\r
         \r
         //\r
         // Read target.txt file\r
@@ -208,14 +204,13 @@ public class FrameworkBuildTask extends Task{
         // else fail build. \r
         // If without MSA file, and ACTIVE_PLATFORM is set, build the ACTIVE_PLATFORM. \r
         // If ACTIVE_PLATFORM is not set, and only find one FPD file, build the platform; \r
-        // If find more than one FPD files, let user select one. \r
+        // If find more than one FPD files, report error.  \r
         //\r
         File buildFile = null;\r
-        if (msaFiles.size() > 1) {\r
-            throw new BuildException("Having more than one MSA file in a directory is not allowed!");\r
-        } else if (msaFiles.size() == 1 && activePlatform == null) {\r
-            throw new BuildException("If trying to build a single module, please set ACTIVE_PLATFORM in file [" + targetFilename + "]. ");\r
-        } else if (msaFiles.size() == 1 && activePlatform != null) {\r
+        if (msaFiles.size() > 0) {\r
+            if (activePlatform == null) {\r
+                throw new BuildException("If trying to build a single module, please set ACTIVE_PLATFORM in file [" + targetFilename + "]. ");\r
+            }\r
             //\r
             // Build the single module\r
             //\r
@@ -225,8 +220,9 @@ public class FrameworkBuildTask extends Task{
         } else if (fpdFiles.size() == 1) {\r
             buildFile = fpdFiles.toArray(new File[1])[0];\r
         } else if (fpdFiles.size() > 1) {\r
-            buildFile = intercommuniteWithUser();\r
+            throw new BuildException("Found " + fpdFiles.size() + " FPD files in current dir. ");\r
         }\r
+        \r
         //\r
         // If there is no build files or FPD files or MSA files, stop build\r
         //\r
@@ -281,26 +277,30 @@ public class FrameworkBuildTask extends Task{
             }\r
             File tmpFile = new File(GlobalData.getWorkspacePath() + File.separatorChar + activePlatform);\r
             EdkLog.log(this, "Using the FPD file [" + tmpFile.getPath() + "] for the active platform. ");\r
-            EdkLog.log(this, "Processing the MSA file [" + buildFile.getPath() + "] ..>> ");\r
-            GenBuildTask genBuildTask = new GenBuildTask();\r
-            genBuildTask.setSingleModuleBuild(true);\r
-            genBuildTask.setType(type);\r
-            getProject().setProperty("PLATFORM_FILE", activePlatform);\r
-            if( !multithread) {\r
-                originalProperties.put("PLATFORM_FILE", activePlatform);\r
+\r
+            File[] moduleFiles = msaFiles.toArray(new File[msaFiles.size()]);\r
+            for (int i = 0; i < moduleFiles.length; ++i) {\r
+                EdkLog.log(this, "Processing the MSA file [" + moduleFiles[i].getPath() + "] ..>> ");\r
+                GenBuildTask genBuildTask = new GenBuildTask();\r
+                genBuildTask.setSingleModuleBuild(true);\r
+                genBuildTask.setType(type);\r
+                getProject().setProperty("PLATFORM_FILE", activePlatform);\r
+                if( !multithread) {\r
+                    originalProperties.put("PLATFORM_FILE", activePlatform);\r
+                }\r
+                genBuildTask.setProject(getProject());\r
+                genBuildTask.setMsaFile(moduleFiles[i]);\r
+                genBuildTask.perform();\r
             }\r
-            genBuildTask.setProject(getProject());\r
-            genBuildTask.setMsaFile(buildFile);\r
-            genBuildTask.perform();\r
         }\r
     }\r
     \r
     /**\r
-      Transfer system environment variables to ANT properties. If system variable \r
+      Import system environment variables to ANT properties. If system variable \r
       already exiests in ANT properties, skip it.\r
       \r
     **/\r
-    private void backupSystemProperties() {\r
+    private void importSystemEnvVariables() {\r
         Map<String, String> sysProperties = System.getenv();\r
         Iterator<String> iter = sysProperties.keySet().iterator();\r
         while (iter.hasNext()) {\r
@@ -322,54 +322,6 @@ public class FrameworkBuildTask extends Task{
         }\r
     }\r
 \r
-    private File intercommuniteWithUser(){\r
-        File file = null;\r
-        if (fpdFiles.size() > 1) {\r
-            File[] allFiles = new File[fpdFiles.size()];\r
-            int index = 0;\r
-            Iterator<File> iter = fpdFiles.iterator();\r
-            while (iter.hasNext()) {\r
-                allFiles[index] = iter.next();\r
-                index++;\r
-            }\r
-\r
-            EdkLog.log(this, "Finding " + allFiles.length + " FPD files: ");\r
-            for (int i = 0; i < allFiles.length; i++) {\r
-                System.out.println("[" + (i + 1) + "]: " + allFiles[i].getName());\r
-            }\r
-            \r
-            boolean flag = true;\r
-            EdkLog.log(this, "Please select one of the following FPD files to build:[1] ");\r
-            do{\r
-                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));\r
-                try {\r
-                     String str = br.readLine();\r
-                     if (str.trim().length() == 0) {\r
-                         file = allFiles[0];\r
-                         flag = false;\r
-                         continue ;\r
-                     }\r
-                     int indexSelect = Integer.parseInt(str);\r
-                     if (indexSelect <=0 || indexSelect > allFiles.length) {\r
-                         EdkLog.log(this, "Please enter a number between [1.." + allFiles.length + "]:[1] ");\r
-                         continue ;\r
-                     } else {\r
-                         file = allFiles[indexSelect - 1];\r
-                         flag = false;\r
-                         continue ;\r
-                     }\r
-                } catch (Exception e) {\r
-                    EdkLog.log(this, "Please enter a valid number:[1] ");\r
-                    flag = true;\r
-                }\r
-            } while (flag);\r
-        } else if (fpdFiles.size() == 1) {\r
-            file = fpdFiles.toArray(new File[1])[0];\r
-        }\r
-        return file;\r
-    }\r
-    \r
-    \r
     public void setType(String type) {\r
         if (type.equalsIgnoreCase("clean") || type.equalsIgnoreCase("cleanall")) {\r
             this.type = type.toLowerCase();\r
@@ -426,13 +378,20 @@ public class FrameworkBuildTask extends Task{
         }\r
 \r
         str = getValue(ToolDefinitions.TARGET_KEY_MAX_CONCURRENT_THREAD_NUMBER, targetFileInfo);\r
-        if (str != null ) {\r
+        //\r
+        // Need to check the # of threads iff multithread is enabled.\r
+        //\r
+        if ((multithread) && (str != null )) {\r
             try {\r
                 int threadNum = Integer.parseInt(str);\r
                 if (threadNum > 0) {\r
                     MAX_CONCURRENT_THREAD_NUMBER = threadNum;\r
                 }\r
             } catch (Exception ex) {\r
+                //\r
+                // Give a warning message, and keep the default value\r
+                //\r
+                EdkLog.log(this, EdkLog.EDK_WARNING, "Incorrent number specified for MAX_CONCURRENT_THREAD_NUMBER in file [" + targetFilename + "]");\r
             }\r
         }\r
     }\r