| Benjamin Peterson | 90f5ba5 | 2010-03-11 22:53:45 +0000 | [diff] [blame] | 1 | #! /usr/bin/env python3 | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 2 |  | 
| Guido van Rossum | 96c4dd9 | 1996-08-26 05:14:20 +0000 | [diff] [blame] | 3 | """Freeze a Python script into a binary. | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 4 |  | 
| Guido van Rossum | 1e07403 | 1998-03-05 04:05:38 +0000 | [diff] [blame] | 5 | usage: freeze [options...] script [module]... | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 6 |  | 
| Guido van Rossum | 96c4dd9 | 1996-08-26 05:14:20 +0000 | [diff] [blame] | 7 | Options: | 
| Guido van Rossum | 9a6e855 | 1997-08-10 16:47:17 +0000 | [diff] [blame] | 8 | -p prefix:    This is the prefix used when you ran ``make install'' | 
| Guido van Rossum | 96c4dd9 | 1996-08-26 05:14:20 +0000 | [diff] [blame] | 9 |               in the Python build directory. | 
| Guido van Rossum | d8336c2 | 1994-10-05 16:13:01 +0000 | [diff] [blame] | 10 |               (If you never ran this, freeze won't work.) | 
| Guido van Rossum | 96c4dd9 | 1996-08-26 05:14:20 +0000 | [diff] [blame] | 11 |               The default is whatever sys.prefix evaluates to. | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 12 |               It can also be the top directory of the Python source | 
 | 13 |               tree; then -P must point to the build tree. | 
| Guido van Rossum | d8336c2 | 1994-10-05 16:13:01 +0000 | [diff] [blame] | 14 |  | 
| Guido van Rossum | 150316e | 1995-08-08 14:21:07 +0000 | [diff] [blame] | 15 | -P exec_prefix: Like -p but this is the 'exec_prefix', used to | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 16 |                 install objects etc.  The default is whatever sys.exec_prefix | 
 | 17 |                 evaluates to, or the -p argument if given. | 
 | 18 |                 If -p points to the Python source tree, -P must point | 
 | 19 |                 to the build tree, if different. | 
| Guido van Rossum | 150316e | 1995-08-08 14:21:07 +0000 | [diff] [blame] | 20 |  | 
| Guido van Rossum | d8336c2 | 1994-10-05 16:13:01 +0000 | [diff] [blame] | 21 | -e extension: A directory containing additional .o files that | 
 | 22 |               may be used to resolve modules.  This directory | 
 | 23 |               should also have a Setup file describing the .o files. | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 24 |               On Windows, the name of a .INI file describing one | 
 | 25 |               or more extensions is passed. | 
| Guido van Rossum | d8336c2 | 1994-10-05 16:13:01 +0000 | [diff] [blame] | 26 |               More than one -e option may be given. | 
 | 27 |  | 
| Guido van Rossum | 96c4dd9 | 1996-08-26 05:14:20 +0000 | [diff] [blame] | 28 | -o dir:       Directory where the output files are created; default '.'. | 
 | 29 |  | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 30 | -m:           Additional arguments are module names instead of filenames. | 
 | 31 |  | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 32 | -a package=dir: Additional directories to be added to the package's | 
 | 33 |                 __path__.  Used to simulate directories added by the | 
 | 34 |                 package at runtime (eg, by OpenGL and win32com). | 
 | 35 |                 More than one -a option may be given for each package. | 
 | 36 |  | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 37 | -l file:      Pass the file to the linker (windows only) | 
 | 38 |  | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 39 | -d:           Debugging mode for the module finder. | 
 | 40 |  | 
 | 41 | -q:           Make the module finder totally quiet. | 
 | 42 |  | 
| Guido van Rossum | 9a6e855 | 1997-08-10 16:47:17 +0000 | [diff] [blame] | 43 | -h:           Print this help message. | 
 | 44 |  | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 45 | -x module     Exclude the specified module. It will still be imported | 
 | 46 |               by the frozen binary if it exists on the host system. | 
 | 47 |  | 
 | 48 | -X module     Like -x, except the module can never be imported by | 
 | 49 |               the frozen binary. | 
 | 50 |  | 
 | 51 | -E:           Freeze will fail if any modules can't be found (that | 
 | 52 |               were not excluded using -x or -X). | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 53 |  | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 54 | -i filename:  Include a file with additional command line options.  Used | 
 | 55 |               to prevent command lines growing beyond the capabilities of | 
 | 56 |               the shell/OS.  All arguments specified in filename | 
 | 57 |               are read and the -i option replaced with the parsed | 
 | 58 |               params (note - quoting args in this file is NOT supported) | 
 | 59 |  | 
| Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 60 | -s subsystem: Specify the subsystem (For Windows only.); | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 61 |               'console' (default), 'windows', 'service' or 'com_dll' | 
| Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 62 |  | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 63 | -w:           Toggle Windows (NT or 95) behavior. | 
| Thomas Wouters | 7e47402 | 2000-07-16 12:04:32 +0000 | [diff] [blame] | 64 |               (For debugging only -- on a win32 platform, win32 behavior | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 65 |               is automatic.) | 
| Guido van Rossum | 58a5948 | 1997-08-14 01:45:33 +0000 | [diff] [blame] | 66 |  | 
| Guido van Rossum | 6b767ac | 2001-03-20 20:43:34 +0000 | [diff] [blame] | 67 | -r prefix=f:  Replace path prefix. | 
| Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 68 |               Replace prefix with f in the source path references | 
| Guido van Rossum | 6b767ac | 2001-03-20 20:43:34 +0000 | [diff] [blame] | 69 |               contained in the resulting binary. | 
 | 70 |  | 
| Guido van Rossum | 96c4dd9 | 1996-08-26 05:14:20 +0000 | [diff] [blame] | 71 | Arguments: | 
 | 72 |  | 
| Guido van Rossum | 1e07403 | 1998-03-05 04:05:38 +0000 | [diff] [blame] | 73 | script:       The Python script to be executed by the resulting binary. | 
| Guido van Rossum | d8336c2 | 1994-10-05 16:13:01 +0000 | [diff] [blame] | 74 |  | 
 | 75 | module ...:   Additional Python modules (referenced by pathname) | 
 | 76 |               that will be included in the resulting binary.  These | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 77 |               may be .py or .pyc files.  If -m is specified, these are | 
 | 78 |               module names that are search in the path instead. | 
| Guido van Rossum | 150316e | 1995-08-08 14:21:07 +0000 | [diff] [blame] | 79 |  | 
 | 80 | NOTES: | 
 | 81 |  | 
 | 82 | In order to use freeze successfully, you must have built Python and | 
| Guido van Rossum | d4cc04c | 1996-06-17 17:49:13 +0000 | [diff] [blame] | 83 | installed it ("make install"). | 
| Guido van Rossum | 150316e | 1995-08-08 14:21:07 +0000 | [diff] [blame] | 84 |  | 
| Guido van Rossum | 96c4dd9 | 1996-08-26 05:14:20 +0000 | [diff] [blame] | 85 | The script should not use modules provided only as shared libraries; | 
 | 86 | if it does, the resulting binary is not self-contained. | 
| Guido van Rossum | d8336c2 | 1994-10-05 16:13:01 +0000 | [diff] [blame] | 87 | """ | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 88 |  | 
 | 89 |  | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 90 | # Import standard modules | 
 | 91 |  | 
