BaseTools:Make BaseTools support new rules to generate RAW FFS FILE
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / Section.py
1 ## @file\r
2 # section base class\r
3 #\r
4 #  Copyright (c) 2007-2018, Intel Corporation. All rights reserved.<BR>\r
5 #\r
6 #  SPDX-License-Identifier: BSD-2-Clause-Patent\r
7 #\r
8 \r
9 ##\r
10 # Import Modules\r
11 #\r
12 from __future__ import absolute_import\r
13 from CommonDataClass.FdfClass import SectionClassObject\r
14 from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
15 import Common.LongFilePathOs as os, glob\r
16 from Common import EdkLogger\r
17 from Common.BuildToolError import *\r
18 from Common.DataType import *\r
19 \r
20 ## section base class\r
21 #\r
22 #\r
23 class Section (SectionClassObject):\r
24     SectionType = {\r
25         'RAW'       : 'EFI_SECTION_RAW',\r
26         'FREEFORM'  : 'EFI_SECTION_FREEFORM_SUBTYPE_GUID',\r
27         BINARY_FILE_TYPE_PE32      : 'EFI_SECTION_PE32',\r
28         BINARY_FILE_TYPE_PIC       : 'EFI_SECTION_PIC',\r
29         BINARY_FILE_TYPE_TE        : 'EFI_SECTION_TE',\r
30         'FV_IMAGE'  : 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE',\r
31         BINARY_FILE_TYPE_DXE_DEPEX : 'EFI_SECTION_DXE_DEPEX',\r
32         BINARY_FILE_TYPE_PEI_DEPEX : 'EFI_SECTION_PEI_DEPEX',\r
33         'GUIDED'    : 'EFI_SECTION_GUID_DEFINED',\r
34         'COMPRESS'  : 'EFI_SECTION_COMPRESSION',\r
35         BINARY_FILE_TYPE_UI        : 'EFI_SECTION_USER_INTERFACE',\r
36         BINARY_FILE_TYPE_SMM_DEPEX : 'EFI_SECTION_SMM_DEPEX'\r
37     }\r
38 \r
39     BinFileType = {\r
40         BINARY_FILE_TYPE_GUID          : '.guid',\r
41         'ACPI'          : '.acpi',\r
42         'ASL'           : '.asl' ,\r
43         BINARY_FILE_TYPE_UEFI_APP      : '.app',\r
44         BINARY_FILE_TYPE_LIB           : '.lib',\r
45         BINARY_FILE_TYPE_PE32          : '.pe32',\r
46         BINARY_FILE_TYPE_PIC           : '.pic',\r
47         BINARY_FILE_TYPE_PEI_DEPEX     : '.depex',\r
48         'SEC_PEI_DEPEX' : '.depex',\r
49         BINARY_FILE_TYPE_TE            : '.te',\r
50         BINARY_FILE_TYPE_UNI_VER       : '.ver',\r
51         BINARY_FILE_TYPE_VER           : '.ver',\r
52         BINARY_FILE_TYPE_UNI_UI        : '.ui',\r
53         BINARY_FILE_TYPE_UI            : '.ui',\r
54         BINARY_FILE_TYPE_BIN           : '.bin',\r
55         'RAW'           : '.raw',\r
56         'COMPAT16'      : '.comp16',\r
57         BINARY_FILE_TYPE_FV            : '.fv'\r
58     }\r
59 \r
60     SectFileType = {\r
61         'SEC_GUID'      : '.sec' ,\r
62         'SEC_PE32'      : '.sec' ,\r
63         'SEC_PIC'       : '.sec',\r
64         'SEC_TE'        : '.sec',\r
65         'SEC_VER'       : '.sec',\r
66         'SEC_UI'        : '.sec',\r
67         'SEC_COMPAT16'  : '.sec',\r
68         'SEC_BIN'       : '.sec'\r
69     }\r
70 \r
71     ToolGuid = {\r
72         '0xa31280ad-0x481e-0x41b6-0x95e8-0x127f-0x4c984779' : 'TianoCompress',\r
73         '0xee4e5898-0x3914-0x4259-0x9d6e-0xdc7b-0xd79403cf' : 'LzmaCompress'\r
74     }\r
75 \r
76     ## The constructor\r
77     #\r
78     #   @param  self        The object pointer\r
79     #\r
80     def __init__(self):\r
81         SectionClassObject.__init__(self)\r
82 \r
83     ## GenSection() method\r
84     #\r
85     #   virtual function\r
86     #\r
87     #   @param  self        The object pointer\r
88     #   @param  OutputPath  Where to place output file\r
89     #   @param  ModuleName  Which module this section belongs to\r
90     #   @param  SecNum      Index of section\r
91     #   @param  KeyStringList  Filter for inputs of section generation\r
92     #   @param  FfsInf      FfsInfStatement object that contains this section data\r
93     #   @param  Dict        dictionary contains macro and its value\r
94     #\r
95     def GenSection(self, OutputPath, GuidName, SecNum, keyStringList, FfsInf = None, Dict = {}):\r
96         pass\r
97 \r
98     ## GetFileList() method\r
99     #\r
100     #   Generate compressed section\r
101     #\r
102     #   @param  self        The object pointer\r
103     #   @param  FfsInf      FfsInfStatement object that contains file list\r
104     #   @param  FileType    File type to get\r
105     #   @param  FileExtension  File extension to get\r
106     #   @param  Dict        dictionary contains macro and its value\r
107     #   @retval tuple       (File list, boolean)\r
108     #\r
109     def GetFileList(FfsInf, FileType, FileExtension, Dict = None, IsMakefile=False, SectionType=None):\r
110         IsSect = FileType in Section.SectFileType\r
111 \r
112         if FileExtension is not None:\r
113             Suffix = FileExtension\r
114         elif IsSect :\r
115             Suffix = Section.SectionType.get(FileType)\r
116         else:\r
117             Suffix = Section.BinFileType.get(FileType)\r
118         if FfsInf is None:\r
119             EdkLogger.error("GenFds", GENFDS_ERROR, 'Inf File does not exist!')\r
120 \r
121         FileList = []\r
122         if FileType is not None:\r
123             for File in FfsInf.BinFileList:\r
124                 if File.Arch == TAB_ARCH_COMMON or FfsInf.CurrentArch == File.Arch:\r
125                     if File.Type == FileType or (int(FfsInf.PiSpecVersion, 16) >= 0x0001000A \\r
126                                                  and FileType == 'DXE_DPEX' and File.Type == BINARY_FILE_TYPE_SMM_DEPEX) \\r
127                                                  or (FileType == BINARY_FILE_TYPE_TE and File.Type == BINARY_FILE_TYPE_PE32):\r
128                         if TAB_STAR in FfsInf.TargetOverrideList or File.Target == TAB_STAR or File.Target in FfsInf.TargetOverrideList or FfsInf.TargetOverrideList == []:\r
129                             FileList.append(FfsInf.PatchEfiFile(File.Path, File.Type))\r
130                         else:\r
131                             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
132                     else:\r
133                         GenFdsGlobalVariable.VerboseLogger ("\nFile Type \'%s\' of File %s in %s is not same with file type \'%s\' from Rule in FDF" %(File.Type, File.File, FfsInf.InfFileName, FileType))\r
134                 else:\r
135                     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
136 \r
137         elif FileType is None and SectionType == BINARY_FILE_TYPE_RAW:\r
138             for File in FfsInf.BinFileList:\r
139                 if File.Ext == Suffix:\r
140                     FileList.append(File.Path)\r
141 \r
142         if (not IsMakefile and Suffix is not None and os.path.exists(FfsInf.EfiOutputPath)) or (IsMakefile and Suffix is not None):\r
143             #\r
144             # Get Makefile path and time stamp\r
145             #\r
146             MakefileDir = FfsInf.EfiOutputPath[:-len('OUTPUT')]\r
147             Makefile = os.path.join(MakefileDir, 'Makefile')\r
148             if not os.path.exists(Makefile):\r
149                 Makefile = os.path.join(MakefileDir, 'GNUmakefile')\r
150             if os.path.exists(Makefile):\r
151                 # Update to search files with suffix in all sub-dirs.\r
152                 Tuple = os.walk(FfsInf.EfiOutputPath)\r
153                 for Dirpath, Dirnames, Filenames in Tuple:\r
154                     for F in Filenames:\r
155                         if os.path.splitext(F)[1] == Suffix:\r
156                             FullName = os.path.join(Dirpath, F)\r
157                             if os.path.getmtime(FullName) > os.path.getmtime(Makefile):\r
158                                 FileList.append(FullName)\r
159             if not FileList:\r
160                 SuffixMap = FfsInf.GetFinalTargetSuffixMap()\r
161                 if Suffix in SuffixMap:\r
162                     FileList.extend(SuffixMap[Suffix])\r
163 \r
164         #Process the file lists is alphabetical for a same section type\r
165         if len (FileList) > 1:\r
166             FileList.sort()\r
167 \r
168         return FileList, IsSect\r
169     GetFileList = staticmethod(GetFileList)\r