| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | import marshal | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  | import bkfile | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Write a file containing frozen code for the modules in the dictionary. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | header = """
 | 
					
						
							| 
									
										
										
										
											1996-06-17 17:48:30 +00:00
										 |  |  | #include "Python.h" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static struct _frozen _PyImport_FrozenModules[] = { | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | """
 | 
					
						
							|  |  |  | trailer = """\
 | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |     {0, 0, 0} /* sentinel */ | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  | """
 | 
					
						
							| 
									
										
										
										
											1996-06-17 17:48:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-04-23 14:39:05 +00:00
										 |  |  | # if __debug__ == 0 (i.e. -O option given), set Py_OptimizeFlag in frozen app. | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  | default_entry_point = """
 | 
					
						
							| 
									
										
										
										
											1997-07-19 21:58:30 +00:00
										 |  |  | int | 
					
						
							| 
									
										
										
										
											2002-04-04 16:15:41 +00:00
										 |  |  | main(int argc, char **argv) | 
					
						
							| 
									
										
										
										
											1997-07-19 21:58:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |         extern int Py_FrozenMain(int, char **); | 
					
						
							| 
									
										
										
										
											1998-04-23 14:39:05 +00:00
										 |  |  | """ + ((not __debug__ and """ | 
					
						
							|  |  |  |         Py_OptimizeFlag++; | 
					
						
							|  |  |  | """) or "")  + """ | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |         PyImport_FrozenModules = _PyImport_FrozenModules; | 
					
						
							|  |  |  |         return Py_FrozenMain(argc, argv); | 
					
						
							| 
									
										
										
										
											1997-07-19 21:58:30 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  | def makefreeze(base, dict, debug=0, entry_point=None, fail_import=()): | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |     if entry_point is None: entry_point = default_entry_point | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |     done = [] | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |     files = [] | 
					
						
							| 
									
										
										
										
											2007-06-12 00:28:30 +00:00
										 |  |  |     mods = sorted(dict.keys()) | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |     for mod in mods: | 
					
						
							|  |  |  |         m = dict[mod] | 
					
						
							| 
									
										
										
										
											2002-09-11 20:36:02 +00:00
										 |  |  |         mangled = "__".join(mod.split(".")) | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |         if m.__code__: | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |             file = 'M_' + mangled + '.c' | 
					
						
							|  |  |  |             outfp = bkfile.open(base + file, 'w') | 
					
						
							|  |  |  |             files.append(file) | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |             if debug: | 
					
						
							| 
									
										
										
										
											2007-02-09 23:27:01 +00:00
										 |  |  |                 print("freezing", mod, "...") | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |             str = marshal.dumps(m.__code__) | 
					
						
							|  |  |  |             size = len(str) | 
					
						
							|  |  |  |             if m.__path__: | 
					
						
							|  |  |  |                 # Indicate package by negative size | 
					
						
							|  |  |  |                 size = -size | 
					
						
							|  |  |  |             done.append((mod, mangled, size)) | 
					
						
							|  |  |  |             writecode(outfp, mangled, str) | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |             outfp.close() | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |     if debug: | 
					
						
							| 
									
										
										
										
											2007-02-09 23:27:01 +00:00
										 |  |  |         print("generating table of frozen modules") | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |     outfp = bkfile.open(base + 'frozen.c', 'w') | 
					
						
							|  |  |  |     for mod, mangled, size in done: | 
					
						
							|  |  |  |         outfp.write('extern unsigned char M_%s[];\n' % mangled) | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |     outfp.write(header) | 
					
						
							|  |  |  |     for mod, mangled, size in done: | 
					
						
							|  |  |  |         outfp.write('\t{"%s", M_%s, %d},\n' % (mod, mangled, size)) | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  |     outfp.write('\n') | 
					
						
							|  |  |  |     # The following modules have a NULL code pointer, indicating | 
					
						
							| 
									
										
										
										
											2013-08-26 01:32:56 +03:00
										 |  |  |     # that the frozen program should not search for them on the host | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  |     # system. Importing them will *always* raise an ImportError. | 
					
						
							|  |  |  |     # The zero value size is never used. | 
					
						
							|  |  |  |     for mod in fail_import: | 
					
						
							|  |  |  |         outfp.write('\t{"%s", NULL, 0},\n' % (mod,)) | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |     outfp.write(trailer) | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |     outfp.write(entry_point) | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |     outfp.close() | 
					
						
							|  |  |  |     return files | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Write a C initializer for a module containing the frozen python code. | 
					
						
							|  |  |  | # The array is called M_<mod>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def writecode(outfp, mod, str): | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |     outfp.write('unsigned char M_%s[] = {' % mod) | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |     for i in range(0, len(str), 16): | 
					
						
							|  |  |  |         outfp.write('\n\t') | 
					
						
							| 
									
										
										
										
											2007-06-12 00:28:30 +00:00
										 |  |  |         for c in bytes(str[i:i+16]): | 
					
						
							|  |  |  |             outfp.write('%d,' % c) | 
					
						
							| 
									
										
										
										
											1998-03-05 04:56:37 +00:00
										 |  |  |     outfp.write('\n};\n') | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## def writecode(outfp, mod, str): | 
					
						
							|  |  |  | ##     outfp.write('unsigned char M_%s[%d] = "%s";\n' % (mod, len(str), | 
					
						
							| 
									
										
										
										
											2004-02-12 17:35:32 +00:00
										 |  |  | ##     '\\"'.join(map(lambda s: repr(s)[1:-1], str.split('"'))))) |