| Gustavo Niemeyer | 7b4abbb | 2003-05-26 23:52:30 +0000 | [diff] [blame] | 92 | import modulefinder | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 93 | import getopt | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 94 | import os | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 95 | import sys | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 96 |  | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 97 |  | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 98 | # Import the freeze-private modules | 
 | 99 |  | 
| Guido van Rossum | d8336c2 | 1994-10-05 16:13:01 +0000 | [diff] [blame] | 100 | import checkextensions | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 101 | import makeconfig | 
 | 102 | import makefreeze | 
 | 103 | import makemakefile | 
 | 104 | import parsesetup | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 105 | import bkfile | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 106 |  | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 107 |  | 
 | 108 | # Main program | 
 | 109 |  | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 110 | def main(): | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 111 |     # overridable context | 
 | 112 |     prefix = None                       # settable with -p option | 
 | 113 |     exec_prefix = None                  # settable with -P option | 
 | 114 |     extensions = [] | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 115 |     exclude = []                        # settable with -x option | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 116 |     addn_link = []      # settable with -l, but only honored under Windows. | 
| Guido van Rossum | 1e07403 | 1998-03-05 04:05:38 +0000 | [diff] [blame] | 117 |     path = sys.path[:] | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 118 |     modargs = 0 | 
 | 119 |     debug = 1 | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 120 |     odir = '' | 
