generate-binary.py
author daniel
Thu, 22 Nov 2012 15:52:59 +0100
changeset 118 6f2b8f437aa9
parent 63 441e835d254e
permissions -rwxr-xr-x
Clarification on the debug message
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
63
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
     1
#!/usr/bin/env python
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
     2
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
     3
def collect_source(source):
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
     4
    import os
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
     5
    sources = []
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
     6
    for root, dirs, files in os.walk(source):
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
     7
        for f in files:
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
     8
            if f.endswith('.py'):
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
     9
                sources.append(os.path.join(root, f))
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    10
    return sources
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    11
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    12
def calculate_hash(sources):
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    13
    import hashlib
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    14
    m = hashlib.md5()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    15
    for source in sources:
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    16
        f = open(source, 'r')
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    17
        for line in f:
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    18
            m.update(line)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    19
        f.close()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    20
    md5hash = m.hexdigest()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    21
    return md5hash
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    22
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    23
def generate_zip(sources):
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    24
    import zipfile
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    25
    import tempfile
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    26
    import os
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    27
    (handle, pathname) = tempfile.mkstemp()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    28
    f = zipfile.ZipFile(pathname, 'w')
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    29
    for source in sources:
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    30
        f.write(source)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    31
    f.close()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    32
    os.close(handle)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    33
    return pathname
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    34
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    35
def generate_binary(source_dir, output):
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    36
    import base64
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    37
    import StringIO
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    38
    sources = collect_source(source_dir)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    39
    sources_md5 = calculate_hash(sources)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    40
    zipfile = generate_zip(sources)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    41
    zipdata = StringIO.StringIO()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    42
    base64.encode(open(zipfile, 'r'), zipdata)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    43
    
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    44
    f = open(output, 'w')
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    45
    f.write("""#!/usr/bin/env python
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    46
sources = [%s]
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    47
sources_md5 = "%s"
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    48
zipdata = \"\"\"%s\"\"\"
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    49
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    50
def decompress(output):
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    51
    import StringIO
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    52
    import zipfile
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    53
    import base64
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    54
    decoded = StringIO.StringIO()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    55
    base64.decode(StringIO.StringIO(zipdata), decoded)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    56
    f = zipfile.ZipFile(decoded, 'r')
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    57
    f.extractall(pathname)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    58
    f.close()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    59
    
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    60
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    61
import os
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    62
import sys
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    63
pathname = os.path.join('.bake', sources_md5)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    64
if not os.path.exists(pathname):
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    65
    os.makedirs(pathname)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    66
    decompress(pathname)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    67
elif not os.path.isdir(pathname):
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    68
    import tempfile
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    69
    pathname = tempfile.mkdtemp()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    70
    decompress(pathname)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    71
sys.path.append(pathname)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    72
import %s as source
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    73
source.main(sys.argv)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    74
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    75
""" % (','.join(["'%s'" % source for source in sources]), sources_md5, zipdata.getvalue(),
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    76
       source_dir))
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    77
    f.close()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    78
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    79
if __name__ == '__main__':
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    80
    import optparse
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    81
    parser = optparse.OptionParser()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    82
    parser.add_option('-s', '--source', dest='source', type='string', action='store', default='bake',
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    83
                      help='Source directory to embedd')
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    84
    parser.add_option('-o', '--output', dest='output', type='string', action='store', default='bake.binary',
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    85
                      help='Executable to generate')
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    86
    (options, args) = parser.parse_args()
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    87
    generate_binary(options.source, options.output)
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    88
    
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    89
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    90
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    91
    
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    92
441e835d254e script to generate bake binary
Mathieu Lacage <mathieu.lacage@gmail.com>
parents:
diff changeset
    93