blob: 0c574e0b3da75de961bec5064a6e044fead88983 [file] [log] [blame]
Brian Silvermanb67da232015-09-12 23:50:30 -04001#!/usr/bin/python
2
3import zlib, sys, os, stat
4
5with file(sys.argv[2], "wb+") as outf:
6 outf.write("""#!/usr/bin/env ruby
7require "zlib"
8
9def zip_file_binding()
10 binding()
11end
12
13module Kernel
14 class ZipRequireRecord
15 attr_accessor :fname, :val
16 def initialize(fname, val)
17 @fname = fname
18 @val = val
19 end
20 def do_require()
21 return false if !@val
22 eval(@val, binding = zip_file_binding(), filename="//@bazel/" + @fname)
23 @val = nil
24 return true
25 end
26 end
27 BAZEL_START_ENTRY = "/@bazel/"
28 ZIP_TEMP_OBJS = {}
29 def require_relative(relative_feature)
30 file = caller.first.split(/:\d/,2).first
31 raise LoadError, "require_relative is called in #{$1}" if /\A\((.*)\)/ =~ file
32 require File.expand_path(relative_feature, File.dirname(file))
33 end
34 def require_zip(moduleName)
35 if moduleName.start_with?(BAZEL_START_ENTRY)
36 moduleName = moduleName[BAZEL_START_ENTRY.length..-1]
37 end
38 zip_obj = ZIP_TEMP_OBJS[moduleName]
39 if not zip_obj and !moduleName.end_with?('.rb')
40 zip_obj = ZIP_TEMP_OBJS[moduleName + '.rb']
41 end
42 return zip_obj.do_require() if (zip_obj)
43 return pre_zip_load_require(moduleName)
44 end
45 alias :pre_zip_load_require :require
46 alias :require :require_zip
47 def init_app(main_fname)
48 $0 = "//@bazel/" + main_fname
49 Kernel.require_zip(main_fname)
50 end
51 def register_inline_file(fname, data)
52 raise if ZIP_TEMP_OBJS.has_key?(fname)
53 ZIP_TEMP_OBJS[fname] = Kernel::ZipRequireRecord.new(fname, data.force_encoding("UTF-8"))
54 end
55end
56
57my_data = Zlib.inflate(DATA.read())
58""")
59
60 blob_data = []
61 offset = 0
62 with file(sys.argv[1], 'r') as infile:
63 for line in infile.xreadlines():
64 file_outname, file_binname = line.strip().split('|')
65 with file(file_binname, 'r') as obj_file:
66 obj = obj_file.read()
67 blob_data.append(obj)
68 new_off = offset + len(obj)
69 outf.write("Kernel.register_inline_file(%s, my_data.slice(%s...%s))\n" %
70 (repr(file_outname), offset, new_off))
71 offset = new_off
72
73 outf.write("Kernel.init_app(%s)\n" % repr(sys.argv[3]))
74 outf.write("__END__\n")
75 outf.write(zlib.compress("".join(blob_data)))