| Guido van Rossum | 58a5948 | 1997-08-14 01:45:33 +0000 | [diff] [blame] | 121 |     win = sys.platform[:3] == 'win' | 
| Guido van Rossum | 6b767ac | 2001-03-20 20:43:34 +0000 | [diff] [blame] | 122 |     replace_paths = []                  # settable with -r option | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 123 |     error_if_any_missing = 0 | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 124 |  | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 125 |     # default the exclude list for each platform | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 126 |     if win: exclude = exclude + [ | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 127 |         'dos', 'dospath', 'mac', 'macpath', 'macfs', 'MACFS', 'posix', | 
| Jesus Cea | b176203 | 2012-10-05 02:27:40 +0200 | [diff] [blame] | 128 |         'ce', | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 129 |         ] | 
 | 130 |  | 
 | 131 |     fail_import = exclude[:] | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 132 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 133 |     # output files | 
 | 134 |     frozen_c = 'frozen.c' | 
 | 135 |     config_c = 'config.c' | 
 | 136 |     target = 'a.out'                    # normally derived from script name | 
 | 137 |     makefile = 'Makefile' | 
| Guido van Rossum | 58a5948 | 1997-08-14 01:45:33 +0000 | [diff] [blame] | 138 |     subsystem = 'console' | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 139 |  | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 140 |     # parse command line by first replacing any "-i" options with the | 
 | 141 |     # file contents. | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 142 |     pos = 1 | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 143 |     while pos < len(sys.argv)-1: | 
 | 144 |         # last option can not be "-i", so this ensures "pos+1" is in range! | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 145 |         if sys.argv[pos] == '-i': | 
 | 146 |             try: | 
| Walter Dörwald | aaab30e | 2002-09-11 20:36:02 +0000 | [diff] [blame] | 147 |                 options = open(sys.argv[pos+1]).read().split() | 
| Guido van Rossum | b940e11 | 2007-01-10 16:19:56 +0000 | [diff] [blame] | 148 |             except IOError as why: | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 149 |                 usage("File name '%s' specified with the -i option " | 
 | 150 |                       "can not be read - %s" % (sys.argv[pos+1], why) ) | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 151 |             # Replace the '-i' and the filename with the read params. | 
 | 152 |             sys.argv[pos:pos+2] = options | 
 | 153 |             pos = pos + len(options) - 1 # Skip the name and the included args. | 
 | 154 |         pos = pos + 1 | 
 | 155 |  | 
 | 156 |     # Now parse the command line with the extras inserted. | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 157 |     try: | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 158 |         opts, args = getopt.getopt(sys.argv[1:], 'r:a:dEe:hmo:p:P:qs:wX:x:l:') | 
| Guido van Rossum | b940e11 | 2007-01-10 16:19:56 +0000 | [diff] [blame] | 159 |     except getopt.error as msg: | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 160 |         usage('getopt error: ' + str(msg)) | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 161 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 162 |     # proces option arguments | 
 | 163 |     for o, a in opts: | 
 | 164 |         if o == '-h': | 
| Guido van Rossum | 96bf7e8 | 2007-02-09 23:27:01 +0000 | [diff] [blame] | 165 |             print(__doc__) | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 166 |             return | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 167 |         if o == '-d': | 
 | 168 |             debug = debug + 1 | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 169 |         if o == '-e': | 
 | 170 |             extensions.append(a) | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 171 |         if o == '-m': | 
 | 172 |             modargs = 1 | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 173 |         if o == '-o': | 
 | 174 |             odir = a | 
 | 175 |         if o == '-p': | 
 | 176 |             prefix = a | 
 | 177 |         if o == '-P': | 
 | 178 |             exec_prefix = a | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 179 |         if o == '-q': | 
 | 180 |             debug = 0 | 
| Guido van Rossum | 58a5948 | 1997-08-14 01:45:33 +0000 | [diff] [blame] | 181 |         if o == '-w': | 
 | 182 |             win = not win | 
 | 183 |         if o == '-s': | 
 | 184 |             if not win: | 
 | 185 |                 usage("-s subsystem option only on Windows") | 
 | 186 |             subsystem = a | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 187 |         if o == '-x': | 
 | 188 |             exclude.append(a) | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 189 |         if o == '-X': | 
 | 190 |             exclude.append(a) | 
 | 191 |             fail_import.append(a) | 
 | 192 |         if o == '-E': | 
 | 193 |             error_if_any_missing = 1 | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 194 |         if o == '-l': | 
 | 195 |             addn_link.append(a) | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 196 |         if o == '-a': | 
