145 lines
3.8 KiB
Python
145 lines
3.8 KiB
Python
# ex:ts=4:sw=4:sts=4:et
|
|
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
|
|
#
|
|
# Copyright (C) 2003, 2004 Chris Larson
|
|
#
|
|
# 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.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along with
|
|
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
# Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
|
|
import os, sys
|
|
import bb, bb.data
|
|
|
|
def getfields(line):
|
|
fields = {}
|
|
fieldmap = ( "pkg", "src", "dest", "type", "mode", "uid", "gid", "major", "minor", "start", "inc", "count" )
|
|
for f in xrange(len(fieldmap)):
|
|
fields[fieldmap[f]] = None
|
|
|
|
if not line:
|
|
return None
|
|
|
|
splitline = line.split()
|
|
if not len(splitline):
|
|
return None
|
|
|
|
try:
|
|
for f in xrange(len(fieldmap)):
|
|
if splitline[f] == '-':
|
|
continue
|
|
fields[fieldmap[f]] = splitline[f]
|
|
except IndexError:
|
|
pass
|
|
return fields
|
|
|
|
def parse (mfile, d):
|
|
manifest = []
|
|
while 1:
|
|
line = mfile.readline()
|
|
if not line:
|
|
break
|
|
if line.startswith("#"):
|
|
continue
|
|
fields = getfields(line)
|
|
if not fields:
|
|
continue
|
|
manifest.append(fields)
|
|
return manifest
|
|
|
|
def emit (func, manifest, d):
|
|
#str = "%s () {\n" % func
|
|
str = ""
|
|
for line in manifest:
|
|
emittedline = emit_line(func, line, d)
|
|
if not emittedline:
|
|
continue
|
|
str += emittedline + "\n"
|
|
# str += "}\n"
|
|
return str
|
|
|
|
def mangle (func, line, d):
|
|
import copy
|
|
newline = copy.copy(line)
|
|
src = bb.data.expand(newline["src"], d)
|
|
|
|
if src:
|
|
if not os.path.isabs(src):
|
|
src = "${WORKDIR}/" + src
|
|
|
|
dest = newline["dest"]
|
|
if not dest:
|
|
return
|
|
|
|
if dest.startswith("/"):
|
|
dest = dest[1:]
|
|
|
|
if func is "do_install":
|
|
dest = "${D}/" + dest
|
|
|
|
elif func is "do_populate":
|
|
dest = "${WORKDIR}/install/" + newline["pkg"] + "/" + dest
|
|
|
|
elif func is "do_stage":
|
|
varmap = {}
|
|
varmap["${bindir}"] = "${STAGING_DIR}/${HOST_SYS}/bin"
|
|
varmap["${libdir}"] = "${STAGING_DIR}/${HOST_SYS}/lib"
|
|
varmap["${includedir}"] = "${STAGING_DIR}/${HOST_SYS}/include"
|
|
varmap["${datadir}"] = "${STAGING_DATADIR}"
|
|
|
|
matched = 0
|
|
for key in varmap.keys():
|
|
if dest.startswith(key):
|
|
dest = varmap[key] + "/" + dest[len(key):]
|
|
matched = 1
|
|
if not matched:
|
|
newline = None
|
|
return
|
|
else:
|
|
newline = None
|
|
return
|
|
|
|
newline["src"] = src
|
|
newline["dest"] = dest
|
|
return newline
|
|
|
|
def emit_line (func, line, d):
|
|
import copy
|
|
newline = copy.deepcopy(line)
|
|
newline = mangle(func, newline, d)
|
|
if not newline:
|
|
return None
|
|
|
|
str = ""
|
|
type = newline["type"]
|
|
mode = newline["mode"]
|
|
src = newline["src"]
|
|
dest = newline["dest"]
|
|
if type is "d":
|
|
str = "install -d "
|
|
if mode:
|
|
str += "-m %s " % mode
|
|
str += dest
|
|
elif type is "f":
|
|
if not src:
|
|
return None
|
|
if dest.endswith("/"):
|
|
str = "install -d "
|
|
str += dest + "\n"
|
|
str += "install "
|
|
else:
|
|
str = "install -D "
|
|
if mode:
|
|
str += "-m %s " % mode
|
|
str += src + " " + dest
|
|
del newline
|
|
return str
|