(no commit message)
[bitbake.git] / bin / oe / parse / ConfHandler.py
1 """class for handling configuration data files
2
3    Reads the file and obtains its metadata"""
4
5 import re, oedata, os, sys
6 from oe import debug
7
8 __config_regexp__  = re.compile( r"(?P<exp>export\s*)?(?P<var>\w+)\s*(?P<colon>:)?=\s*(?P<apo>['\"]?)(?P<value>.*)(?P=apo)$")
9 __include_regexp__ = re.compile( r"include\s+(.+)" )
10
11 def supports(fn):
12         return fn[-5:] == ".conf"
13
14 def include(oldfn, fn, data = {}):
15         if oldfn == fn: # prevent infinate recursion
16                 return 1
17
18         from oeparse import handle
19         return handle(fn, data)
20
21 def handle(fn, data = {}):
22         oedata.setVar('TOPDIR', os.getcwd(), data)
23         oedata.setVar('OEDIR', os.path.join(sys.prefix, "share/oe"), data)
24         oedata.setVar('OEPATH', "${OEDIR}/bin:${OEDIR}:${TOPDIR}/bin:${TOPDIR}", data)
25         fn = os.path.abspath(fn)
26         f = open(fn,'r')
27         lineno = 0
28         while 1:
29                 lineno = lineno + 1
30                 s = f.readline()
31                 if not s: break
32                 s = s.strip()
33                 if not s: continue              # skip empty lines
34                 if s[0] == '#': continue        # skip comments
35                 while s[-1] == '\\':
36                         s2 = f.readline()[:-1].strip()
37                         s = s[:-1] + s2
38                 feeder(lineno, s, fn, data)
39         return data
40
41 def feeder(lineno, s, fn, data = {}):
42         m = __config_regexp__.match(s)
43         if m:
44                 groupd = m.groupdict()
45                 key = groupd["var"]
46                 if groupd.has_key("exp") and groupd["exp"] != None:
47                         oedata.setVarFlag(key, "export", 1, data)
48                 if groupd.has_key("colon") and groupd["colon"] != None:
49                         val = oedata.expand(groupd["value"], data)
50                 else:
51                         val = groupd["value"]
52                 oedata.setVar(key, val, data)
53                 return
54
55         m = __include_regexp__.match(s)
56         if m:
57                 s = oedata.expand(m.group(1), data)
58                 if os.access(os.path.abspath(s), os.R_OK):
59                         debug(2, "%s:%d: including %s" % (fn, lineno, s))
60 #                       inherit_os_env(2, self.env)
61                         include(fn, s, data)
62                 else:
63                         debug(1, "%s:%d: could not import %s" % (fn, lineno, s))
64                 return
65
66 # Add us to the handlers list
67 from oeparse import handlers
68 handlers.append({'supports': supports, 'handle': handle})
69 del handlers