https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Bob Feng <bob.c.feng@intel.com>
		
			
				
	
	
		
			196 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
## @file
 | 
						|
#
 | 
						|
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
 | 
						|
#
 | 
						|
# SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
#
 | 
						|
 | 
						|
from plugins.EdkPlugins.basemodel import ini
 | 
						|
import re, os
 | 
						|
from plugins.EdkPlugins.basemodel.message import *
 | 
						|
 | 
						|
class DSCFile(ini.BaseINIFile):
 | 
						|
    def GetSectionInstance(self, parent, name, isCombined=False):
 | 
						|
        return DSCSection(parent, name, isCombined)
 | 
						|
 | 
						|
    def GetComponents(self):
 | 
						|
        return self.GetSectionObjectsByName('Components')
 | 
						|
 | 
						|
class DSCSection(ini.BaseINISection):
 | 
						|
    def GetSectionINIObject(self, parent):
 | 
						|
        type = self.GetType()
 | 
						|
 | 
						|
        if type.lower() == 'components':
 | 
						|
            return DSCComponentObject(self)
 | 
						|
        if type.lower() == 'libraryclasses':
 | 
						|
            return DSCLibraryClassObject(self)
 | 
						|
        if type.lower() == 'defines':
 | 
						|
            return ini.BaseINISectionObject(self)
 | 
						|
        if type.lower() == 'pcdsfeatureflag' or \
 | 
						|
           type.lower() == 'pcdsfixedatbuild' or \
 | 
						|
           type.lower() == 'pcdspatchableinmodule' or\
 | 
						|
           type.lower() == 'pcdsdynamicdefault' or \
 | 
						|
           type.lower() == 'pcdsdynamicex' or \
 | 
						|
           type.lower() == 'pcdsdynamichii' or \
 | 
						|
           type.lower() == 'pcdsdynamicvpd':
 | 
						|
            return DSCPcdObject(self)
 | 
						|
 | 
						|
        return DSCSectionObject(self)
 | 
						|
 | 
						|
    def GetType(self):
 | 
						|
        arr = self._name.split('.')
 | 
						|
        return arr[0].strip()
 | 
						|
 | 
						|
    def GetArch(self):
 | 
						|
        arr = self._name.split('.')
 | 
						|
        if len(arr) == 1:
 | 
						|
            return 'common'
 | 
						|
        return arr[1]
 | 
						|
 | 
						|
    def GetModuleType(self):
 | 
						|
        arr = self._name.split('.')
 | 
						|
        if len(arr) < 3:
 | 
						|
            return 'common'
 | 
						|
        return arr[2]
 | 
						|
 | 
						|
class DSCSectionObject(ini.BaseINISectionObject):
 | 
						|
    def GetArch(self):
 | 
						|
        return self.GetParent().GetArch()
 | 
						|
 | 
						|
class DSCPcdObject(DSCSectionObject):
 | 
						|
 | 
						|
    def __init__(self, parent):
 | 
						|
        ini.BaseINISectionObject.__init__(self, parent)
 | 
						|
        self._name = None
 | 
						|
 | 
						|
    def Parse(self):
 | 
						|
        line = self.GetLineByOffset(self._start).strip().split('#')[0]
 | 
						|
        self._name   = line.split('|')[0]
 | 
						|
        self._value  = line.split('|')[1]
 | 
						|
        return True
 | 
						|
 | 
						|
    def GetPcdName(self):
 | 
						|
        return self._name
 | 
						|
 | 
						|
    def GetPcdType(self):
 | 
						|
        return self.GetParent().GetType()
 | 
						|
 | 
						|
    def GetPcdValue(self):
 | 
						|
        return self._value
 | 
						|
 | 
						|
class DSCLibraryClassObject(DSCSectionObject):
 | 
						|
    def __init__(self, parent):
 | 
						|
        ini.BaseINISectionObject.__init__(self, parent)
 | 
						|
 | 
						|
    def GetClass(self):
 | 
						|
        line = self.GetLineByOffset(self._start)
 | 
						|
        return line.split('#')[0].split('|')[0].strip()
 | 
						|
 | 
						|
    def GetInstance(self):
 | 
						|
        line = self.GetLineByOffset(self._start)
 | 
						|
        return line.split('#')[0].split('|')[1].strip()
 | 
						|
 | 
						|
    def GetArch(self):
 | 
						|
        return self.GetParent().GetArch()
 | 
						|
 | 
						|
    def GetModuleType(self):
 | 
						|
        return self.GetParent().GetModuleType()
 | 
						|
 | 
						|