| Neal Norwitz | d910855 | 2006-03-17 08:00:19 +0000 | [diff] [blame] | 197 |             modulefinder.AddPackagePath(*a.split("=", 2)) | 
| Guido van Rossum | 6b767ac | 2001-03-20 20:43:34 +0000 | [diff] [blame] | 198 |         if o == '-r': | 
| Walter Dörwald | aaab30e | 2002-09-11 20:36:02 +0000 | [diff] [blame] | 199 |             f,r = a.split("=", 2) | 
| Guido van Rossum | 6b767ac | 2001-03-20 20:43:34 +0000 | [diff] [blame] | 200 |             replace_paths.append( (f,r) ) | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 201 |  | 
| Just van Rossum | e9e20a9 | 2003-03-08 19:50:38 +0000 | [diff] [blame] | 202 |     # modules that are imported by the Python runtime | 
 | 203 |     implicits = [] | 
| Georg Brandl | 0063958 | 2010-08-02 22:25:16 +0000 | [diff] [blame] | 204 |     for module in ('site', 'warnings', 'encodings.utf_8', 'encodings.latin_1'): | 
| Just van Rossum | e9e20a9 | 2003-03-08 19:50:38 +0000 | [diff] [blame] | 205 |         if module not in exclude: | 
 | 206 |             implicits.append(module) | 
 | 207 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 208 |     # default prefix and exec_prefix | 
 | 209 |     if not exec_prefix: | 
 | 210 |         if prefix: | 
 | 211 |             exec_prefix = prefix | 
 | 212 |         else: | 
 | 213 |             exec_prefix = sys.exec_prefix | 
 | 214 |     if not prefix: | 
 | 215 |         prefix = sys.prefix | 
| Guido van Rossum | 9a6e855 | 1997-08-10 16:47:17 +0000 | [diff] [blame] | 216 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 217 |     # determine whether -p points to the Python source tree | 
| Guido van Rossum | e039425 | 1998-03-05 05:39:50 +0000 | [diff] [blame] | 218 |     ishome = os.path.exists(os.path.join(prefix, 'Python', 'ceval.c')) | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 219 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 220 |     # locations derived from options | 
 | 221 |     version = sys.version[:3] | 
| Martin v. Löwis | a7fcd92 | 2014-03-30 20:28:52 +0200 | [diff] [blame] | 222 |     flagged_version = version + sys.abiflags | 
| Guido van Rossum | 5e32a77 | 1998-07-07 22:47:38 +0000 | [diff] [blame] | 223 |     if win: | 
 | 224 |         extensions_c = 'frozen_extensions.c' | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 225 |     if ishome: | 
| Guido van Rossum | 96bf7e8 | 2007-02-09 23:27:01 +0000 | [diff] [blame] | 226 |         print("(Using Python source directory)") | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 227 |         binlib = exec_prefix | 
 | 228 |         incldir = os.path.join(prefix, 'Include') | 
| Guido van Rossum | 590fc2c | 1998-06-12 14:09:03 +0000 | [diff] [blame] | 229 |         config_h_dir = exec_prefix | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 230 |         config_c_in = os.path.join(prefix, 'Modules', 'config.c.in') | 
| Guido van Rossum | 58a5948 | 1997-08-14 01:45:33 +0000 | [diff] [blame] | 231 |         frozenmain_c = os.path.join(prefix, 'Python', 'frozenmain.c') | 
| Gustavo Niemeyer | ffa5a50 | 2004-05-08 17:59:43 +0000 | [diff] [blame] | 232 |         makefile_in = os.path.join(exec_prefix, 'Makefile') | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 233 |         if win: | 
 | 234 |             frozendllmain_c = os.path.join(exec_prefix, 'Pc\\frozen_dllmain.c') | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 235 |     else: | 
 | 236 |         binlib = os.path.join(exec_prefix, | 
| Martin v. Löwis | a7fcd92 | 2014-03-30 20:28:52 +0200 | [diff] [blame] | 237 |                               'lib', 'python%s' % version, | 
 | 238 |                               'config-%s' % flagged_version) | 
 | 239 |         incldir = os.path.join(prefix, 'include', 'python%s' % flagged_version) | 
| Guido van Rossum | 590fc2c | 1998-06-12 14:09:03 +0000 | [diff] [blame] | 240 |         config_h_dir = os.path.join(exec_prefix, 'include', | 
| Martin v. Löwis | a7fcd92 | 2014-03-30 20:28:52 +0200 | [diff] [blame] | 241 |                                     'python%s' % flagged_version) | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 242 |         config_c_in = os.path.join(binlib, 'config.c.in') | 
 | 243 |         frozenmain_c = os.path.join(binlib, 'frozenmain.c') | 
 | 244 |         makefile_in = os.path.join(binlib, 'Makefile') | 
| Guido van Rossum | 5e32a77 | 1998-07-07 22:47:38 +0000 | [diff] [blame] | 245 |         frozendllmain_c = os.path.join(binlib, 'frozen_dllmain.c') | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 246 |     supp_sources = [] | 
 | 247 |     defines = [] | 
