]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/Section.py
BaseTools:Make BaseTools support new rules to generate RAW FFS FILE
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / Section.py
index 32314d6b7fb3edc66cc1065981ff7be833da5a14..b2389566349855b8bedb9f22d5dbfa99c9ba968d 100644 (file)
@@ -1,25 +1,21 @@
 ## @file\r
 # section base class\r
 #\r
-#  Copyright (c) 2007-2014, Intel Corporation. All rights reserved.<BR>\r
+#  Copyright (c) 2007-2018, Intel Corporation. All rights reserved.<BR>\r
 #\r
-#  This program and the accompanying materials\r
-#  are licensed and made available under the terms and conditions of the BSD License\r
-#  which accompanies this distribution.  The full text of the license may be found at\r
-#  http://opensource.org/licenses/bsd-license.php\r
-#\r
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 \r
 ##\r
 # Import Modules\r
 #\r
+from __future__ import absolute_import\r
 from CommonDataClass.FdfClass import SectionClassObject\r
-from GenFdsGlobalVariable import GenFdsGlobalVariable\r
+from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
 import Common.LongFilePathOs as os, glob\r
 from Common import EdkLogger\r
 from Common.BuildToolError import *\r
+from Common.DataType import *\r
 \r
 ## section base class\r
 #\r
@@ -28,37 +24,37 @@ class Section (SectionClassObject):
     SectionType = {\r
         'RAW'       : 'EFI_SECTION_RAW',\r
         'FREEFORM'  : 'EFI_SECTION_FREEFORM_SUBTYPE_GUID',\r
-        'PE32'      : 'EFI_SECTION_PE32',\r
-        'PIC'       : 'EFI_SECTION_PIC',\r
-        'TE'        : 'EFI_SECTION_TE',\r
+        BINARY_FILE_TYPE_PE32      : 'EFI_SECTION_PE32',\r
+        BINARY_FILE_TYPE_PIC       : 'EFI_SECTION_PIC',\r
+        BINARY_FILE_TYPE_TE        : 'EFI_SECTION_TE',\r
         'FV_IMAGE'  : 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE',\r
-        'DXE_DEPEX' : 'EFI_SECTION_DXE_DEPEX',\r
-        'PEI_DEPEX' : 'EFI_SECTION_PEI_DEPEX',\r
+        BINARY_FILE_TYPE_DXE_DEPEX : 'EFI_SECTION_DXE_DEPEX',\r
+        BINARY_FILE_TYPE_PEI_DEPEX : 'EFI_SECTION_PEI_DEPEX',\r
         'GUIDED'    : 'EFI_SECTION_GUID_DEFINED',\r
         'COMPRESS'  : 'EFI_SECTION_COMPRESSION',\r
-        'UI'        : 'EFI_SECTION_USER_INTERFACE',\r
-        'SMM_DEPEX' : 'EFI_SECTION_SMM_DEPEX'\r
+        BINARY_FILE_TYPE_UI        : 'EFI_SECTION_USER_INTERFACE',\r
+        BINARY_FILE_TYPE_SMM_DEPEX : 'EFI_SECTION_SMM_DEPEX'\r
     }\r
 \r
     BinFileType = {\r
-        'GUID'          : '.guid',\r
+        BINARY_FILE_TYPE_GUID          : '.guid',\r
         'ACPI'          : '.acpi',\r
         'ASL'           : '.asl' ,\r
-        'UEFI_APP'      : '.app',\r
-        'LIB'           : '.lib',\r
-        'PE32'          : '.pe32',\r
-        'PIC'           : '.pic',\r
-        'PEI_DEPEX'     : '.depex',\r
+        BINARY_FILE_TYPE_UEFI_APP      : '.app',\r
+        BINARY_FILE_TYPE_LIB           : '.lib',\r
+        BINARY_FILE_TYPE_PE32          : '.pe32',\r
+        BINARY_FILE_TYPE_PIC           : '.pic',\r
+        BINARY_FILE_TYPE_PEI_DEPEX     : '.depex',\r
         'SEC_PEI_DEPEX' : '.depex',\r
-        'TE'            : '.te',\r
-        'UNI_VER'       : '.ver',\r
-        'VER'           : '.ver',\r
-        'UNI_UI'        : '.ui',\r
-        'UI'            : '.ui',\r
-        'BIN'           : '.bin',\r
+        BINARY_FILE_TYPE_TE            : '.te',\r
+        BINARY_FILE_TYPE_UNI_VER       : '.ver',\r
+        BINARY_FILE_TYPE_VER           : '.ver',\r
+        BINARY_FILE_TYPE_UNI_UI        : '.ui',\r
+        BINARY_FILE_TYPE_UI            : '.ui',\r
+        BINARY_FILE_TYPE_BIN           : '.bin',\r
         'RAW'           : '.raw',\r
         'COMPAT16'      : '.comp16',\r
-        'FV'            : '.fv'\r
+        BINARY_FILE_TYPE_FV            : '.fv'\r
     }\r
 \r
     SectFileType = {\r
@@ -110,29 +106,26 @@ class Section (SectionClassObject):
     #   @param  Dict        dictionary contains macro and its value\r
     #   @retval tuple       (File list, boolean)\r
     #\r
-    def GetFileList(FfsInf, FileType, FileExtension, Dict = {}):\r
-        if FileType in Section.SectFileType.keys() :\r
-            IsSect = True\r
-        else :\r
-            IsSect = False\r
+    def GetFileList(FfsInf, FileType, FileExtension, Dict = None, IsMakefile=False, SectionType=None):\r
+        IsSect = FileType in Section.SectFileType\r
 \r
-        if FileExtension != None:\r
+        if FileExtension is not None:\r
             Suffix = FileExtension\r
         elif IsSect :\r
             Suffix = Section.SectionType.get(FileType)\r
         else:\r
             Suffix = Section.BinFileType.get(FileType)\r
-        if FfsInf == None:\r
+        if FfsInf is None:\r
             EdkLogger.error("GenFds", GENFDS_ERROR, 'Inf File does not exist!')\r
 \r
         FileList = []\r
-        if FileType != None:\r
+        if FileType is not None:\r
             for File in FfsInf.BinFileList:\r
-                if File.Arch == "COMMON" or FfsInf.CurrentArch == File.Arch:\r
+                if File.Arch == TAB_ARCH_COMMON or FfsInf.CurrentArch == File.Arch:\r
                     if File.Type == FileType or (int(FfsInf.PiSpecVersion, 16) >= 0x0001000A \\r
-                                                 and FileType == 'DXE_DPEX'and File.Type == 'SMM_DEPEX') \\r
-                                                 or (FileType == 'TE'and File.Type == 'PE32'):\r
-                        if '*' in FfsInf.TargetOverrideList or File.Target == '*' or File.Target in FfsInf.TargetOverrideList or FfsInf.TargetOverrideList == []:\r
+                                                 and FileType == 'DXE_DPEX' and File.Type == BINARY_FILE_TYPE_SMM_DEPEX) \\r
+                                                 or (FileType == BINARY_FILE_TYPE_TE and File.Type == BINARY_FILE_TYPE_PE32):\r
+                        if TAB_STAR in FfsInf.TargetOverrideList or File.Target == TAB_STAR or File.Target in FfsInf.TargetOverrideList or FfsInf.TargetOverrideList == []:\r
                             FileList.append(FfsInf.PatchEfiFile(File.Path, File.Type))\r
                         else:\r
                             GenFdsGlobalVariable.InfLogger ("\nBuild Target \'%s\' of File %s is not in the Scope of %s specified by INF %s in FDF" %(File.Target, File.File, FfsInf.TargetOverrideList, FfsInf.InfFileName))\r