class DSCComponentObject(DSCSectionObject):
 | 
						|
 | 
						|
    def __init__(self, parent):
 | 
						|
        ini.BaseINISectionObject.__init__(self, parent)
 | 
						|
        self._OveridePcds      = {}
 | 
						|
        self._OverideLibraries = {}
 | 
						|
        self._Filename         = ''
 | 
						|
 | 
						|
    def __del__(self):
 | 
						|
        self._OverideLibraries.clear()
 | 
						|
        self._OverideLibraries.clear()
 | 
						|
        ini.BaseINISectionObject.__del__(self)
 | 
						|
 | 
						|
    def AddOverideLib(self, libclass, libinstPath):
 | 
						|
        if libclass not in self._OverideLibraries.keys():
 | 
						|
            self._OverideLibraries[libclass] = libinstPath
 | 
						|
 | 
						|
    def AddOveridePcd(self, name, type, value=None):
 | 
						|
        if type not in self._OveridePcds.keys():
 | 
						|
            self._OveridePcds[type] = []
 | 
						|
        self._OveridePcds[type].append((name, value))
 | 
						|
 | 
						|
    def GetOverideLibs(self):
 | 
						|
        return self._OverideLibraries
 | 
						|
 | 
						|
    def GetArch(self):
 | 
						|
        return self.GetParent().GetArch()
 | 
						|
 | 
						|
    def GetOveridePcds(self):
 | 
						|
        return self._OveridePcds
 | 
						|
 | 
						|
    def GetFilename(self):
 | 
						|
        return self.GetLineByOffset(self._start).split('#')[0].split('{')[0].strip()
 | 
						|
 | 
						|
    def SetFilename(self, fName):
 | 
						|
        self._Filename = fName
 | 
						|
 | 
						|
    def Parse(self):
 | 
						|
        if (self._start < self._end):
 | 
						|
            #
 | 
						|
            # The first line is inf path and could be ignored
 | 
						|
            # The end line is '}' and could be ignored
 | 
						|
            #
 | 
						|
            curr = self._start + 1
 | 
						|
            end  = self._end - 1
 | 
						|
            OverideName = ''
 | 
						|
            while (curr <= end):
 | 
						|
                line = self.GetLineByOffset(curr).strip()
 | 
						|
                if len(line) > 0 and line[0] != '#':
 | 
						|
                    line = line.split('#')[0].strip()
 | 
						|
                    if line[0] == '<':
 | 
						|
                        OverideName = line[1:len(line)-1]
 | 
						|
                    elif OverideName.lower() == 'libraryclasses':
 | 
						|
                        arr = line.split('|')
 | 
						|
                        self._OverideLibraries[arr[0].strip()] = arr[1].strip()
 | 
						|
                    elif OverideName.lower() == 'pcds':
 | 
						|
                        ErrorMsg('EDES does not support PCD overide',
 | 
						|
                                 self.GetFileName(),
 | 
						|
                                 self.GetParent().GetLinenumberByOffset(curr))
 | 
						|
                curr = curr + 1
 | 
						|
        return True
 | 
						|
 | 
						|
    def GenerateLines(self):
 | 
						|
        lines = []
 | 
						|
        hasLib = False
 | 
						|
        hasPcd = False
 | 
						|
        if len(self._OverideLibraries) != 0:
 | 
						|
            hasLib = True
 | 
						|
        if len(self._OveridePcds) != 0:
 | 
						|
            hasPcd = True
 | 
						|
 | 
						|
        if hasLib or hasPcd:
 | 
						|
            lines.append(('  %s {\n' % self._Filename))
 | 
						|
        else:
 | 
						|
            lines.append(('  %s \n' % self._Filename))
 | 
						|
            return lines
 | 
						|
 | 
						|
        if hasLib:
 | 
						|
            lines.append('    <LibraryClasses>\n')
 | 
						|
            for libKey in self._OverideLibraries.keys():
 | 
						|
                lines.append('      %s|%s\n' % (libKey, self._OverideLibraries[libKey]))
 | 
						|
 | 
						|
        if hasPcd:
 | 
						|
            for key in self._OveridePcds.keys():
 | 
						|
                lines.append('    <%s>\n' % key)
 | 
						|
 | 
						|
                for name, value in self._OveridePcds[key]:
 | 
						|
                    if value is not None:
 | 
						|
                        lines.append('      %s|%s\n' % (name, value))
 | 
						|
                    else:
 | 
						|
                        lines.append('      %s\n' % name)
 | 
						|
 | 
						|
        if hasLib or hasPcd:
 | 
						|
            lines.append('  }\n')
 | 
						|
 | 
						|
        return lines
 | 
						|
 |