| Guido van Rossum | 590fc2c | 1998-06-12 14:09:03 +0000 | [diff] [blame] | 248 |     includes = ['-I' + incldir, '-I' + config_h_dir] | 
| Guido van Rossum | d8336c2 | 1994-10-05 16:13:01 +0000 | [diff] [blame] | 249 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 250 |     # sanity check of directories and files | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 251 |     check_dirs = [prefix, exec_prefix, binlib, incldir] | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 252 |     if not win: | 
 | 253 |         # These are not directories on Windows. | 
 | 254 |         check_dirs = check_dirs + extensions | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 255 |     for dir in check_dirs: | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 256 |         if not os.path.exists(dir): | 
 | 257 |             usage('needed directory %s not found' % dir) | 
 | 258 |         if not os.path.isdir(dir): | 
 | 259 |             usage('%s: not a directory' % dir) | 
| Guido van Rossum | 58a5948 | 1997-08-14 01:45:33 +0000 | [diff] [blame] | 260 |     if win: | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 261 |         files = supp_sources + extensions # extensions are files on Windows. | 
| Guido van Rossum | 58a5948 | 1997-08-14 01:45:33 +0000 | [diff] [blame] | 262 |     else: | 
 | 263 |         files = [config_c_in, makefile_in] + supp_sources | 
 | 264 |     for file in supp_sources: | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 265 |         if not os.path.exists(file): | 
 | 266 |             usage('needed file %s not found' % file) | 
 | 267 |         if not os.path.isfile(file): | 
 | 268 |             usage('%s: not a plain file' % file) | 
| Guido van Rossum | 58a5948 | 1997-08-14 01:45:33 +0000 | [diff] [blame] | 269 |     if not win: | 
 | 270 |         for dir in extensions: | 
 | 271 |             setup = os.path.join(dir, 'Setup') | 
 | 272 |             if not os.path.exists(setup): | 
 | 273 |                 usage('needed file %s not found' % setup) | 
 | 274 |             if not os.path.isfile(setup): | 
 | 275 |                 usage('%s: not a plain file' % setup) | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 276 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 277 |     # check that enough arguments are passed | 
 | 278 |     if not args: | 
 | 279 |         usage('at least one filename argument required') | 
| Guido van Rossum | d4cc04c | 1996-06-17 17:49:13 +0000 | [diff] [blame] | 280 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 281 |     # check that file arguments exist | 
 | 282 |     for arg in args: | 
| Guido van Rossum | 1e07403 | 1998-03-05 04:05:38 +0000 | [diff] [blame] | 283 |         if arg == '-m': | 
 | 284 |             break | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 285 |         # if user specified -m on the command line before _any_ | 
 | 286 |         # file names, then nothing should be checked (as the | 
 | 287 |         # very first file should be a module name) | 
 | 288 |         if modargs: | 
 | 289 |             break | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 290 |         if not os.path.exists(arg): | 
 | 291 |             usage('argument %s not found' % arg) | 
 | 292 |         if not os.path.isfile(arg): | 
 | 293 |             usage('%s: not a plain file' % arg) | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 294 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 295 |     # process non-option arguments | 
 | 296 |     scriptfile = args[0] | 
 | 297 |     modules = args[1:] | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 298 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 299 |     # derive target name from script name | 
 | 300 |     base = os.path.basename(scriptfile) | 
 | 301 |     base, ext = os.path.splitext(base) | 
 | 302 |     if base: | 
 | 303 |         if base != scriptfile: | 
 | 304 |             target = base | 
 | 305 |         else: | 
 | 306 |             target = base + '.bin' | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 307 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 308 |     # handle -o option | 
 | 309 |     base_frozen_c = frozen_c | 
 | 310 |     base_config_c = config_c | 
 | 311 |     base_target = target | 
 | 312 |     if odir and not os.path.isdir(odir): | 
 | 313 |         try: | 
 | 314 |             os.mkdir(odir) | 
