summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/__init__.py18
-rw-r--r--bitbake/lib/bb/utils.py571
2 files changed, 1 insertions, 588 deletions
diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py
index ae53b481c..f84bcd5f6 100644
--- a/bitbake/lib/bb/__init__.py
+++ b/bitbake/lib/bb/__init__.py
@@ -32,20 +32,7 @@ __all__ = [
"mkdirhier",
"movefile",
-
- "tokenize",
- "evaluate",
- "flatten",
- "relparse",
- "ververify",
- "isjustname",
- "isspecific",
- "pkgsplit",
- "catpkgsplit",
"vercmp",
- "pkgcmp",
- "dep_parenreduce",
- "dep_opconvert",
# fetch
"decodeurl",
@@ -98,10 +85,7 @@ def fatal(*args):
from bb.fetch import MalformedUrl, encodeurl, decodeurl
from bb.data import VarExpandError
from bb.utils import mkdirhier, movefile, copyfile, which
-from bb.utils import tokenize, evaluate, flatten
-from bb.utils import vercmp, pkgcmp, relparse, ververify
-from bb.utils import pkgsplit, catpkgsplit, isjustname, isspecific
-from bb.utils import dep_parenreduce, dep_opconvert
+from bb.utils import vercmp
if __name__ == "__main__":
import doctest, bb
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py
index ef049f7c7..5b7e7a360 100644
--- a/bitbake/lib/bb/utils.py
+++ b/bitbake/lib/bb/utils.py
@@ -615,574 +615,3 @@ def which(path, item, direction = 0):
return next
return ""
-
-whitespace = '\t\n\x0b\x0c\r '
-lowercase = 'abcdefghijklmnopqrstuvwxyz'
-
-def tokenize(mystring):
- """Breaks a string like 'foo? (bar) oni? (blah (blah))' into (possibly embedded) lists:
-
- >>> tokenize("x")
- ['x']
- >>> tokenize("x y")
- ['x', 'y']
- >>> tokenize("(x y)")
- [['x', 'y']]
- >>> tokenize("(x y) b c")
- [['x', 'y'], 'b', 'c']
- >>> tokenize("foo? (bar) oni? (blah (blah))")
- ['foo?', ['bar'], 'oni?', ['blah', ['blah']]]
- >>> tokenize("sys-apps/linux-headers nls? (sys-devel/gettext)")
- ['sys-apps/linux-headers', 'nls?', ['sys-devel/gettext']]
- """
-
- newtokens = []
- curlist = newtokens
- prevlists = []
- level = 0
- accum = ""
- for x in mystring:
- if x=="(":
- if accum:
- curlist.append(accum)
- accum=""
- prevlists.append(curlist)
- curlist=[]
- level=level+1
- elif x==")":
- if accum:
- curlist.append(accum)
- accum=""
- if level==0:
- print "!!! tokenizer: Unmatched left parenthesis in:\n'"+mystring+"'"
- return None
- newlist=curlist
- curlist=prevlists.pop()
- curlist.append(newlist)
- level=level-1
- elif x in whitespace:
- if accum:
- curlist.append(accum)
- accum=""
- else:
- accum=accum+x
- if accum:
- curlist.append(accum)
- if (level!=0):
- print "!!! tokenizer: Exiting with unterminated parenthesis in:\n'"+mystring+"'"
- return None
- return newtokens
-
-def evaluate(tokens,mydefines,allon=0):
- """Removes tokens based on whether conditional definitions exist or not.
- Recognizes !
-
- >>> evaluate(['sys-apps/linux-headers', 'nls?', ['sys-devel/gettext']], {})
- ['sys-apps/linux-headers']
-
- Negate the flag:
-
- >>> evaluate(['sys-apps/linux-headers', '!nls?', ['sys-devel/gettext']], {})
- ['sys-apps/linux-headers', ['sys-devel/gettext']]
-
- Define 'nls':
-
- >>> evaluate(['sys-apps/linux-headers', 'nls?', ['sys-devel/gettext']], {"nls":1})
- ['sys-apps/linux-headers', ['sys-devel/gettext']]
-
- Turn allon on:
-
- >>> evaluate(['sys-apps/linux-headers', 'nls?', ['sys-devel/gettext']], {}, True)
- ['sys-apps/linux-headers', ['sys-devel/gettext']]
- """
-
- if tokens == None:
- return None
- mytokens = tokens + [] # this copies the list
- pos = 0
- while pos < len(mytokens):
- if type(mytokens[pos]) == types.ListType:
- evaluate(mytokens[pos], mydefines)
- if not len(mytokens[pos]):
- del mytokens[pos]
- continue
- elif mytokens[pos][-1] == "?":
- cur = mytokens[pos][:-1]
- del mytokens[pos]
- if allon:
- if cur[0] == "!":
- del mytokens[pos]
- else:
- if cur[0] == "!":
- if (cur[1:] in mydefines) and (pos < len(mytokens)):
- del mytokens[pos]
- continue
- elif (cur not in mydefines) and (pos < len(mytokens)):
- del mytokens[pos]
- continue
- pos = pos + 1
- return mytokens
-
-def flatten(mytokens):
- """Converts nested arrays into a flat arrays:
-
- >>> flatten([1,[2,3]])
- [1, 2, 3]
- >>> flatten(['sys-apps/linux-headers', ['sys-devel/gettext']])
- ['sys-apps/linux-headers', 'sys-devel/gettext']
- """
-
- newlist=[]
- for x in mytokens:
- if type(x)==types.ListType:
- newlist.extend(flatten(x))
- else:
- newlist.append(x)
- return newlist
-
-_package_weights_ = {"pre":-2,"p":0,"alpha":-4,"beta":-3,"rc":-1} # dicts are unordered
-_package_ends_ = ["pre", "p", "alpha", "beta", "rc", "cvs", "bk", "HEAD" ] # so we need ordered list
-
-def relparse(myver):
- """Parses the last elements of a version number into a triplet, that can
- later be compared:
-
- >>> relparse('1.2_pre3')
- [1.2, -2, 3.0]
- >>> relparse('1.2b')
- [1.2, 98, 0]
- >>> relparse('1.2')
- [1.2, 0, 0]
- """
-
- number = 0
- p1 = 0
- p2 = 0
- mynewver = myver.split('_')
- if len(mynewver)==2:
- # an _package_weights_
- number = float(mynewver[0])
- match = 0
- for x in _package_ends_:
- elen = len(x)
- if mynewver[1][:elen] == x:
- match = 1
- p1 = _package_weights_[x]
- try:
- p2 = float(mynewver[1][elen:])
- except:
- p2 = 0
- break
- if not match:
- # normal number or number with letter at end
- divider = len(myver)-1
- if myver[divider:] not in "1234567890":
- # letter at end
- p1 = ord(myver[divider:])
- number = float(myver[0:divider])
- else:
- number = float(myver)
- else:
- # normal number or number with letter at end
- divider = len(myver)-1
- if myver[divider:] not in "1234567890":
- #letter at end
- p1 = ord(myver[divider:])
- number = float(myver[0:divider])
- else:
- number = float(myver)
- return [number,p1,p2]
-
-__ververify_cache__ = {}
-
-def ververify(myorigval,silent=1):
- """Returns 1 if given a valid version string, els 0. Valid versions are in the format
-
- <v1>.<v2>...<vx>[a-z,_{_package_weights_}[vy]]
-
- >>> ververify('2.4.20')
- 1
- >>> ververify('2.4..20') # two dots
- 0
- >>> ververify('2.x.20') # 'x' is not numeric
- 0
- >>> ververify('2.4.20a')
- 1
- >>> ververify('2.4.20cvs') # only one trailing letter
- 0
- >>> ververify('1a')
- 1
- >>> ververify('test_a') # no version at all
- 0
- >>> ververify('2.4.20_beta1')
- 1
- >>> ververify('2.4.20_beta')
- 1
- >>> ververify('2.4.20_wrongext') # _wrongext is no valid trailer
- 0
- """
-
- # Lookup the cache first
- try:
- return __ververify_cache__[myorigval]
- except KeyError:
- pass
-
- if len(myorigval) == 0:
- if not silent:
- bb.error("package version is empty")
- __ververify_cache__[myorigval] = 0
- return 0
- myval = myorigval.split('.')
- if len(myval)==0:
- if not silent:
- bb.error("package name has empty version string")
- __ververify_cache__[myorigval] = 0
- return 0
- # all but the last version must be a numeric
- for x in myval[:-1]:
- if not len(x):
- if not silent:
- bb.error("package version has two points in a row")
- __ververify_cache__[myorigval] = 0
- return 0
- try:
- foo = int(x)
- except:
- if not silent:
- bb.error("package version contains non-numeric '"+x+"'")
- __ververify_cache__[myorigval] = 0
- return 0
- if not len(myval[-1]):
- if not silent:
- bb.error("package version has trailing dot")
- __ververify_cache__[myorigval] = 0
- return 0
- try:
- foo = int(myval[-1])
- __ververify_cache__[myorigval] = 1
- return 1
- except:
- pass
-
- # ok, our last component is not a plain number or blank, let's continue
- if myval[-1][-1] in lowercase:
- try:
- foo = int(myval[-1][:-1])
- return 1
- __ververify_cache__[myorigval] = 1
- # 1a, 2.0b, etc.
- except:
- pass
- # ok, maybe we have a 1_alpha or 1_beta2; let's see
- ep=string.split(myval[-1],"_")
- if len(ep)!= 2:
- if not silent:
- bb.error("package version has more than one letter at then end")
- __ververify_cache__[myorigval] = 0
- return 0
- try:
- foo = string.atoi(ep[0])
- except:
- # this needs to be numeric, i.e. the "1" in "1_alpha"
- if not silent:
- bb.error("package version must have numeric part before the '_'")
- __ververify_cache__[myorigval] = 0
- return 0
-
- for mye in _package_ends_:
- if ep[1][0:len(mye)] == mye:
- if len(mye) == len(ep[1]):
- # no trailing numeric is ok
- __ververify_cache__[myorigval] = 1
- return 1
- else:
- try:
- foo = string.atoi(ep[1][len(mye):])
- __ververify_cache__[myorigval] = 1
- return 1
- except:
- # if no _package_weights_ work, *then* we return 0
- pass
- if not silent:
- bb.error("package version extension after '_' is invalid")
- __ververify_cache__[myorigval] = 0
- return 0
-
-def isjustname(mypkg):
- myparts = string.split(mypkg,'-')
- for x in myparts:
- if ververify(x):
- return 0
- return 1
-
-_isspecific_cache_={}
-
-def isspecific(mypkg):
- "now supports packages with no category"
- try:
- return __isspecific_cache__[mypkg]
- except:
- pass
-
- mysplit = string.split(mypkg,"/")
- if not isjustname(mysplit[-1]):
- __isspecific_cache__[mypkg] = 1
- return 1
- __isspecific_cache__[mypkg] = 0
- return 0
-
-__pkgsplit_cache__={}
-
-def pkgsplit(mypkg, silent=1):
-
- """This function can be used as a package verification function. If
- it is a valid name, pkgsplit will return a list containing:
- [pkgname, pkgversion(norev), pkgrev ].
-
- >>> pkgsplit('')
- >>> pkgsplit('x')
- >>> pkgsplit('x-')
- >>> pkgsplit('-1')
- >>> pkgsplit('glibc-1.2-8.9-r7')
- >>> pkgsplit('glibc-2.2.5-r7')
- ['glibc', '2.2.5', 'r7']
- >>> pkgsplit('foo-1.2-1')
- >>> pkgsplit('Mesa-3.0')
- ['Mesa', '3.0', 'r0']
- """
-
- try:
- return __pkgsplit_cache__[mypkg]
- except KeyError:
- pass
-
- myparts = string.split(mypkg,'-')
- if len(myparts) < 2:
- if not silent:
- bb.error("package name without name or version part")
- __pkgsplit_cache__[mypkg] = None
- return None
- for x in myparts:
- if len(x) == 0:
- if not silent:
- bb.error("package name with empty name or version part")
- __pkgsplit_cache__[mypkg] = None
- return None
- # verify rev
- revok = 0
- myrev = myparts[-1]
- ververify(myrev, silent)
- if len(myrev) and myrev[0] == "r":
- try:
- string.atoi(myrev[1:])
- revok = 1
- except:
- pass
- if revok:
- if ververify(myparts[-2]):
- if len(myparts) == 2:
- __pkgsplit_cache__[mypkg] = None
- return None
- else:
- for x in myparts[:-2]:
- if ververify(x):
- __pkgsplit_cache__[mypkg]=None
- return None
- # names can't have versiony looking parts
- myval=[string.join(myparts[:-2],"-"),myparts[-2],myparts[-1]]
- __pkgsplit_cache__[mypkg]=myval
- return myval
- else:
- __pkgsplit_cache__[mypkg] = None
- return None
-
- elif ververify(myparts[-1],silent):
- if len(myparts)==1:
- if not silent:
- print "!!! Name error in",mypkg+": missing name part."
- __pkgsplit_cache__[mypkg]=None
- return None
- else:
- for x in myparts[:-1]:
- if ververify(x):
- if not silent: bb.error("package name has multiple version parts")
- __pkgsplit_cache__[mypkg] = None
- return None
- myval = [string.join(myparts[:-1],"-"), myparts[-1],"r0"]
- __pkgsplit_cache__[mypkg] = myval
- return myval
- else:
- __pkgsplit_cache__[mypkg] = None
- return None
-
-__catpkgsplit_cache__ = {}
-
-def catpkgsplit(mydata,silent=1):
- """returns [cat, pkgname, version, rev ]
-
- >>> catpkgsplit('sys-libs/glibc-1.2-r7')
- ['sys-libs', 'glibc', '1.2', 'r7']
- >>> catpkgsplit('glibc-1.2-r7')
- [None, 'glibc', '1.2', 'r7']
- """
-
- try:
- return __catpkgsplit_cache__[mydata]
- except KeyError:
- pass
-
- cat = os.path.basename(os.path.dirname(mydata))
- mydata = os.path.join(cat, os.path.basename(mydata))
- if mydata[-3:] == '.bb':
- mydata = mydata[:-3]
-
- mysplit = mydata.split("/")
- p_split = None
- splitlen = len(mysplit)
- if splitlen == 1:
- retval = [None]
- p_split = pkgsplit(mydata,silent)
- else:
- retval = [mysplit[splitlen - 2]]
- p_split = pkgsplit(mysplit[splitlen - 1],silent)
- if not p_split:
- __catpkgsplit_cache__[mydata] = None
- return None
- retval.extend(p_split)
- __catpkgsplit_cache__[mydata] = retval
- return retval
-
-def pkgcmp(pkg1,pkg2):
- """ Compares two packages, which should have been split via
- pkgsplit(). if the return value val is less than zero, then pkg2 is
- newer than pkg1, zero if equal and positive if older.
-
- >>> pkgcmp(['glibc', '2.2.5', 'r7'], ['glibc', '2.2.5', 'r7'])
- 0
- >>> pkgcmp(['glibc', '2.2.5', 'r4'], ['glibc', '2.2.5', 'r7'])
- -1
- >>> pkgcmp(['glibc', '2.2.5', 'r7'], ['glibc', '2.2.5', 'r2'])
- 1
- """
-
- mycmp = vercmp(pkg1[1],pkg2[1])
- if mycmp > 0:
- return 1
- if mycmp < 0:
- return -1
- r1=string.atoi(pkg1[2][1:])
- r2=string.atoi(pkg2[2][1:])
- if r1 > r2:
- return 1
- if r2 > r1:
- return -1
- return 0
-
-def dep_parenreduce(mysplit, mypos=0):
- """Accepts a list of strings, and converts '(' and ')' surrounded items to sub-lists:
-
- >>> dep_parenreduce([''])
- ['']
- >>> dep_parenreduce(['1', '2', '3'])
- ['1', '2', '3']
- >>> dep_parenreduce(['1', '(', '2', '3', ')', '4'])
- ['1', ['2', '3'], '4']
- """
-
- while mypos < len(mysplit):
- if mysplit[mypos] == "(":
- firstpos = mypos
- mypos = mypos + 1
- while mypos < len(mysplit):
- if mysplit[mypos] == ")":
- mysplit[firstpos:mypos+1] = [mysplit[firstpos+1:mypos]]
- mypos = firstpos
- break
- elif mysplit[mypos] == "(":
- # recurse
- mysplit = dep_parenreduce(mysplit,mypos)
- mypos = mypos + 1
- mypos = mypos + 1
- return mysplit
-
-def dep_opconvert(mysplit, myuse):
- "Does dependency operator conversion"
-
- mypos = 0
- newsplit = []
- while mypos < len(mysplit):
- if type(mysplit[mypos]) == types.ListType:
- newsplit.append(dep_opconvert(mysplit[mypos],myuse))
- mypos += 1
- elif mysplit[mypos] == ")":
- # mismatched paren, error
- return None
- elif mysplit[mypos]=="||":
- if ((mypos+1)>=len(mysplit)) or (type(mysplit[mypos+1])!=types.ListType):
- # || must be followed by paren'd list
- return None
- try:
- mynew = dep_opconvert(mysplit[mypos+1],myuse)
- except Exception, e:
- bb.error("unable to satisfy OR dependancy: " + string.join(mysplit," || "))
- raise e
- mynew[0:0] = ["||"]
- newsplit.append(mynew)
- mypos += 2
- elif mysplit[mypos][-1] == "?":
- # use clause, i.e "gnome? ( foo bar )"
- # this is a quick and dirty hack so that repoman can enable all USE vars:
- if (len(myuse) == 1) and (myuse[0] == "*"):
- # enable it even if it's ! (for repoman) but kill it if it's
- # an arch variable that isn't for this arch. XXX Sparc64?
- if (mysplit[mypos][:-1] not in settings.usemask) or \
- (mysplit[mypos][:-1]==settings["ARCH"]):
- enabled=1
- else:
- enabled=0
- else:
- if mysplit[mypos][0] == "!":
- myusevar = mysplit[mypos][1:-1]
- enabled = not myusevar in myuse
- #if myusevar in myuse:
- # enabled = 0
- #else:
- # enabled = 1
- else:
- myusevar=mysplit[mypos][:-1]
- enabled = myusevar in myuse
- #if myusevar in myuse:
- # enabled=1
- #else:
- # enabled=0
- if (mypos +2 < len(mysplit)) and (mysplit[mypos+2] == ":"):
- # colon mode
- if enabled:
- # choose the first option
- if type(mysplit[mypos+1]) == types.ListType:
- newsplit.append(dep_opconvert(mysplit[mypos+1],myuse))
- else:
- newsplit.append(mysplit[mypos+1])
- else:
- # choose the alternate option
- if type(mysplit[mypos+1]) == types.ListType:
- newsplit.append(dep_opconvert(mysplit[mypos+3],myuse))
- else:
- newsplit.append(mysplit[mypos+3])
- mypos += 4
- else:
- # normal use mode
- if enabled:
- if type(mysplit[mypos+1]) == types.ListType:
- newsplit.append(dep_opconvert(mysplit[mypos+1],myuse))
- else:
- newsplit.append(mysplit[mypos+1])
- # otherwise, continue
- mypos += 2
- else:
- # normal item
- newsplit.append(mysplit[mypos])
- mypos += 1
- return newsplit
-