Module bsf |
[hide private]
[frames] | no frames]

# Source Code for Module bsf

      1  #============================================================================
      2  #Name        : bsf.py
      3  #Part of     : Helium
      4
      5  #Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
      6  #All rights reserved.
      7  #This component and the accompanying materials are made available
      8  #under the terms of the License "Eclipse Public License v1.0"
      9  #which accompanies this distribution, and is available
     10  #at the URL "http://www.eclipse.org/legal/epl-v10.html".
     11  #
     12  #Initial Contributors:
     13  #Nokia Corporation - initial contribution.
     14  #
     15  #Contributors:
     16  #
     17  #Description:
     18  #===============================================================================
     19
     20  """ Helper module to read bsf files.
     21  """
     22  import dircache
     23  import os.path
     24  import re
     25
     26 -class BSF(object):
     27      """ Class that parse and abstract a bsf file.
     28      """
     29 -    def __init__(self, filename, bsflist):
     30          self._filename = filename
     31          self._is_variant = False
     32          self._is_virtual_variant = False
     33          self._customize = None
     34          self._compile_with_parent = False
     35          self._list = bsflist
     36          self.parse()
     37
     38 -    def parse(self):
     39          """ Parse the bsf file
     40          """
     41          bsffile = open(self._filename)
     42          for line in bsffile.readlines():
     43              # skipping empty lines and comment
     44              if re.match(r"^(\s*|\s*#.*)$", line) != None:
     45                  continue
     46
     47              res = re.search(r"^^\s*(?P<key>\w+)\s+(?P<value>\w+)\s*$", line)
     48              if res != None:
     49                  if res.groupdict()['key'].lower() == "customizes":
     50                      self._customize = res.groupdict()['value']
     51
     52              if re.match(r"^^\s*VARIANT\s*$", line) != None:
     53                  self._is_variant = True
     54              if re.match(r"^^\s*VIRTUALVARIANT\s*$", line) != None:
     55                  self._is_virtual_variant = True
     56              if re.match(r"^^\s*COMPILEWITHPARENT\s*$", line) != None:
     57                  self._compile_with_parent = True
     58
     59
     60          bsffile.close()
     61
     62 -    def is_variant(self):
     63          """ I am a variant
     64          """
     65          return self._is_variant
     66
     67 -    def is_virtual_variant(self):
     68          """ I am a virtual variant
     69          """
     70          return self._is_virtual_variant
     71
     72 -    def customize(self):
     73          """ who am I customizing?
     74          """
     75          return self._customize.lower()
     76
     77 -    def compile_with_parent(self):
     78          """ who am I customizing?
     79          """
     80          return self._compile_with_parent
     81
     82 -    def get_name(self):
     83          """ get my name...
     84          """
     85          return os.path.splitext((os.path.basename(self._filename)))[0].lower()
     86
     87 -    def get_path_as_array(self):
     88          """ return myself plus my parents
     89          """
     90          result = [self.get_name()]
     91          parent = self._list[self.customize()]
     92          while not parent.is_virtual_variant():
     93              result.append(parent.get_name())
     94              parent = self._list[parent.customize()]
     95          result.reverse()
     96          return result
     97
     98 -    def get_path(self):
     99          """ return the path section
    100          """
    101          path = self.get_name()
    102          parent = self._list[self.customize()]
    103          while not parent.is_virtual_variant():
    104              path = parent.get_name()+'/'+path
    105              parent = self._list[parent.customize()]
    106          return path
    107
    108
    109 -def read_all(path="/epoc32/tools"):
    110      """ Read all bsfs from a directory
    111      """
    112      result = {}
    113      for bsf in dircache.listdir(path):
    114          if os.path.splitext(bsf)[1]==".bsf":
    115              bsf = BSF(path+"/"+bsf, result)
    116              result[bsf.get_name()] = bsf
    117      return result
    118
    119 -def get_includes(bsfs, product):
    120      """ Return an array representing all include path from specific path (product) to generic (platform)
    121      """
    122      result = []
    123      configs = bsfs[product].get_path_as_array()
    124      configs.reverse()
    125      for customisation in configs:
    126          result.append(bsfs[customisation].get_path())
    127      return result
    128