#!/usr/bin/python

import os, sys, struct, optparse, StringIO, ConfigParser

make_option = optparse.make_option

defines = {}
def add_var(option, opt, value, parser):
    var, val = value.split('=')
    defines[var] = val

opt = optparse.OptionParser(option_list = [
        make_option('-o',
                    dest = 'output',
                    help = 'write to FILE',
                    metavar = 'FILE'),
        make_option('-d',
                    dest = 'depends',
                    help = 'write dependencies to FILE',
                    metavar = 'FILE',
                    default = None),
        make_option('-m',
                    dest = 'manifest',
                    help = 'read manifest from FILE',
                    metavar = 'FILE'),
        make_option('-D',
                    type = 'string',
                    help = 'define VAR=DATA',
                    metavar = 'VAR=DATA',
                    action = 'callback',
                    callback = add_var),
])

(options, args) = opt.parse_args()

metadata_size = 128
depends = StringIO.StringIO()
if options.depends:
    depends = file(options.depends, 'w')
out = file(options.output, 'w')
manifest = ConfigParser.SafeConfigParser()
manifest.optionxform = str # avoid lowercasing
manifest.read(options.manifest)

depends.write('%s: \\\n' % (options.output,))

files = dict([(f, manifest.get('manifest', f, vars = defines))
              for f in manifest.options('manifest')])
pos = (len(files) + 1) * metadata_size

for name, hostname in files.items():
    size = os.stat(hostname).st_size
    metadata = struct.pack('QQ112s', size, pos, name)
    out.write(metadata)
    pos += size
    depends.write('\t%s \\\n' % (hostname,))

out.write(struct.pack('128s', ''))

for name, hostname in files.items():
    out.write(file(hostname).read())

depends.write('\n\n')

out.close()
depends.close()