+++ /dev/null
-import marshal\r
-import bkfile\r
-\r
-\r
-# Write a file containing frozen code for the modules in the dictionary.\r
-\r
-header = """\r
-#include "Python.h"\r
-\r
-static struct _frozen _PyImport_FrozenModules[] = {\r
-"""\r
-trailer = """\\r
- {0, 0, 0} /* sentinel */\r
-};\r
-"""\r
-\r
-# if __debug__ == 0 (i.e. -O option given), set Py_OptimizeFlag in frozen app.\r
-default_entry_point = """\r
-int\r
-main(int argc, char **argv)\r
-{\r
- extern int Py_FrozenMain(int, char **);\r
-""" + ((not __debug__ and """\r
- Py_OptimizeFlag++;\r
-""") or "") + """\r
- PyImport_FrozenModules = _PyImport_FrozenModules;\r
- return Py_FrozenMain(argc, argv);\r
-}\r
-\r
-"""\r
-\r
-def makefreeze(base, dict, debug=0, entry_point=None, fail_import=()):\r
- if entry_point is None: entry_point = default_entry_point\r
- done = []\r
- files = []\r
- mods = dict.keys()\r
- mods.sort()\r
- for mod in mods:\r
- m = dict[mod]\r
- mangled = "__".join(mod.split("."))\r
- if m.__code__:\r
- file = 'M_' + mangled + '.c'\r
- outfp = bkfile.open(base + file, 'w')\r
- files.append(file)\r
- if debug:\r
- print "freezing", mod, "..."\r
- str = marshal.dumps(m.__code__)\r
- size = len(str)\r
- if m.__path__:\r
- # Indicate package by negative size\r
- size = -size\r
- done.append((mod, mangled, size))\r
- writecode(outfp, mangled, str)\r
- outfp.close()\r
- if debug:\r
- print "generating table of frozen modules"\r
- outfp = bkfile.open(base + 'frozen.c', 'w')\r
- for mod, mangled, size in done:\r
- outfp.write('extern unsigned char M_%s[];\n' % mangled)\r
- outfp.write(header)\r
- for mod, mangled, size in done:\r
- outfp.write('\t{"%s", M_%s, %d},\n' % (mod, mangled, size))\r
- outfp.write('\n')\r
- # The following modules have a NULL code pointer, indicating\r
- # that the prozen program should not search for them on the host\r
- # system. Importing them will *always* raise an ImportError.\r
- # The zero value size is never used.\r
- for mod in fail_import:\r
- outfp.write('\t{"%s", NULL, 0},\n' % (mod,))\r
- outfp.write(trailer)\r
- outfp.write(entry_point)\r
- outfp.close()\r
- return files\r
-\r
-\r
-\r
-# Write a C initializer for a module containing the frozen python code.\r
-# The array is called M_<mod>.\r
-\r
-def writecode(outfp, mod, str):\r
- outfp.write('unsigned char M_%s[] = {' % mod)\r
- for i in range(0, len(str), 16):\r
- outfp.write('\n\t')\r
- for c in str[i:i+16]:\r
- outfp.write('%d,' % ord(c))\r
- outfp.write('\n};\n')\r
-\r
-## def writecode(outfp, mod, str):\r
-## outfp.write('unsigned char M_%s[%d] = "%s";\n' % (mod, len(str),\r
-## '\\"'.join(map(lambda s: repr(s)[1:-1], str.split('"')))))\r