| Guido van Rossum | 96bf7e8 | 2007-02-09 23:27:01 +0000 | [diff] [blame] | 315 |             print("Created output directory", odir) | 
| Andrew Svetlov | 8b33dd8 | 2012-12-24 19:58:48 +0200 | [diff] [blame] | 316 |         except OSError as msg: | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 317 |             usage('%s: mkdir failed (%s)' % (odir, str(msg))) | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 318 |     base = '' | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 319 |     if odir: | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 320 |         base = os.path.join(odir, '') | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 321 |         frozen_c = os.path.join(odir, frozen_c) | 
 | 322 |         config_c = os.path.join(odir, config_c) | 
 | 323 |         target = os.path.join(odir, target) | 
 | 324 |         makefile = os.path.join(odir, makefile) | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 325 |         if win: extensions_c = os.path.join(odir, extensions_c) | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 326 |  | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 327 |     # Handle special entry point requirements | 
 | 328 |     # (on Windows, some frozen programs do not use __main__, but | 
 | 329 |     # import the module directly.  Eg, DLLs, Services, etc | 
 | 330 |     custom_entry_point = None  # Currently only used on Windows | 
 | 331 |     python_entry_is_main = 1   # Is the entry point called __main__? | 
 | 332 |     # handle -s option on Windows | 
 | 333 |     if win: | 
 | 334 |         import winmakemakefile | 
 | 335 |         try: | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 336 |             custom_entry_point, python_entry_is_main = \ | 
 | 337 |                 winmakemakefile.get_custom_entry_point(subsystem) | 
| Guido van Rossum | b940e11 | 2007-01-10 16:19:56 +0000 | [diff] [blame] | 338 |         except ValueError as why: | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 339 |             usage(why) | 
| Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 340 |  | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 341 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 342 |     # Actual work starts here... | 
| Guido van Rossum | d8336c2 | 1994-10-05 16:13:01 +0000 | [diff] [blame] | 343 |  | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 344 |     # collect all modules of the program | 
| Guido van Rossum | 1e07403 | 1998-03-05 04:05:38 +0000 | [diff] [blame] | 345 |     dir = os.path.dirname(scriptfile) | 
 | 346 |     path[0] = dir | 
| Guido van Rossum | 6b767ac | 2001-03-20 20:43:34 +0000 | [diff] [blame] | 347 |     mf = modulefinder.ModuleFinder(path, debug, exclude, replace_paths) | 
| Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 348 |  | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 349 |     if win and subsystem=='service': | 
 | 350 |         # If a Windows service, then add the "built-in" module. | 
 | 351 |         mod = mf.add_module("servicemanager") | 
 | 352 |         mod.__file__="dummy.pyd" # really built-in to the resulting EXE | 
 | 353 |  | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 354 |     for mod in implicits: | 
 | 355 |         mf.import_hook(mod) | 
 | 356 |     for mod in modules: | 
 | 357 |         if mod == '-m': | 
 | 358 |             modargs = 1 | 
 | 359 |             continue | 
 | 360 |         if modargs: | 
 | 361 |             if mod[-2:] == '.*': | 
 | 362 |                 mf.import_hook(mod[:-2], None, ["*"]) | 
 | 363 |             else: | 
 | 364 |                 mf.import_hook(mod) | 
 | 365 |         else: | 
 | 366 |             mf.load_file(mod) | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 367 |  | 
| Martin v. Löwis | c00d39e | 2014-03-30 21:07:25 +0200 | [diff] [blame] | 368 |     # Alias "importlib._bootstrap" to "_frozen_importlib" so that the | 
 | 369 |     # import machinery can bootstrap. | 
 | 370 |     mf.modules["_frozen_importlib"] = mf.modules["importlib._bootstrap"] | 
 | 371 |  | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 372 |     # Add the main script as either __main__, or the actual module name. | 
 | 373 |     if python_entry_is_main: | 
 | 374 |         mf.run_script(scriptfile) | 
 | 375 |     else: | 
| Guido van Rossum | 4b1235c | 2000-05-06 03:18:08 +0000 | [diff] [blame] | 376 |         mf.load_file(scriptfile) | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 377 |  | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 378 |     if debug > 0: | 
 | 379 |         mf.report() | 
| Guido van Rossum | 96bf7e8 | 2007-02-09 23:27:01 +0000 | [diff] [blame] | 380 |         print() | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 381 |     dict = mf.modules | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 382 |  | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 383 |     if error_if_any_missing: | 
 | 384 |         missing = mf.any_missing() | 
 | 385 |         if missing: | 
 | 386 |             sys.exit("There are some missing modules: %r" % missing) | 
 | 387 |  | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 388 |     # generate output for frozen modules | 
| Guido van Rossum | 03f7f08 | 2001-10-18 19:15:32 +0000 | [diff] [blame] | 389 |     files = makefreeze.makefreeze(base, dict, debug, custom_entry_point, | 
 | 390 |                                   fail_import) | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 391 |  | 
| Guido van Rossum | a0e1835 | 1998-03-07 04:51:03 +0000 | [diff] [blame] | 392 |     # look for unfrozen modules (builtin and of unknown origin) | 
 | 393 |     builtins = [] | 
 | 394 |     unknown = [] | 
