Manifest updates.. preparing to actually make use of it.
[vuplus_bitbake] / bin / oe / manifest.py
1 #!/usr/bin/env python
2
3 import os, sys, string
4 import oe, oe.data
5
6 def getfields(line):
7         fields = {}
8         fieldmap = ( "pkg", "src", "dest", "type", "mode", "uid", "gid", "major", "minor", "start", "inc", "count" )
9         for f in xrange(len(fieldmap)):
10                 fields[fieldmap[f]] = None
11
12         if not line:
13                 return None
14
15         splitline = line.split()
16         if not len(splitline):
17                 return None
18
19         try:
20                 for f in xrange(len(fieldmap)):
21                         if splitline[f] == '-':
22                                 continue
23                         fields[fieldmap[f]] = splitline[f]
24         except IndexError:
25                 pass
26         return fields
27
28 def parse (mfile, d):
29         manifest = []
30         while 1:
31                 line = mfile.readline()
32                 if not line:
33                         break
34                 if line.startswith("#"):
35                         continue
36                 fields = getfields(oe.data.expand(line, d))
37                 if not fields:
38                         continue
39                 manifest.append(fields)
40         return manifest
41
42 def emit (func, manifest, d):
43 #str = "%s () {\n" % func
44         str = ""
45         for line in manifest:
46                 emittedline = emit_line(func, line, d)
47                 if not emittedline:
48                         continue
49                 str += emittedline + "\n"
50 #       str += "}\n"
51         return str
52
53 def mangle (func, line):
54         src = line["src"]
55
56         if src:
57                 if not os.path.isabs(src):
58                         src = "${WORKDIR}/" + src
59
60         dest = line["dest"]
61         if not dest:
62                 return
63
64         if dest.startswith("/"):
65                 dest = dest[1:]
66
67         if func is "do_install":
68                 dest = "${D}/" + dest
69
70         elif func is "do_populate":
71                 dest = "${WORKDIR}/install/" + line["pkg"] + "/" + dest
72
73         elif func is "do_stage":
74                 varmap = {}
75                 varmap["${bindir}"] = "${STAGING_BINDIR}"
76                 varmap["${libdir}"] = "${STAGING_LIBDIR}"
77                 varmap["${includedir}"] = "${STAGING_INCDIR}"
78                 varmap["${datadir}"] = "${STAGING_DIR}/share"
79
80                 matched = 0
81                 for key in varmap.keys():
82                         if dest.startswith(key):
83                                 dest = varmap[key] + "/" + dest[len(key):]
84                                 matched = 1
85                 if not matched:
86                         line = None
87                         return
88         else:
89                 line = None
90                 return
91
92         line["src"] = src
93         line["dest"] = dest
94
95 def emit_line (func, line, d):
96         import copy
97         newline = copy.deepcopy(line)
98         mangle(func, newline)
99         if not newline:
100                 return None
101
102         str = ""
103         type = newline["type"]
104         mode = newline["mode"]
105         src = newline["src"]
106         dest = newline["dest"]
107         if type is "d":
108                 str = "install -d " + dest
109                 if mode:
110                         str += "-m %s " % mode
111         elif type is "f":
112                 if not src:
113                         return None
114                 str = "install -D "
115                 if mode:
116                         str += "-m %s " % mode
117                 str += src + " " + dest
118         del newline
119         return str