lib/bb/parse/parse_c: Throw Parse Exceptions, crash less often
[vuplus_bitbake] / lib / bb / parse / parse_c / BBHandler.py
index 771a7a0..984ba39 100644 (file)
@@ -1,32 +1,43 @@
 # ex:ts=4:sw=4:sts=4:et
 # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
-#
-# Copyright (C) 2006 Holger Hans Peter Freyther
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-# SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-# THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
+"""class for handling .bb files (using a C++ parser)
+
+    Reads a .bb file and obtains its metadata (using a C++ parser)
+
+    Copyright (C) 2006 Tim Robert Ansell
+       Copyright (C) 2006 Holger Hans Peter Freyther
+   
+    This program is free software; you can redistribute it and/or modify it under
+    the terms of the GNU General Public License as published by the Free Software
+    Foundation; either version 2 of the License, or (at your option) any later
+    version.
+
+       Permission is hereby granted, free of charge, to any person obtaining a copy
+       of this software and associated documentation files (the "Software"), to deal
+       in the Software without restriction, including without limitation the rights
+       to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+       copies of the Software, and to permit persons to whom the Software is
+       furnished to do so, subject to the following conditions:
+
+       The above copyright notice and this permission notice shall be included in all
+       copies or substantial portions of the Software.
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+       IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+       SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+       DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+       OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+       THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+"""
+
+import os, sys
 
 # The Module we will use here
-from bb import data, parse
-from bb.parse import ParseError
 import bb
 
+from bitbakec import parsefile
+
 #
 # This is the Python Part of the Native Parser Implementation.
 # We will only parse .bbclass, .inc and .bb files but no
@@ -36,11 +47,6 @@ import bb
 #
 # The rest of the methods are internal implementation details.
 
-
-
-#
-# internal
-#
 def _init(fn, d):
     """
     Initialize the data implementation with values of
@@ -52,53 +58,81 @@ def _init(fn, d):
 # public
 #
 def supports(fn, data):
-    return fn[-3:] == ".bb" or fn[-8:] == ".bbclass" or fn[-4:] == ".inc"
+    return fn[-3:] == ".bb" or fn[-8:] == ".bbclass" or fn[-4:] == ".inc" or fn[-5:] == ".conf"
 
 def init(fn, data):
     if not bb.data.getVar('TOPDIR', data):
-        bb.error('TOPDIR is not set')
+        bb.data.setVar('TOPDIR', os.getcwd(), data)
     if not bb.data.getVar('BBPATH', data):
-        bb.error('BBPATH is not set')
+        bb.data.setVar('BBPATH', os.path.join(sys.prefix, 'share', 'bitbake'), data)
 
 
 def handle(fn, d, include):
-    print ""
-    print "fn: %s" % fn
-    print "data: %s" % data
-    print "include: %s" % include
+    from bb import data, parse
+
+    #print ""
+    #print "fn: %s" % fn
+    #print "data: %s" % d
+    #print dir(d)
+    #print d.getVar.__doc__
+    #print "include: %s" % fn
+
+    # initialize with some data
+    init(fn,d)
 
     # check if we include or are the beginning
     if include:
-        oldfile = data.getVar('FILE', d)
+        oldfile = d.getVar('FILE', False)
     else:
-        data.inheritFromOS(d)
+        if fn[-5:] == ".conf":
+            data.inheritFromOS(d)
         oldfile = None
 
     # find the file
     if not os.path.isabs(fn):
-        bb.error("No Absolute FILE name")
-        abs_fn = bb.which(data.getVar('BBPATH',d), fn)
+        abs_fn = bb.which(d.getVar('BBPATH', True), fn)
     else:
         abs_fn = fn
 
     # check if the file exists
     if not os.path.exists(abs_fn):
-        raise IOError("file '%(fn)' not found" % locals() )
-
-    fn = file(abs_fn, 'r')
+        raise IOError("file '%(fn)s' not found" % locals() )
 
     # now we know the file is around mark it as dep
     if include:
         parse.mark_dependency(d, abs_fn)
 
     # now parse this file - by defering it to C++
-
+    parsefile(abs_fn, d)
 
     # restore the original FILE
     if oldfile:
-        data.setVar('FILE', oldfile, data)
+        d.setVar('FILE', oldfile)
+
+    return d
+
+
+# Needed for BitBake files...
+__pkgsplit_cache__={}
+def vars_from_file(mypkg, d):
+    if not mypkg:
+        return (None, None, None)
+    if mypkg in __pkgsplit_cache__:
+        return __pkgsplit_cache__[mypkg]
+
+    myfile = os.path.splitext(os.path.basename(mypkg))
+    parts = myfile[0].split('_')
+    __pkgsplit_cache__[mypkg] = parts
+    exp = 3 - len(parts)
+    tmplist = []
+    while exp != 0:
+        exp -= 1
+        tmplist.append(None)
+    parts.extend(tmplist)
+    return parts
+
+
 
-    return data
 
 # Inform bitbake that we are a parser
 # We need to define all three