| Guido van Rossum | 5397039 | 2007-06-12 00:28:30 +0000 | [diff] [blame] | 395 |     mods = sorted(dict.keys()) | 
| Guido van Rossum | a0e1835 | 1998-03-07 04:51:03 +0000 | [diff] [blame] | 396 |     for mod in mods: | 
 | 397 |         if dict[mod].__code__: | 
 | 398 |             continue | 
 | 399 |         if not dict[mod].__file__: | 
 | 400 |             builtins.append(mod) | 
 | 401 |         else: | 
 | 402 |             unknown.append(mod) | 
 | 403 |  | 
 | 404 |     # search for unknown modules in extensions directories (not on Windows) | 
 | 405 |     addfiles = [] | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 406 |     frozen_extensions = [] # Windows list of modules. | 
| Guido van Rossum | a937afd | 1998-04-23 14:39:24 +0000 | [diff] [blame] | 407 |     if unknown or (not win and builtins): | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 408 |         if not win: | 
 | 409 |             addfiles, addmods = \ | 
| Guido van Rossum | a937afd | 1998-04-23 14:39:24 +0000 | [diff] [blame] | 410 |                       checkextensions.checkextensions(unknown+builtins, | 
 | 411 |                                                       extensions) | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 412 |             for mod in addmods: | 
| Guido van Rossum | a937afd | 1998-04-23 14:39:24 +0000 | [diff] [blame] | 413 |                 if mod in unknown: | 
 | 414 |                     unknown.remove(mod) | 
 | 415 |                     builtins.append(mod) | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 416 |         else: | 
 | 417 |             # Do the windows thang... | 
 | 418 |             import checkextensions_win32 | 
| Tim Peters | 182b5ac | 2004-07-18 06:16:08 +0000 | [diff] [blame] | 419 |             # Get a list of CExtension instances, each describing a module | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 420 |             # (including its source files) | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 421 |             frozen_extensions = checkextensions_win32.checkextensions( | 
| Guido van Rossum | f67c238 | 2000-07-13 15:45:17 +0000 | [diff] [blame] | 422 |                 unknown, extensions, prefix) | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 423 |             for mod in frozen_extensions: | 
| Guido van Rossum | 78fc363 | 1998-03-20 17:37:24 +0000 | [diff] [blame] | 424 |                 unknown.remove(mod.name) | 
| Guido van Rossum | a0e1835 | 1998-03-07 04:51:03 +0000 | [diff] [blame] | 425 |  | 
 | 426 |     # report unknown modules | 
 | 427 |     if unknown: | 
 | 428 |         sys.stderr.write('Warning: unknown modules remain: %s\n' % | 
| Walter Dörwald | aaab30e | 2002-09-11 20:36:02 +0000 | [diff] [blame] | 429 |                          ' '.join(unknown)) | 
| Guido van Rossum | a0e1835 | 1998-03-07 04:51:03 +0000 | [diff] [blame] | 430 |  | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 431 |     # windows gets different treatment | 
| Guido van Rossum | 58a5948 | 1997-08-14 01:45:33 +0000 | [diff] [blame] | 432 |     if win: | 
 | 433 |         # Taking a shortcut here... | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 434 |         import winmakemakefile, checkextensions_win32 | 
 | 435 |         checkextensions_win32.write_extension_table(extensions_c, | 
 | 436 |                                                     frozen_extensions) | 
 | 437 |         # Create a module definition for the bootstrap C code. | 
 | 438 |         xtras = [frozenmain_c, os.path.basename(frozen_c), | 
| Guido van Rossum | 7039f50 | 1999-03-12 22:07:05 +0000 | [diff] [blame] | 439 |                  frozendllmain_c, os.path.basename(extensions_c)] + files | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 440 |         maindefn = checkextensions_win32.CExtension( '__main__', xtras ) | 
 | 441 |         frozen_extensions.append( maindefn ) | 
| Guido van Rossum | 58a5948 | 1997-08-14 01:45:33 +0000 | [diff] [blame] | 442 |         outfp = open(makefile, 'w') | 
 | 443 |         try: | 
 | 444 |             winmakemakefile.makemakefile(outfp, | 
 | 445 |                                          locals(), | 
| Guido van Rossum | e35c601 | 1998-05-18 20:25:54 +0000 | [diff] [blame] | 446 |                                          frozen_extensions, | 
| Guido van Rossum | 31d53ed | 1998-03-07 04:08:04 +0000 | [diff] [blame] | 447 |                                          os.path.basename(target)) | 
| Guido van Rossum | 58a5948 | 1997-08-14 01:45:33 +0000 | [diff] [blame] | 448 |         finally: | 
 | 449 |             outfp.close() | 
 | 450 |         return | 
 | 451 |  | 