@@ -141,7 +134,12 @@ class Section (SectionClassObject):
                 else:\r
                     GenFdsGlobalVariable.InfLogger ("\nCurrent ARCH \'%s\' of File %s is not in the Support Arch Scope of %s specified by INF %s in FDF" %(FfsInf.CurrentArch, File.File, File.Arch, FfsInf.InfFileName))\r
 \r
-        if Suffix != None and os.path.exists(FfsInf.EfiOutputPath):\r
+        elif FileType is None and SectionType == BINARY_FILE_TYPE_RAW:\r
+            for File in FfsInf.BinFileList:\r
+                if File.Ext == Suffix:\r
+                    FileList.append(File.Path)\r
+\r
+        if (not IsMakefile and Suffix is not None and os.path.exists(FfsInf.EfiOutputPath)) or (IsMakefile and Suffix is not None):\r
             #\r
             # Get Makefile path and time stamp\r
             #\r
@@ -149,19 +147,19 @@ class Section (SectionClassObject):
             Makefile = os.path.join(MakefileDir, 'Makefile')\r
             if not os.path.exists(Makefile):\r
                 Makefile = os.path.join(MakefileDir, 'GNUmakefile')\r
-            if not os.path.exists(Makefile):\r
-                SuffixMap = FfsInf.GetFinalTargetSuffixMap()\r
-                if Suffix in SuffixMap:\r
-                    FileList.extend(SuffixMap[Suffix])\r
-            else:\r
+            if os.path.exists(Makefile):\r
                 # Update to search files with suffix in all sub-dirs.\r
                 Tuple = os.walk(FfsInf.EfiOutputPath)\r
                 for Dirpath, Dirnames, Filenames in Tuple:\r
                     for F in Filenames:\r
-                        if os.path.splitext(F)[1] in (Suffix):\r
+                        if os.path.splitext(F)[1] == Suffix:\r
                             FullName = os.path.join(Dirpath, F)\r
                             if os.path.getmtime(FullName) > os.path.getmtime(Makefile):\r
                                 FileList.append(FullName)\r
+            if not FileList:\r
+                SuffixMap = FfsInf.GetFinalTargetSuffixMap()\r
+                if Suffix in SuffixMap:\r
+                    FileList.extend(SuffixMap[Suffix])\r
 \r
         #Process the file lists is alphabetical for a same section type\r
         if len (FileList) > 1:\r