Home | History | Annotate | Download | only in GenMetaFile
      1 ## @file GenMetaFileMisc.py

      2 #

      3 # This file contained the miscellaneous routines for GenMetaFile usage.

      4 #

      5 # Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>

      6 #

      7 # This program and the accompanying materials are licensed and made available 

      8 # under the terms and conditions of the BSD License which accompanies this 

      9 # distribution. The full text of the license may be found at 

     10 # http://opensource.org/licenses/bsd-license.php

     11 #

     12 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

     13 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

     14 #

     15 
     16 '''
     17 GenMetaFileMisc
     18 '''
     19 
     20 from Library import DataType as DT
     21 from Library import GlobalData
     22 from Parser.DecParser import Dec
     23 
     24 # AddExternToDefineSec

     25 #

     26 #  @param SectionDict: string of source file path/name

     27 #  @param Arch:     string of source file family field

     28 #  @param ExternList:  string of source file FeatureFlag field

     29 #   

     30 def AddExternToDefineSec(SectionDict, Arch, ExternList):
     31     LeftOffset = 31
     32     for ArchList, EntryPoint, UnloadImage, Constructor, Destructor, FFE, HelpStringList in ExternList:
     33         if Arch or ArchList:
     34             if EntryPoint:
     35                 Statement = (u'%s ' % DT.TAB_INF_DEFINES_ENTRY_POINT).ljust(LeftOffset) + u'= %s' % EntryPoint
     36                 if FFE:
     37                     Statement += ' | %s' % FFE
     38                 if len(HelpStringList) > 0:
     39                     Statement = HelpStringList[0].GetString() + '\n' + Statement
     40                 if len(HelpStringList) > 1:
     41                     Statement = Statement + HelpStringList[1].GetString()
     42                 SectionDict[Arch] = SectionDict[Arch] + [Statement]
     43 
     44             if UnloadImage:
     45                 Statement = (u'%s ' % DT.TAB_INF_DEFINES_UNLOAD_IMAGE).ljust(LeftOffset) + u'= %s' % UnloadImage
     46                 if FFE:
     47                     Statement += ' | %s' % FFE
     48 
     49                 if len(HelpStringList) > 0:
     50                     Statement = HelpStringList[0].GetString() + '\n' + Statement
     51                 if len(HelpStringList) > 1:
     52                     Statement = Statement + HelpStringList[1].GetString()
     53                 SectionDict[Arch] = SectionDict[Arch] + [Statement]
     54 
     55             if Constructor:
     56                 Statement = (u'%s ' % DT.TAB_INF_DEFINES_CONSTRUCTOR).ljust(LeftOffset) + u'= %s' % Constructor
     57                 if FFE:
     58                     Statement += ' | %s' % FFE
     59 
     60                 if len(HelpStringList) > 0:
     61                     Statement = HelpStringList[0].GetString() + '\n' + Statement
     62                 if len(HelpStringList) > 1:
     63                     Statement = Statement + HelpStringList[1].GetString()
     64                 SectionDict[Arch] = SectionDict[Arch] + [Statement]
     65 
     66             if Destructor:
     67                 Statement = (u'%s ' % DT.TAB_INF_DEFINES_DESTRUCTOR).ljust(LeftOffset) + u'= %s' % Destructor
     68                 if FFE:
     69                     Statement += ' | %s' % FFE
     70 
     71                 if len(HelpStringList) > 0:
     72                     Statement = HelpStringList[0].GetString() + '\n' + Statement
     73                 if len(HelpStringList) > 1:
     74                     Statement = Statement + HelpStringList[1].GetString()
     75                 SectionDict[Arch] = SectionDict[Arch] + [Statement]
     76 
     77 ## ObtainPcdName

     78 #

     79 # Using TokenSpaceGuidValue and Token to obtain PcdName from DEC file

     80 #

     81 def ObtainPcdName(Packages, TokenSpaceGuidValue, Token):
     82     for PackageDependency in Packages:
     83         #

     84         # Generate generic comment

     85         #

     86         Guid = PackageDependency.GetGuid()
     87         Version = PackageDependency.GetVersion()
     88 
     89         #

     90         # find package path/name

     91         # 

     92         for PkgInfo in GlobalData.gWSPKG_LIST:
     93             if Guid == PkgInfo[1]:
     94                 if (not Version) or (Version == PkgInfo[2]):
     95                     Path = PkgInfo[3]
     96                     break
     97 
     98         DecFile = None
     99         if Path not in GlobalData.gPackageDict:
    100             DecFile = Dec(Path)
    101             GlobalData.gPackageDict[Path] = DecFile
    102         else:
    103             DecFile = GlobalData.gPackageDict[Path]
    104 
    105         DecGuidsDict = DecFile.GetGuidSectionObject().ValueDict
    106         DecPcdsDict = DecFile.GetPcdSectionObject().ValueDict
    107 
    108         TokenSpaceGuidName = ''
    109         PcdCName = ''
    110         TokenSpaceGuidNameFound = False
    111         PcdCNameFound = False
    112 
    113         #

    114         # Get TokenSpaceGuidCName from Guids section 

    115         #

    116         for GuidKey in DecGuidsDict:
    117             GuidList = DecGuidsDict[GuidKey]
    118             if TokenSpaceGuidNameFound:
    119                 break
    120             for GuidItem in GuidList:
    121                 if TokenSpaceGuidValue.upper() == GuidItem.GuidString.upper():
    122                     TokenSpaceGuidName = GuidItem.GuidCName
    123                     TokenSpaceGuidNameFound = True
    124                     break
    125 
    126         #

    127         # Retrieve PcdCName from Pcds Section

    128         #

    129         for PcdKey in DecPcdsDict:
    130             PcdList = DecPcdsDict[PcdKey]
    131             if PcdCNameFound:
    132                 return TokenSpaceGuidName, PcdCName
    133             for PcdItem in PcdList:
    134                 if TokenSpaceGuidName == PcdItem.TokenSpaceGuidCName and Token == PcdItem.TokenValue:
    135                     PcdCName = PcdItem.TokenCName
    136                     PcdCNameFound = True
    137                     break
    138 
    139     return TokenSpaceGuidName, PcdCName
    140 
    141 ## _TransferDict

    142 #  transfer dict that using (Statement, SortedArch) as key, 

    143 #  (GenericComment, UsageComment) as value into a dict that using SortedArch as

    144 #  key and NewStatement as value 

    145 #

    146 def TransferDict(OrigDict, Type=None):
    147     NewDict = {}
    148     LeftOffset = 0
    149     if Type in ['INF_GUID', 'INF_PPI_PROTOCOL']:
    150         LeftOffset = 45
    151     if Type in ['INF_PCD']:
    152         LeftOffset = 75
    153     if LeftOffset > 0:
    154         for Statement, SortedArch in OrigDict:
    155             if len(Statement) > LeftOffset:
    156                 LeftOffset = len(Statement)
    157         
    158     for Statement, SortedArch in OrigDict:
    159         Comment = OrigDict[Statement, SortedArch]
    160         #

    161         # apply the NComment/1Comment rule

    162         #

    163         if Comment.find('\n') != len(Comment) - 1:
    164             NewStateMent = Comment + Statement
    165         else:
    166             if LeftOffset:
    167                 NewStateMent = Statement.ljust(LeftOffset) + ' ' + Comment.rstrip('\n')
    168             else:
    169                 NewStateMent = Statement + ' ' + Comment.rstrip('\n')
    170 
    171         if SortedArch in NewDict:
    172             NewDict[SortedArch] = NewDict[SortedArch] + [NewStateMent]
    173         else:
    174             NewDict[SortedArch] = [NewStateMent]
    175 
    176     return NewDict
    177 
    178