| Guido van Rossum | 75dc496 | 1998-03-05 03:42:00 +0000 | [diff] [blame] | 452 |     # generate config.c and Makefile | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 453 |     builtins.sort() | 
 | 454 |     infp = open(config_c_in) | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 455 |     outfp = bkfile.open(config_c, 'w') | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 456 |     try: | 
 | 457 |         makeconfig.makeconfig(infp, outfp, builtins) | 
 | 458 |     finally: | 
 | 459 |         outfp.close() | 
 | 460 |     infp.close() | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 461 |  | 
| Neil Schemenauer | 89e90d6 | 2001-06-02 06:16:02 +0000 | [diff] [blame] | 462 |     cflags = ['$(OPT)'] | 
 | 463 |     cppflags = defines + includes | 
| Martin v. Löwis | a7fcd92 | 2014-03-30 20:28:52 +0200 | [diff] [blame] | 464 |     libs = [os.path.join(binlib, '$(LDLIBRARY)')] | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 465 |  | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 466 |     somevars = {} | 
| Guido van Rossum | 345df17 | 1997-11-22 22:10:01 +0000 | [diff] [blame] | 467 |     if os.path.exists(makefile_in): | 
 | 468 |         makevars = parsesetup.getmakevars(makefile_in) | 
| Georg Brandl | bf82e37 | 2008-05-16 17:02:34 +0000 | [diff] [blame] | 469 |         for key in makevars: | 
| Gustavo Niemeyer | ffa5a50 | 2004-05-08 17:59:43 +0000 | [diff] [blame] | 470 |             somevars[key] = makevars[key] | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 471 |  | 
| Walter Dörwald | aaab30e | 2002-09-11 20:36:02 +0000 | [diff] [blame] | 472 |     somevars['CFLAGS'] = ' '.join(cflags) # override | 
 | 473 |     somevars['CPPFLAGS'] = ' '.join(cppflags) # override | 
| Marc-André Lemburg | 64b4f27 | 2002-04-04 16:15:41 +0000 | [diff] [blame] | 474 |     files = [base_config_c, base_frozen_c] + \ | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 475 |             files + supp_sources +  addfiles + libs + \ | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 476 |             ['$(MODLIBS)', '$(LIBS)', '$(SYSLIBS)'] | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 477 |  | 
| Guido van Rossum | baf0603 | 1998-08-25 14:06:55 +0000 | [diff] [blame] | 478 |     outfp = bkfile.open(makefile, 'w') | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 479 |     try: | 
 | 480 |         makemakefile.makemakefile(outfp, somevars, files, base_target) | 
 | 481 |     finally: | 
 | 482 |         outfp.close() | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 483 |  | 
 | 484 |     # Done! | 
 | 485 |  | 
 | 486 |     if odir: | 
| Guido van Rossum | 96bf7e8 | 2007-02-09 23:27:01 +0000 | [diff] [blame] | 487 |         print('Now run "make" in', odir, end=' ') | 
 | 488 |         print('to build the target:', base_target) | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 489 |     else: | 
| Guido van Rossum | 96bf7e8 | 2007-02-09 23:27:01 +0000 | [diff] [blame] | 490 |         print('Now run "make" to build the target:', base_target) | 
| Guido van Rossum | 00ff433 | 1994-10-03 16:33:08 +0000 | [diff] [blame] | 491 |  | 
| Guido van Rossum | d8336c2 | 1994-10-05 16:13:01 +0000 | [diff] [blame] | 492 |  | 
 | 493 | # Print usage message and exit | 
 | 494 |  | 
| Guido van Rossum | 9a6e855 | 1997-08-10 16:47:17 +0000 | [diff] [blame] | 495 | def usage(msg): | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 496 |     sys.stdout = sys.stderr | 
| Guido van Rossum | 96bf7e8 | 2007-02-09 23:27:01 +0000 | [diff] [blame] | 497 |     print("Error:", msg) | 
 | 498 |     print("Use ``%s -h'' for help" % sys.argv[0]) | 
| Guido van Rossum | 0b4b8a2 | 1997-08-10 16:56:48 +0000 | [diff] [blame] | 499 |     sys.exit(2) | 
| Guido van Rossum | d8336c2 | 1994-10-05 16:13:01 +0000 | [diff] [blame] | 500 |  | 
 | 501 |  | 
| Guido van Rossum | dbaf332 | 1994-10-03 10:25:54 +0000 | [diff] [blame] | 502 | main() |