| 
									
										
										
										
											2010-03-11 22:53:45 +00:00
										 |  |  | #! /usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											1994-10-03 10:25:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-26 05:14:20 +00:00
										 |  |  | """Freeze a Python script into a binary.
 | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-05 04:05:38 +00:00
										 |  |  | usage: freeze [options...] script [module]... | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-26 05:14:20 +00:00
										 |  |  | Options: | 
					
						
							| 
									
										
										
										
											1997-08-10 16:47:17 +00:00
										 |  |  | -p prefix:    This is the prefix used when you ran ``make install'' | 
					
						
							| 
									
										
										
										
											1996-08-26 05:14:20 +00:00
										 |  |  |               in the Python build directory. | 
					
						
							| 
									
										
										
										
											1994-10-05 16:13:01 +00:00
										 |  |  |               (If you never ran this, freeze won't work.) | 
					
						
							| 
									
										
										
										
											1996-08-26 05:14:20 +00:00
										 |  |  |               The default is whatever sys.prefix evaluates to. | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |               It can also be the top directory of the Python source | 
					
						
							|  |  |  |               tree; then -P must point to the build tree. | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-08-08 14:21:07 +00:00
										 |  |  | -P exec_prefix: Like -p but this is the 'exec_prefix', used to | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |                 install objects etc.  The default is whatever sys.exec_prefix | 
					
						
							|  |  |  |                 evaluates to, or the -p argument if given. | 
					
						
							|  |  |  |                 If -p points to the Python source tree, -P must point | 
					
						
							|  |  |  |                 to the build tree, if different. | 
					
						
							| 
									
										
										
										
											1995-08-08 14:21:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-10-05 16:13:01 +00:00
										 |  |  | -e extension: A directory containing additional .o files that | 
					
						
							|  |  |  |               may be used to resolve modules.  This directory | 
					
						
							|  |  |  |               should also have a Setup file describing the .o files. | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |               On Windows, the name of a .INI file describing one | 
					
						
							|  |  |  |               or more extensions is passed. | 
					
						
							| 
									
										
										
										
											1994-10-05 16:13:01 +00:00
										 |  |  |               More than one -e option may be given. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-26 05:14:20 +00:00
										 |  |  | -o dir:       Directory where the output files are created; default '.'. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  | -m:           Additional arguments are module names instead of filenames. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  | -a package=dir: Additional directories to be added to the package's | 
					
						
							|  |  |  |                 __path__.  Used to simulate directories added by the | 
					
						
							|  |  |  |                 package at runtime (eg, by OpenGL and win32com). | 
					
						
							|  |  |  |                 More than one -a option may be given for each package. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  | -l file:      Pass the file to the linker (windows only) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  | -d:           Debugging mode for the module finder. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -q:           Make the module finder totally quiet. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-08-10 16:47:17 +00:00
										 |  |  | -h:           Print this help message. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  | -x module     Exclude the specified module. It will still be imported | 
					
						
							|  |  |  |               by the frozen binary if it exists on the host system. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -X module     Like -x, except the module can never be imported by | 
					
						
							|  |  |  |               the frozen binary. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -E:           Freeze will fail if any modules can't be found (that | 
					
						
							|  |  |  |               were not excluded using -x or -X). | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  | -i filename:  Include a file with additional command line options.  Used | 
					
						
							|  |  |  |               to prevent command lines growing beyond the capabilities of | 
					
						
							|  |  |  |               the shell/OS.  All arguments specified in filename | 
					
						
							|  |  |  |               are read and the -i option replaced with the parsed | 
					
						
							|  |  |  |               params (note - quoting args in this file is NOT supported) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | -s subsystem: Specify the subsystem (For Windows only.); | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |               'console' (default), 'windows', 'service' or 'com_dll' | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  | -w:           Toggle Windows (NT or 95) behavior. | 
					
						
							| 
									
										
										
										
											2000-07-16 12:04:32 +00:00
										 |  |  |               (For debugging only -- on a win32 platform, win32 behavior | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |               is automatic.) | 
					
						
							| 
									
										
										
										
											1997-08-14 01:45:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-03-20 20:43:34 +00:00
										 |  |  | -r prefix=f:  Replace path prefix. | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |               Replace prefix with f in the source path references | 
					
						
							| 
									
										
										
										
											2001-03-20 20:43:34 +00:00
										 |  |  |               contained in the resulting binary. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-26 05:14:20 +00:00
										 |  |  | Arguments: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-05 04:05:38 +00:00
										 |  |  | script:       The Python script to be executed by the resulting binary. | 
					
						
							| 
									
										
										
										
											1994-10-05 16:13:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | module ...:   Additional Python modules (referenced by pathname) | 
					
						
							|  |  |  |               that will be included in the resulting binary.  These | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |               may be .py or .pyc files.  If -m is specified, these are | 
					
						
							|  |  |  |               module names that are search in the path instead. | 
					
						
							| 
									
										
										
										
											1995-08-08 14:21:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | NOTES: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In order to use freeze successfully, you must have built Python and | 
					
						
							| 
									
										
										
										
											1996-06-17 17:49:13 +00:00
										 |  |  | installed it ("make install"). | 
					
						
							| 
									
										
										
										
											1995-08-08 14:21:07 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-08-26 05:14:20 +00:00
										 |  |  | The script should not use modules provided only as shared libraries; | 
					
						
							|  |  |  | if it does, the resulting binary is not self-contained. | 
					
						
							| 
									
										
										
										
											1994-10-05 16:13:01 +00:00
										 |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | # Import standard modules | 
					
						
							| 
									
										
										
										
											1994-10-03 10:25:54 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-05-26 23:52:30 +00:00
										 |  |  | import modulefinder | 
					
						
							| 
									
										
										
										
											1994-10-03 10:25:54 +00:00
										 |  |  | import getopt | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Import the freeze-private modules | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-10-05 16:13:01 +00:00
										 |  |  | import checkextensions | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | import makeconfig | 
					
						
							|  |  |  | import makefreeze | 
					
						
							|  |  |  | import makemakefile | 
					
						
							|  |  |  | import parsesetup | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  | import bkfile | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Main program | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-10-03 10:25:54 +00:00
										 |  |  | def main(): | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     # overridable context | 
					
						
							|  |  |  |     prefix = None                       # settable with -p option | 
					
						
							|  |  |  |     exec_prefix = None                  # settable with -P option | 
					
						
							|  |  |  |     extensions = [] | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |     exclude = []                        # settable with -x option | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  |     addn_link = []      # settable with -l, but only honored under Windows. | 
					
						
							| 
									
										
										
										
											1998-03-05 04:05:38 +00:00
										 |  |  |     path = sys.path[:] | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |     modargs = 0 | 
					
						
							|  |  |  |     debug = 1 | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     odir = '' | 
					
						
							| 
									
										
										
										
											1997-08-14 01:45:33 +00:00
										 |  |  |     win = sys.platform[:3] == 'win' | 
					
						
							| 
									
										
										
										
											2001-03-20 20:43:34 +00:00
										 |  |  |     replace_paths = []                  # settable with -r option | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  |     error_if_any_missing = 0 | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |     # default the exclude list for each platform | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |     if win: exclude = exclude + [ | 
					
						
							| 
									
										
										
										
											2016-09-05 15:11:23 -07:00
										 |  |  |         'dos', 'dospath', 'mac', 'macpath', 'macfs', 'MACFS', 'posix', ] | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     fail_import = exclude[:] | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     # output files | 
					
						
							|  |  |  |     frozen_c = 'frozen.c' | 
					
						
							|  |  |  |     config_c = 'config.c' | 
					
						
							|  |  |  |     target = 'a.out'                    # normally derived from script name | 
					
						
							|  |  |  |     makefile = 'Makefile' | 
					
						
							| 
									
										
										
										
											1997-08-14 01:45:33 +00:00
										 |  |  |     subsystem = 'console' | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  |     # parse command line by first replacing any "-i" options with the | 
					
						
							|  |  |  |     # file contents. | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |     pos = 1 | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  |     while pos < len(sys.argv)-1: | 
					
						
							|  |  |  |         # last option can not be "-i", so this ensures "pos+1" is in range! | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |         if sys.argv[pos] == '-i': | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2002-09-11 20:36:02 +00:00
										 |  |  |                 options = open(sys.argv[pos+1]).read().split() | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |             except IOError as why: | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  |                 usage("File name '%s' specified with the -i option " | 
					
						
							|  |  |  |                       "can not be read - %s" % (sys.argv[pos+1], why) ) | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |             # Replace the '-i' and the filename with the read params. | 
					
						
							|  |  |  |             sys.argv[pos:pos+2] = options | 
					
						
							|  |  |  |             pos = pos + len(options) - 1 # Skip the name and the included args. | 
					
						
							|  |  |  |         pos = pos + 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Now parse the command line with the extras inserted. | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  |         opts, args = getopt.getopt(sys.argv[1:], 'r:a:dEe:hmo:p:P:qs:wX:x:l:') | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |     except getopt.error as msg: | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         usage('getopt error: ' + str(msg)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-28 01:11:04 +00:00
										 |  |  |     # process option arguments | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     for o, a in opts: | 
					
						
							|  |  |  |         if o == '-h': | 
					
						
							| 
									
										
										
										
											2007-02-09 23:27:01 +00:00
										 |  |  |             print(__doc__) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |             return | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |         if o == '-d': | 
					
						
							|  |  |  |             debug = debug + 1 | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         if o == '-e': | 
					
						
							|  |  |  |             extensions.append(a) | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |         if o == '-m': | 
					
						
							|  |  |  |             modargs = 1 | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         if o == '-o': | 
					
						
							|  |  |  |             odir = a | 
					
						
							|  |  |  |         if o == '-p': | 
					
						
							|  |  |  |             prefix = a | 
					
						
							|  |  |  |         if o == '-P': | 
					
						
							|  |  |  |             exec_prefix = a | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |         if o == '-q': | 
					
						
							|  |  |  |             debug = 0 | 
					
						
							| 
									
										
										
										
											1997-08-14 01:45:33 +00:00
										 |  |  |         if o == '-w': | 
					
						
							|  |  |  |             win = not win | 
					
						
							|  |  |  |         if o == '-s': | 
					
						
							|  |  |  |             if not win: | 
					
						
							|  |  |  |                 usage("-s subsystem option only on Windows") | 
					
						
							|  |  |  |             subsystem = a | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |         if o == '-x': | 
					
						
							|  |  |  |             exclude.append(a) | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  |         if o == '-X': | 
					
						
							|  |  |  |             exclude.append(a) | 
					
						
							|  |  |  |             fail_import.append(a) | 
					
						
							|  |  |  |         if o == '-E': | 
					
						
							|  |  |  |             error_if_any_missing = 1 | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |         if o == '-l': | 
					
						
							|  |  |  |             addn_link.append(a) | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  |         if o == '-a': | 
					
						
							| 
									
										
										
										
											2006-03-17 08:00:19 +00:00
										 |  |  |             modulefinder.AddPackagePath(*a.split("=", 2)) | 
					
						
							| 
									
										
										
										
											2001-03-20 20:43:34 +00:00
										 |  |  |         if o == '-r': | 
					
						
							| 
									
										
										
										
											2002-09-11 20:36:02 +00:00
										 |  |  |             f,r = a.split("=", 2) | 
					
						
							| 
									
										
										
										
											2001-03-20 20:43:34 +00:00
										 |  |  |             replace_paths.append( (f,r) ) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-03-08 19:50:38 +00:00
										 |  |  |     # modules that are imported by the Python runtime | 
					
						
							|  |  |  |     implicits = [] | 
					
						
							| 
									
										
										
										
											2010-08-02 22:25:16 +00:00
										 |  |  |     for module in ('site', 'warnings', 'encodings.utf_8', 'encodings.latin_1'): | 
					
						
							| 
									
										
										
										
											2003-03-08 19:50:38 +00:00
										 |  |  |         if module not in exclude: | 
					
						
							|  |  |  |             implicits.append(module) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     # default prefix and exec_prefix | 
					
						
							|  |  |  |     if not exec_prefix: | 
					
						
							|  |  |  |         if prefix: | 
					
						
							|  |  |  |             exec_prefix = prefix | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             exec_prefix = sys.exec_prefix | 
					
						
							|  |  |  |     if not prefix: | 
					
						
							|  |  |  |         prefix = sys.prefix | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # determine whether -p points to the Python source tree | 
					
						
							| 
									
										
										
										
											1998-03-05 05:39:50 +00:00
										 |  |  |     ishome = os.path.exists(os.path.join(prefix, 'Python', 'ceval.c')) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # locations derived from options | 
					
						
							| 
									
										
										
										
											2016-02-11 13:10:36 +02:00
										 |  |  |     version = '%d.%d' % sys.version_info[:2] | 
					
						
							| 
									
										
										
										
											2014-03-30 20:28:52 +02:00
										 |  |  |     flagged_version = version + sys.abiflags | 
					
						
							| 
									
										
										
										
											1998-07-07 22:47:38 +00:00
										 |  |  |     if win: | 
					
						
							|  |  |  |         extensions_c = 'frozen_extensions.c' | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     if ishome: | 
					
						
							| 
									
										
										
										
											2007-02-09 23:27:01 +00:00
										 |  |  |         print("(Using Python source directory)") | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         binlib = exec_prefix | 
					
						
							|  |  |  |         incldir = os.path.join(prefix, 'Include') | 
					
						
							| 
									
										
										
										
											1998-06-12 14:09:03 +00:00
										 |  |  |         config_h_dir = exec_prefix | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         config_c_in = os.path.join(prefix, 'Modules', 'config.c.in') | 
					
						
							| 
									
										
										
										
											1997-08-14 01:45:33 +00:00
										 |  |  |         frozenmain_c = os.path.join(prefix, 'Python', 'frozenmain.c') | 
					
						
							| 
									
										
										
										
											2004-05-08 17:59:43 +00:00
										 |  |  |         makefile_in = os.path.join(exec_prefix, 'Makefile') | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  |         if win: | 
					
						
							|  |  |  |             frozendllmain_c = os.path.join(exec_prefix, 'Pc\\frozen_dllmain.c') | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     else: | 
					
						
							|  |  |  |         binlib = os.path.join(exec_prefix, | 
					
						
							| 
									
										
										
										
											2014-03-30 20:28:52 +02:00
										 |  |  |                               'lib', 'python%s' % version, | 
					
						
							|  |  |  |                               'config-%s' % flagged_version) | 
					
						
							|  |  |  |         incldir = os.path.join(prefix, 'include', 'python%s' % flagged_version) | 
					
						
							| 
									
										
										
										
											1998-06-12 14:09:03 +00:00
										 |  |  |         config_h_dir = os.path.join(exec_prefix, 'include', | 
					
						
							| 
									
										
										
										
											2014-03-30 20:28:52 +02:00
										 |  |  |                                     'python%s' % flagged_version) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         config_c_in = os.path.join(binlib, 'config.c.in') | 
					
						
							|  |  |  |         frozenmain_c = os.path.join(binlib, 'frozenmain.c') | 
					
						
							|  |  |  |         makefile_in = os.path.join(binlib, 'Makefile') | 
					
						
							| 
									
										
										
										
											1998-07-07 22:47:38 +00:00
										 |  |  |         frozendllmain_c = os.path.join(binlib, 'frozen_dllmain.c') | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     supp_sources = [] | 
					
						
							|  |  |  |     defines = [] | 
					
						
							| 
									
										
										
										
											1998-06-12 14:09:03 +00:00
										 |  |  |     includes = ['-I' + incldir, '-I' + config_h_dir] | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # sanity check of directories and files | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |     check_dirs = [prefix, exec_prefix, binlib, incldir] | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  |     if not win: | 
					
						
							|  |  |  |         # These are not directories on Windows. | 
					
						
							|  |  |  |         check_dirs = check_dirs + extensions | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |     for dir in check_dirs: | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         if not os.path.exists(dir): | 
					
						
							|  |  |  |             usage('needed directory %s not found' % dir) | 
					
						
							|  |  |  |         if not os.path.isdir(dir): | 
					
						
							|  |  |  |             usage('%s: not a directory' % dir) | 
					
						
							| 
									
										
										
										
											1997-08-14 01:45:33 +00:00
										 |  |  |     if win: | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |         files = supp_sources + extensions # extensions are files on Windows. | 
					
						
							| 
									
										
										
										
											1997-08-14 01:45:33 +00:00
										 |  |  |     else: | 
					
						
							|  |  |  |         files = [config_c_in, makefile_in] + supp_sources | 
					
						
							|  |  |  |     for file in supp_sources: | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         if not os.path.exists(file): | 
					
						
							|  |  |  |             usage('needed file %s not found' % file) | 
					
						
							|  |  |  |         if not os.path.isfile(file): | 
					
						
							|  |  |  |             usage('%s: not a plain file' % file) | 
					
						
							| 
									
										
										
										
											1997-08-14 01:45:33 +00:00
										 |  |  |     if not win: | 
					
						
							|  |  |  |         for dir in extensions: | 
					
						
							|  |  |  |             setup = os.path.join(dir, 'Setup') | 
					
						
							|  |  |  |             if not os.path.exists(setup): | 
					
						
							|  |  |  |                 usage('needed file %s not found' % setup) | 
					
						
							|  |  |  |             if not os.path.isfile(setup): | 
					
						
							|  |  |  |                 usage('%s: not a plain file' % setup) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # check that enough arguments are passed | 
					
						
							|  |  |  |     if not args: | 
					
						
							|  |  |  |         usage('at least one filename argument required') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # check that file arguments exist | 
					
						
							|  |  |  |     for arg in args: | 
					
						
							| 
									
										
										
										
											1998-03-05 04:05:38 +00:00
										 |  |  |         if arg == '-m': | 
					
						
							|  |  |  |             break | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |         # if user specified -m on the command line before _any_ | 
					
						
							|  |  |  |         # file names, then nothing should be checked (as the | 
					
						
							|  |  |  |         # very first file should be a module name) | 
					
						
							|  |  |  |         if modargs: | 
					
						
							|  |  |  |             break | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         if not os.path.exists(arg): | 
					
						
							|  |  |  |             usage('argument %s not found' % arg) | 
					
						
							|  |  |  |         if not os.path.isfile(arg): | 
					
						
							|  |  |  |             usage('%s: not a plain file' % arg) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # process non-option arguments | 
					
						
							|  |  |  |     scriptfile = args[0] | 
					
						
							|  |  |  |     modules = args[1:] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # derive target name from script name | 
					
						
							|  |  |  |     base = os.path.basename(scriptfile) | 
					
						
							|  |  |  |     base, ext = os.path.splitext(base) | 
					
						
							|  |  |  |     if base: | 
					
						
							|  |  |  |         if base != scriptfile: | 
					
						
							|  |  |  |             target = base | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             target = base + '.bin' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # handle -o option | 
					
						
							|  |  |  |     base_frozen_c = frozen_c | 
					
						
							|  |  |  |     base_config_c = config_c | 
					
						
							|  |  |  |     base_target = target | 
					
						
							|  |  |  |     if odir and not os.path.isdir(odir): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             os.mkdir(odir) | 
					
						
							| 
									
										
										
										
											2007-02-09 23:27:01 +00:00
										 |  |  |             print("Created output directory", odir) | 
					
						
							| 
									
										
										
										
											2012-12-24 19:58:48 +02:00
										 |  |  |         except OSError as msg: | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |             usage('%s: mkdir failed (%s)' % (odir, str(msg))) | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |     base = '' | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     if odir: | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |         base = os.path.join(odir, '') | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         frozen_c = os.path.join(odir, frozen_c) | 
					
						
							|  |  |  |         config_c = os.path.join(odir, config_c) | 
					
						
							|  |  |  |         target = os.path.join(odir, target) | 
					
						
							|  |  |  |         makefile = os.path.join(odir, makefile) | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  |         if win: extensions_c = os.path.join(odir, extensions_c) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |     # Handle special entry point requirements | 
					
						
							|  |  |  |     # (on Windows, some frozen programs do not use __main__, but | 
					
						
							|  |  |  |     # import the module directly.  Eg, DLLs, Services, etc | 
					
						
							|  |  |  |     custom_entry_point = None  # Currently only used on Windows | 
					
						
							|  |  |  |     python_entry_is_main = 1   # Is the entry point called __main__? | 
					
						
							|  |  |  |     # handle -s option on Windows | 
					
						
							|  |  |  |     if win: | 
					
						
							|  |  |  |         import winmakemakefile | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  |             custom_entry_point, python_entry_is_main = \ | 
					
						
							|  |  |  |                 winmakemakefile.get_custom_entry_point(subsystem) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |         except ValueError as why: | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |             usage(why) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     # Actual work starts here... | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |     # collect all modules of the program | 
					
						
							| 
									
										
										
										
											1998-03-05 04:05:38 +00:00
										 |  |  |     dir = os.path.dirname(scriptfile) | 
					
						
							|  |  |  |     path[0] = dir | 
					
						
							| 
									
										
										
										
											2001-03-20 20:43:34 +00:00
										 |  |  |     mf = modulefinder.ModuleFinder(path, debug, exclude, replace_paths) | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |     if win and subsystem=='service': | 
					
						
							|  |  |  |         # If a Windows service, then add the "built-in" module. | 
					
						
							|  |  |  |         mod = mf.add_module("servicemanager") | 
					
						
							|  |  |  |         mod.__file__="dummy.pyd" # really built-in to the resulting EXE | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |     for mod in implicits: | 
					
						
							|  |  |  |         mf.import_hook(mod) | 
					
						
							|  |  |  |     for mod in modules: | 
					
						
							|  |  |  |         if mod == '-m': | 
					
						
							|  |  |  |             modargs = 1 | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         if modargs: | 
					
						
							|  |  |  |             if mod[-2:] == '.*': | 
					
						
							|  |  |  |                 mf.import_hook(mod[:-2], None, ["*"]) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 mf.import_hook(mod) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             mf.load_file(mod) | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-30 21:07:25 +02:00
										 |  |  |     # Alias "importlib._bootstrap" to "_frozen_importlib" so that the | 
					
						
							| 
									
										
										
										
											2015-05-02 19:15:18 -06:00
										 |  |  |     # import machinery can bootstrap.  Do the same for | 
					
						
							|  |  |  |     # importlib._bootstrap_external. | 
					
						
							| 
									
										
										
										
											2014-03-30 21:07:25 +02:00
										 |  |  |     mf.modules["_frozen_importlib"] = mf.modules["importlib._bootstrap"] | 
					
						
							| 
									
										
										
										
											2015-05-02 19:15:18 -06:00
										 |  |  |     mf.modules["_frozen_importlib_external"] = mf.modules["importlib._bootstrap_external"] | 
					
						
							| 
									
										
										
										
											2014-03-30 21:07:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |     # Add the main script as either __main__, or the actual module name. | 
					
						
							|  |  |  |     if python_entry_is_main: | 
					
						
							|  |  |  |         mf.run_script(scriptfile) | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2000-05-06 03:18:08 +00:00
										 |  |  |         mf.load_file(scriptfile) | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |     if debug > 0: | 
					
						
							|  |  |  |         mf.report() | 
					
						
							| 
									
										
										
										
											2007-02-09 23:27:01 +00:00
										 |  |  |         print() | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |     dict = mf.modules | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  |     if error_if_any_missing: | 
					
						
							|  |  |  |         missing = mf.any_missing() | 
					
						
							|  |  |  |         if missing: | 
					
						
							|  |  |  |             sys.exit("There are some missing modules: %r" % missing) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |     # generate output for frozen modules | 
					
						
							| 
									
										
										
										
											2001-10-18 19:15:32 +00:00
										 |  |  |     files = makefreeze.makefreeze(base, dict, debug, custom_entry_point, | 
					
						
							|  |  |  |                                   fail_import) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-07 04:51:03 +00:00
										 |  |  |     # look for unfrozen modules (builtin and of unknown origin) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     builtins = [] | 
					
						
							|  |  |  |     unknown = [] | 
					
						
							| 
									
										
										
										
											2007-06-12 00:28:30 +00:00
										 |  |  |     mods = sorted(dict.keys()) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     for mod in mods: | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |         if dict[mod].__code__: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         if not dict[mod].__file__: | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |             builtins.append(mod) | 
					
						
							| 
									
										
										
										
											1998-03-05 03:42:00 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |             unknown.append(mod) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-07 04:51:03 +00:00
										 |  |  |     # search for unknown modules in extensions directories (not on Windows) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     addfiles = [] | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  |     frozen_extensions = [] # Windows list of modules. | 
					
						
							| 
									
										
										
										
											1998-04-23 14:39:24 +00:00
										 |  |  |     if unknown or (not win and builtins): | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |         if not win: | 
					
						
							|  |  |  |             addfiles, addmods = \ | 
					
						
							| 
									
										
										
										
											1998-04-23 14:39:24 +00:00
										 |  |  |                       checkextensions.checkextensions(unknown+builtins, | 
					
						
							|  |  |  |                                                       extensions) | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |             for mod in addmods: | 
					
						
							| 
									
										
										
										
											1998-04-23 14:39:24 +00:00
										 |  |  |                 if mod in unknown: | 
					
						
							|  |  |  |                     unknown.remove(mod) | 
					
						
							|  |  |  |                     builtins.append(mod) | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             # Do the windows thang... | 
					
						
							|  |  |  |             import checkextensions_win32 | 
					
						
							| 
									
										
										
										
											2004-07-18 06:16:08 +00:00
										 |  |  |             # Get a list of CExtension instances, each describing a module | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |             # (including its source files) | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  |             frozen_extensions = checkextensions_win32.checkextensions( | 
					
						
							| 
									
										
										
										
											2000-07-13 15:45:17 +00:00
										 |  |  |                 unknown, extensions, prefix) | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  |             for mod in frozen_extensions: | 
					
						
							| 
									
										
										
										
											1998-03-20 17:37:24 +00:00
										 |  |  |                 unknown.remove(mod.name) | 
					
						
							| 
									
										
										
										
											1998-03-07 04:51:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # report unknown modules | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     if unknown: | 
					
						
							|  |  |  |         sys.stderr.write('Warning: unknown modules remain: %s\n' % | 
					
						
							| 
									
										
										
										
											2002-09-11 20:36:02 +00:00
										 |  |  |                          ' '.join(unknown)) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-03-07 04:51:03 +00:00
										 |  |  |     # windows gets different treatment | 
					
						
							|  |  |  |     if win: | 
					
						
							|  |  |  |         # Taking a shortcut here... | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  |         import winmakemakefile, checkextensions_win32 | 
					
						
							|  |  |  |         checkextensions_win32.write_extension_table(extensions_c, | 
					
						
							|  |  |  |                                                     frozen_extensions) | 
					
						
							|  |  |  |         # Create a module definition for the bootstrap C code. | 
					
						
							|  |  |  |         xtras = [frozenmain_c, os.path.basename(frozen_c), | 
					
						
							| 
									
										
										
										
											1999-03-12 22:07:05 +00:00
										 |  |  |                  frozendllmain_c, os.path.basename(extensions_c)] + files | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  |         maindefn = checkextensions_win32.CExtension( '__main__', xtras ) | 
					
						
							|  |  |  |         frozen_extensions.append( maindefn ) | 
					
						
							| 
									
										
										
										
											2015-03-20 09:21:59 +02:00
										 |  |  |         with open(makefile, 'w') as outfp: | 
					
						
							| 
									
										
										
										
											1998-03-07 04:51:03 +00:00
										 |  |  |             winmakemakefile.makemakefile(outfp, | 
					
						
							|  |  |  |                                          locals(), | 
					
						
							| 
									
										
										
										
											1998-05-18 20:25:54 +00:00
										 |  |  |                                          frozen_extensions, | 
					
						
							| 
									
										
										
										
											1998-03-07 04:51:03 +00:00
										 |  |  |                                          os.path.basename(target)) | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # generate config.c and Makefile | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     builtins.sort() | 
					
						
							| 
									
										
										
										
											2015-03-20 09:21:59 +02:00
										 |  |  |     with open(config_c_in) as infp, bkfile.open(config_c, 'w') as outfp: | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         makeconfig.makeconfig(infp, outfp, builtins) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-06-02 06:16:02 +00:00
										 |  |  |     cflags = ['$(OPT)'] | 
					
						
							|  |  |  |     cppflags = defines + includes | 
					
						
							| 
									
										
										
										
											2014-03-30 20:28:52 +02:00
										 |  |  |     libs = [os.path.join(binlib, '$(LDLIBRARY)')] | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     somevars = {} | 
					
						
							| 
									
										
										
										
											1997-11-22 22:10:01 +00:00
										 |  |  |     if os.path.exists(makefile_in): | 
					
						
							|  |  |  |         makevars = parsesetup.getmakevars(makefile_in) | 
					
						
							| 
									
										
										
										
											2008-05-16 17:02:34 +00:00
										 |  |  |         for key in makevars: | 
					
						
							| 
									
										
										
										
											2004-05-08 17:59:43 +00:00
										 |  |  |             somevars[key] = makevars[key] | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-09-11 20:36:02 +00:00
										 |  |  |     somevars['CFLAGS'] = ' '.join(cflags) # override | 
					
						
							|  |  |  |     somevars['CPPFLAGS'] = ' '.join(cppflags) # override | 
					
						
							| 
									
										
										
										
											2002-04-04 16:15:41 +00:00
										 |  |  |     files = [base_config_c, base_frozen_c] + \ | 
					
						
							| 
									
										
										
										
											1998-08-25 14:06:55 +00:00
										 |  |  |             files + supp_sources +  addfiles + libs + \ | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |             ['$(MODLIBS)', '$(LIBS)', '$(SYSLIBS)'] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-20 09:21:59 +02:00
										 |  |  |     with bkfile.open(makefile, 'w') as outfp: | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |         makemakefile.makemakefile(outfp, somevars, files, base_target) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Done! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if odir: | 
					
						
							| 
									
										
										
										
											2007-02-09 23:27:01 +00:00
										 |  |  |         print('Now run "make" in', odir, end=' ') | 
					
						
							|  |  |  |         print('to build the target:', base_target) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2007-02-09 23:27:01 +00:00
										 |  |  |         print('Now run "make" to build the target:', base_target) | 
					
						
							| 
									
										
										
										
											1994-10-03 16:33:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-10-05 16:13:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Print usage message and exit | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-08-10 16:47:17 +00:00
										 |  |  | def usage(msg): | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     sys.stdout = sys.stderr | 
					
						
							| 
									
										
										
										
											2007-02-09 23:27:01 +00:00
										 |  |  |     print("Error:", msg) | 
					
						
							|  |  |  |     print("Use ``%s -h'' for help" % sys.argv[0]) | 
					
						
							| 
									
										
										
										
											1997-08-10 16:56:48 +00:00
										 |  |  |     sys.exit(2) | 
					
						
							| 
									
										
										
										
											1994-10-05 16:13:01 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-10-03 10:25:54 +00:00
										 |  |  | main() |