5 # Write a file containing frozen code for the modules in the dictionary.
10 static struct _frozen _PyImport_FrozenModules[] = {
13 {0, 0, 0} /* sentinel */
17 # if __debug__ == 0 (i.e. -O option given), set Py_OptimizeFlag in frozen app.
18 default_entry_point
= """
20 main(int argc, char **argv)
22 extern int Py_FrozenMain(int, char **);
23 """ + ((not __debug__
and """
26 PyImport_FrozenModules = _PyImport_FrozenModules;
27 return Py_FrozenMain(argc, argv);
32 def makefreeze(base
, dict, debug
=0, entry_point
=None, fail_import
=()):
33 if entry_point
is None: entry_point
= default_entry_point
40 mangled
= "__".join(mod
.split("."))
42 file = 'M_' + mangled
+ '.c'
43 outfp
= bkfile
.open(base
+ file, 'w')
46 print "freezing", mod
, "..."
47 str = marshal
.dumps(m
.__code
__)
50 # Indicate package by negative size
52 done
.append((mod
, mangled
, size
))
53 writecode(outfp
, mangled
, str)
56 print "generating table of frozen modules"
57 outfp
= bkfile
.open(base
+ 'frozen.c', 'w')
58 for mod
, mangled
, size
in done
:
59 outfp
.write('extern unsigned char M_%s[];\n' % mangled
)
61 for mod
, mangled
, size
in done
:
62 outfp
.write('\t{"%s", M_%s, %d},\n' % (mod
, mangled
, size
))
64 # The following modules have a NULL code pointer, indicating
65 # that the prozen program should not search for them on the host
66 # system. Importing them will *always* raise an ImportError.
67 # The zero value size is never used.
68 for mod
in fail_import
:
69 outfp
.write('\t{"%s", NULL, 0},\n' % (mod
,))
71 outfp
.write(entry_point
)
77 # Write a C initializer for a module containing the frozen python code.
78 # The array is called M_<mod>.
80 def writecode(outfp
, mod
, str):
81 outfp
.write('unsigned char M_%s[] = {' % mod
)
82 for i
in range(0, len(str), 16):
85 outfp
.write('%d,' % ord(c
))
88 ## def writecode(outfp, mod, str):
89 ## outfp.write('unsigned char M_%s[%d] = "%s";\n' % (mod, len(str),
90 ## '\\"'.join(map(lambda s: `s`[1:-1], str.split('"')))))