Fixed EDKT493. Added support to "SupModuleList" for checking if a library instance...
[mirror_edk2.git] / Tools / Java / Source / GenBuild / org / tianocore / build / autogen / AutoGen.java
index 5925e504f63f9bb81a94fed2aeabaf1238643fe5..ce6ff6184221a37cb793dd21b9eee2feb51234c0 100644 (file)
@@ -347,8 +347,8 @@ public class AutoGen {
         //\r
         // Write library class's related *.h file to autogen.h.\r
         //\r
-        String[] libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSCONSUMED,this.arch);\r
-        if (libClassList != null) {\r
+        String[] libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSCONSUMED, this.arch, null);\r
+        if (libClassList.length > 0) {\r
             libClassIncludeH = LibraryClassToAutogenH(libClassList);\r
             item = libClassIncludeH.iterator();\r
             while (item.hasNext()) {\r
@@ -356,8 +356,8 @@ public class AutoGen {
             }\r
         }\r
 \r
-        libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSPRODUCED, this.arch);\r
-        if (libClassList != null) {\r
+        libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSPRODUCED, this.arch, null);\r
+        if (libClassList.length > 0) {\r
             libClassIncludeH = LibraryClassToAutogenH(libClassList);\r
             item = libClassIncludeH.iterator();\r
             while (item.hasNext()) {\r
@@ -584,7 +584,7 @@ public class AutoGen {
         //\r
         // Write library class's related *.h file to autogen.h\r
         //\r
-        String[] libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSCONSUMED, this.arch);\r
+        String[] libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSCONSUMED, this.arch, null);\r
         if (libClassList != null) {\r
             libClassIncludeH = LibraryClassToAutogenH(libClassList);\r
             item = libClassIncludeH.iterator();\r
@@ -593,7 +593,7 @@ public class AutoGen {
             }\r
         }\r
 \r
-        libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSPRODUCED, this.arch);\r
+        libClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSPRODUCED, this.arch, null);\r
         if (libClassList != null) {\r
             libClassIncludeH = LibraryClassToAutogenH(libClassList);\r
             item = libClassIncludeH.iterator();\r
@@ -1354,12 +1354,11 @@ public class AutoGen {
         //\r
         // Add library constructor to AutoGen.c\r
         //\r
-        LibConstructorToAutogenC(libConstructList, moduleType,\r
-                                 fileBuffer/* autogenC */);\r
+        LibConstructorToAutogenC(libConstructList, moduleType, fileBuffer);\r
         //\r
         // Add library destructor to AutoGen.c\r
         //\r
-        LibDestructorToAutogenC(libDestructList, moduleType, fileBuffer/* autogenC */);\r
+        LibDestructorToAutogenC(libDestructList, moduleType, fileBuffer);\r
     }\r
 \r
     /**\r
@@ -2106,6 +2105,7 @@ public class AutoGen {
     private void collectLibInstanceInfo() throws EdkException{\r
         int index;\r
 \r
+        String moduleType = moduleId.getModuleType();\r
         String libConstructName = null;\r
         String libDestructName = null;\r
         String libModuleType   = null;\r
@@ -2113,112 +2113,118 @@ public class AutoGen {
         String[] exitBoots = null;\r
 \r
         ModuleIdentification[] libraryIdList = saq.getLibraryInstance(this.arch);\r
+        if (libraryIdList.length <= 0) {\r
+            return;\r
+        }\r
+        //\r
+        // Reorder library instance sequence.\r
+        //\r
+        AutogenLibOrder libOrder = new AutogenLibOrder(libraryIdList, this.arch);\r
+        List<ModuleIdentification> orderList = libOrder.orderLibInstance();\r
+        //\r
+        // Process library instance one by one.\r
+        //\r
+        for (int i = 0; i < orderList.size(); i++) {\r
+            //\r
+            // Get library instance basename.\r
+            //\r
+            ModuleIdentification libInstanceId = orderList.get(i);\r
 \r
-        if (libraryIdList != null) {\r
             //\r
-            // Reorder library instance sequence.\r
+            // Get override map\r
             //\r
-            AutogenLibOrder libOrder = new AutogenLibOrder(libraryIdList,\r
-                                                           this.arch);\r
-            List<ModuleIdentification> orderList = libOrder\r
-                                                   .orderLibInstance();\r
 \r
-            if (orderList != null) {\r
-                //\r
-                // Process library instance one by one.\r
-                //\r
-                for (int i = 0; i < orderList.size(); i++) {\r
-                    //\r
-                    // Get library instance basename.\r
-                    //\r
-                    ModuleIdentification libInstanceId = orderList.get(i);\r
-\r
-                    //\r
-                    // Get override map\r
-                    //\r
-\r
-                    Map<String, XmlObject> libDoc = GlobalData.getDoc(libInstanceId, this.arch);\r
-                    saq.push(libDoc);\r
-                    //\r
-                    // Get <PPis>, <Protocols>, <Guids> list of this library\r
-                    // instance.\r
-                    //\r
-                    String[] ppiList = saq.getPpiArray(this.arch);\r
-                    String[] ppiNotifyList = saq.getPpiNotifyArray(this.arch);\r
-                    String[] protocolList = saq.getProtocolArray(this.arch);\r
-                    String[] protocolNotifyList = saq.getProtocolNotifyArray(this.arch);\r
-                    String[] guidList = saq.getGuidEntryArray(this.arch);\r
-                    PackageIdentification[] pkgList = saq.getDependencePkg(this.arch);\r
-\r
-                    //\r
-                    // Add those ppi, protocol, guid in global ppi,\r
-                    // protocol, guid\r
-                    // list.\r
-                    //\r
-                    for (index = 0; index < ppiList.length; index++) {\r
-                        this.mPpiList.add(ppiList[index]);\r
-                    }\r
+            Map<String, XmlObject> libDoc = GlobalData.getDoc(libInstanceId, this.arch);\r
+            saq.push(libDoc);\r
+            //\r
+            // check if the library instance support current module\r
+            // \r
+            String[] libraryClassList = saq.getLibraryClasses(CommonDefinition.ALWAYSPRODUCED,\r
+                                                              this.arch,\r
+                                                              moduleType\r
+                                                             );\r
+            if (libraryClassList.length <= 0) {\r
+                throw new EdkException("Library instance " + libInstanceId.getName() \r
+                                       + " doesn't support module type " + moduleType);\r
+            }\r
+            //\r
+            // Get <PPis>, <Protocols>, <Guids> list of this library\r
+            // instance.\r
+            //\r
+            String[] ppiList = saq.getPpiArray(this.arch);\r
+            String[] ppiNotifyList = saq.getPpiNotifyArray(this.arch);\r
+            String[] protocolList = saq.getProtocolArray(this.arch);\r
+            String[] protocolNotifyList = saq.getProtocolNotifyArray(this.arch);\r
+            String[] guidList = saq.getGuidEntryArray(this.arch);\r
+            PackageIdentification[] pkgList = saq.getDependencePkg(this.arch);\r
 \r
-                    for (index = 0; index < ppiNotifyList.length; index++) {\r
-                        this.mPpiList.add(ppiNotifyList[index]);\r
-                    }\r
+            //\r
+            // Add those ppi, protocol, guid in global ppi,\r
+            // protocol, guid\r
+            // list.\r
+            //\r
+            for (index = 0; index < ppiList.length; index++) {\r
+                this.mPpiList.add(ppiList[index]);\r
+            }\r
 \r
-                    for (index = 0; index < protocolList.length; index++) {\r
-                        this.mProtocolList.add(protocolList[index]);\r
-                    }\r
+            for (index = 0; index < ppiNotifyList.length; index++) {\r
+                this.mPpiList.add(ppiNotifyList[index]);\r
+            }\r
 \r
-                    for (index = 0; index < protocolNotifyList.length; index++) {\r
-                        this.mProtocolList.add(protocolNotifyList[index]);\r
-                    }\r
+            for (index = 0; index < protocolList.length; index++) {\r
+                this.mProtocolList.add(protocolList[index]);\r
+            }\r
 \r
-                    for (index = 0; index < guidList.length; index++) {\r
-                        this.mGuidList.add(guidList[index]);\r
-                    }\r
-                    for (index = 0; index < pkgList.length; index++) {\r
-                        if (!this.mDepPkgList.contains(pkgList[index])) {\r
-                            this.mDepPkgList.add(pkgList[index]);\r
-                        }\r
-                    }\r
+            for (index = 0; index < protocolNotifyList.length; index++) {\r
+                this.mProtocolList.add(protocolNotifyList[index]);\r
+            }\r
 \r
-                    //\r
-                    // If not yet parse this library instance's constructor\r
-                    // element,parse it.\r
-                    //\r
-                    libConstructName = saq.getLibConstructorName();\r
-                    libDestructName = saq.getLibDestructorName();\r
-                    libModuleType = saq.getModuleType();\r
-\r
-                    //\r
-                    // Collect SetVirtualAddressMapCallBack and\r
-                    // ExitBootServiceCallBack.\r
-                    //\r
-                    setVirtuals = saq.getSetVirtualAddressMapCallBackArray();\r
-                    exitBoots = saq.getExitBootServicesCallBackArray();\r
-                    if (setVirtuals != null) {\r
-                        for (int j = 0; j < setVirtuals.length; j++) {\r
-                            this.setVirtalAddList.add(setVirtuals[j]);\r
-                        }\r
-                    }\r
-                    if (exitBoots != null) {\r
-                        for (int k = 0; k < exitBoots.length; k++) {\r
-                            this.exitBootServiceList.add(exitBoots[k]);\r
-                        }\r
-                    }\r
-                    saq.pop();\r
-                    //\r
-                    // Add dependent library instance constructor function.\r
-                    //\r
-                    if (libConstructName != null) {\r
-                        this.libConstructList.add(new String[] {libConstructName, libModuleType});\r
-                    }\r
-                    //\r
-                    // Add dependent library instance destructor fuction.\r
-                    //\r
-                    if (libDestructName != null) {\r
-                        this.libDestructList.add(new String[] {libDestructName, libModuleType});\r
-                    }\r
+            for (index = 0; index < guidList.length; index++) {\r
+                this.mGuidList.add(guidList[index]);\r
+            }\r
+            for (index = 0; index < pkgList.length; index++) {\r
+                if (!this.mDepPkgList.contains(pkgList[index])) {\r
+                    this.mDepPkgList.add(pkgList[index]);\r
+                }\r
+            }\r
+\r
+            //\r
+            // If not yet parse this library instance's constructor\r
+            // element,parse it.\r
+            //\r
+            libConstructName = saq.getLibConstructorName();\r
+            libDestructName = saq.getLibDestructorName();\r
+            libModuleType = saq.getModuleType();\r
+\r
+            //\r
+            // Collect SetVirtualAddressMapCallBack and\r
+            // ExitBootServiceCallBack.\r
+            //\r
+            setVirtuals = saq.getSetVirtualAddressMapCallBackArray();\r
+            exitBoots = saq.getExitBootServicesCallBackArray();\r
+            if (setVirtuals != null) {\r
+                for (int j = 0; j < setVirtuals.length; j++) {\r
+                    this.setVirtalAddList.add(setVirtuals[j]);\r
+                }\r
+            }\r
+            if (exitBoots != null) {\r
+                for (int k = 0; k < exitBoots.length; k++) {\r
+                    this.exitBootServiceList.add(exitBoots[k]);\r
                 }\r
             }\r
+            saq.pop();\r
+            //\r
+            // Add dependent library instance constructor function.\r
+            //\r
+            if (libConstructName != null) {\r
+                this.libConstructList.add(new String[] {libConstructName, libModuleType});\r
+            }\r
+            //\r
+            // Add dependent library instance destructor fuction.\r
+            //\r
+            if (libDestructName != null) {\r
+                this.libDestructList.add(new String[] {libDestructName, libModuleType});\r
+            }\r
         }\r
     }\r
 \r