1## @file
2# process depex section generation
3#
4#  Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
5#
6#  This program and the accompanying materials
7#  are licensed and made available under the terms and conditions of the BSD License
8#  which accompanies this distribution.  The full text of the license may be found at
9#  http://opensource.org/licenses/bsd-license.php
10#
11#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13#
14
15##
16# Import Modules
17#
18import Section
19from GenFdsGlobalVariable import GenFdsGlobalVariable
20import subprocess
21from Ffs import Ffs
22import Common.LongFilePathOs as os
23from CommonDataClass.FdfClass import DepexSectionClassObject
24from AutoGen.GenDepex import DependencyExpression
25from Common import EdkLogger
26from Common.BuildToolError import *
27from Common.Misc import PathClass
28
29## generate data section
30#
31#
32class DepexSection (DepexSectionClassObject):
33    ## The constructor
34    #
35    #   @param  self        The object pointer
36    #
37    def __init__(self):
38        DepexSectionClassObject.__init__(self)
39
40    def __FindGuidValue(self, CName):
41        for Arch in GenFdsGlobalVariable.ArchList:
42            PkgList = GenFdsGlobalVariable.WorkSpace.GetPackageList(GenFdsGlobalVariable.ActivePlatform,
43                                                                    Arch,
44                                                                    GenFdsGlobalVariable.TargetName,
45                                                                    GenFdsGlobalVariable.ToolChainTag)
46            for Inf in GenFdsGlobalVariable.FdfParser.Profile.InfList:
47                ModuleFile = PathClass(Inf, GenFdsGlobalVariable.WorkSpaceDir)
48                ModuleData = GenFdsGlobalVariable.WorkSpace.BuildObject[
49                                                            ModuleFile,
50                                                            Arch,
51                                                            GenFdsGlobalVariable.TargetName,
52                                                            GenFdsGlobalVariable.ToolChainTag
53                                                            ]
54                for Pkg in ModuleData.Packages:
55                    if Pkg not in PkgList:
56                        PkgList.append(Pkg)
57            for PkgDb in PkgList:
58                if CName in PkgDb.Ppis:
59                    return PkgDb.Ppis[CName]
60                if CName in PkgDb.Protocols:
61                    return PkgDb.Protocols[CName]
62                if CName in PkgDb.Guids:
63                    return PkgDb.Guids[CName]
64        return None
65
66    ## GenSection() method
67    #
68    #   Generate compressed section
69    #
70    #   @param  self        The object pointer
71    #   @param  OutputPath  Where to place output file
72    #   @param  ModuleName  Which module this section belongs to
73    #   @param  SecNum      Index of section
74    #   @param  KeyStringList  Filter for inputs of section generation
75    #   @param  FfsInf      FfsInfStatement object that contains this section data
76    #   @param  Dict        dictionary contains macro and its value
77    #   @retval tuple       (Generated file name list, section alignment)
78    #
79    def GenSection(self, OutputPath, ModuleName, SecNum, keyStringList, FfsFile = None, Dict = {}):
80
81        if self.ExpressionProcessed == False:
82            self.Expression = self.Expression.replace("\n", " ").replace("\r", " ")
83            ExpList = self.Expression.split()
84            ExpGuidDict = {}
85
86            for Exp in ExpList:
87                if Exp.upper() not in ('AND', 'OR', 'NOT', 'TRUE', 'FALSE', 'SOR', 'BEFORE', 'AFTER', 'END'):
88                    GuidStr = self.__FindGuidValue(Exp)
89                    if GuidStr == None:
90                        EdkLogger.error("GenFds", RESOURCE_NOT_AVAILABLE,
91                                        "Depex GUID %s could not be found in build DB! (ModuleName: %s)" % (Exp, ModuleName))
92
93                    ExpGuidDict[Exp] = GuidStr
94
95            for Item in ExpGuidDict:
96                self.Expression = self.Expression.replace(Item, ExpGuidDict[Item])
97
98            self.Expression = self.Expression.strip()
99            self.ExpressionProcessed = True
100
101        if self.DepexType == 'PEI_DEPEX_EXP':
102            ModuleType = 'PEIM'
103            SecType    = 'PEI_DEPEX'
104        elif self.DepexType == 'DXE_DEPEX_EXP':
105            ModuleType = 'DXE_DRIVER'
106            SecType    = 'DXE_DEPEX'
107        elif self.DepexType == 'SMM_DEPEX_EXP':
108            ModuleType = 'DXE_SMM_DRIVER'
109            SecType    = 'SMM_DEPEX'
110        else:
111            EdkLogger.error("GenFds", FORMAT_INVALID,
112                            "Depex type %s is not valid for module %s" % (self.DepexType, ModuleName))
113
114        InputFile = os.path.join (OutputPath, ModuleName + 'SEC' + SecNum + '.depex')
115        InputFile = os.path.normpath(InputFile)
116        Depex = DependencyExpression(self.Expression, ModuleType)
117        Depex.Generate(InputFile)
118
119        OutputFile = os.path.join (OutputPath, ModuleName + 'SEC' + SecNum + '.dpx')
120        OutputFile = os.path.normpath(OutputFile)
121
122        GenFdsGlobalVariable.GenerateSection(OutputFile, [InputFile], Section.Section.SectionType.get (SecType))
123        FileList = [OutputFile]
124        return FileList, self.Alignment
125