support python function expansion
[vuplus_bitbake] / bin / parse_manifest.py
1 #!/usr/bin/env python
2
3 import os, sys, string
4
5 srcdir = "${WORKDIR}"
6 destdir = "${D}"
7 pkgdestdir = "${WORKDIR}/install"
8
9 manifest = sys.__stdin__
10 if len(sys.argv) == 2:
11         manifest = file(sys.argv[1], "r")
12
13 def mangle_path_stage(field, fields):
14         path = fields[field]
15         if not path:
16                 return None
17         if field == "src":
18                 if os.path.isabs(path):
19                         return path
20                 if path.startswith('/'):
21                         path = path[1:]
22                 path = os.path.join(srcdir, path)
23         elif field == "dest":   
24                 if os.path.isabs(path):
25                         return path
26                 if path.startswith('/'):
27                         path = path[1:]
28                 path = os.path.join(destdir, path)
29                 libpath = os.path.join(destdir, '${libdir}')
30                 incpath = os.path.join(destdir, '${includedir}')
31                 if path.startswith(libpath):
32                         path = "${STAGING_LIBDIR}" + path[len(libpath):]
33                 elif path.startswith(incpath):
34                         path = "${STAGING_INCDIR}" + path[len(incpath):]
35                 else:
36                         return None     
37         return path     
38
39 def mangle_path_install(field, fields):
40         path = fields[field]
41         if not path:
42                 return None
43         if field == "src":
44                 if os.path.isabs(path):
45                         return path
46                 if path.startswith('/'):
47                         path = path[1:]
48                 path = os.path.join(srcdir, path)
49         elif field == "dest":
50                 if os.path.isabs(path):
51                         return path
52                 if path.startswith('/'):
53                         path = path[1:]
54                 path = os.path.join(destdir, path)
55         return path
56
57 def mangle_path_populate(field, fields):
58         path = fields[field]
59         pkg = fields["pkg"]
60         if None in (pkg, path):
61                 return None
62         if field == "src":
63                 if os.path.isabs(path):
64                         return path
65                 if path.startswith('/'):
66                         path = path[1:]
67                 path = os.path.join(srcdir, path)
68         elif field == "dest":
69                 if os.path.isabs(path):
70                         return path
71                 if path.startswith('/'):
72                         path = path[1:]
73                 path = os.path.join(pkgdestdir, pkg, path)
74         return path
75
76 def getfields(line):
77         fields = {}
78         fieldmap = ( "pkg", "src", "dest", "type", "mode", "uid", "gid", "major", "minor", "start", "inc", "count" )
79         for f in xrange(len(fieldmap)):
80                 fields[fieldmap[f]] = None
81         
82         if not line:
83                 return None
84
85         splitline = line.split()
86         if not len(splitline):
87                 return None
88
89         try:
90                 for f in xrange(len(fieldmap)):
91                         if splitline[f] == '-':
92                                 continue
93                         fields[fieldmap[f]] = splitline[f]
94         except IndexError:
95                 pass
96         return fields
97
98 def handle_directory(fields, commands, mangle_path):
99         dest = fields["dest"]
100         if not dest:
101                 return
102         if os.path.isabs(dest):
103                 return
104         if dest.startswith('/'):
105                 dest = dest[1:]
106         cmd = "install -d "
107         dest = mangle_path("dest", fields)
108         if not dest:
109                 return
110         cmd += os.path.dirname(dest)
111         if not cmd in commands:
112                 commands.append(cmd)
113
114 def handle_file(fields, commands, mangle_path):
115         if None in (fields["src"], fields["dest"]):
116                 return
117
118         handle_directory(fields, commands, mangle_path)
119         src = mangle_path("src", fields)
120         if not src:
121                 return
122         dest = mangle_path("dest", fields)
123         if not dest:
124                 return
125         mode = fields["mode"]
126
127         cmd = "install "
128         if mode:
129                 cmd += "-m " + mode + " "
130         cmd += src + " " + dest
131         if not cmd in commands:
132                 commands.append(cmd)
133
134 def handle_symbolic_link(fields, commands, mangle_path):
135         if None in (fields["src"], fields["dest"]):
136                 return
137
138         handle_directory(fields, commands, mangle_path)
139         dest = mangle_path("dest", fields)
140         src = fields["src"]
141         if None in (src, dest):
142                 return
143
144         cmd = "ln -sf " + src + " " + dest
145         if not cmd in commands:
146                 commands.append(cmd)
147
148 def handle_hard_link(fields, commands, mangle_path):
149         if None in (fields["src"], fields["dest"]):
150                 return
151
152         handle_directory(fields, commands, mangle_path)
153         src = mangle_path("src", fields)
154         dest = mangle_path("dest", fields)
155         if None in (src, dest):
156                 return
157
158         cmd = "ln -f " + src + " " + dest
159         if not cmd in commands:
160                 commands.append(cmd)
161
162 commands = list()
163 commands_populate = list()
164 commands_stage = list()
165 entries = list()        
166 while 1:
167         line = manifest.readline()
168         if not line:
169                 break
170         if line.startswith("#"):
171                 # skip comments
172                 continue
173         fields = getfields(line)
174         if not fields:
175                 continue
176
177         if not fields in entries:
178                 entries.append(fields)
179                         
180         if fields["type"] == "d":
181                 handle_directory(fields, commands, mangle_path_install)
182         if fields["type"] == "f":
183                 handle_file(fields, commands, mangle_path_install)
184         if fields["type"] == "s":
185                 handle_symbolic_link(fields, commands, mangle_path_install)
186         if fields["type"] == "h":
187                 handle_hard_link(fields, commands, mangle_path_install)
188
189         if fields["type"] == "d":
190                 handle_directory(fields, commands_populate, mangle_path_populate)
191         if fields["type"] == "f":
192                 handle_file(fields, commands_populate, mangle_path_populate)
193         if fields["type"] == "s":
194                 handle_symbolic_link(fields, commands_populate, mangle_path_populate)
195         if fields["type"] == "h":
196                 handle_hard_link(fields, commands_populate, mangle_path_populate)
197
198         if fields["type"] == "d":
199                 handle_directory(fields, commands_stage, mangle_path_stage)
200         if fields["type"] == "f":
201                 handle_file(fields, commands_stage, mangle_path_stage)
202         if fields["type"] == "s":
203                 handle_symbolic_link(fields, commands_stage, mangle_path_stage)
204         
205 print "do_stage () {"
206 print '\t' + string.join(commands_stage, '\n\t')
207 print "}"
208 print "do_install () {"
209 print '\t' + string.join(commands, '\n\t')
210 print "}"
211 print "do_populate () {"
212 print '\t' + string.join(commands_populate, '\n\t')
213 print "}"