blob: b070f0704fcbddd267095d7a3723f89b5f44f1c7 [file] [log] [blame]
Guido van Rossumf06ee5f1996-11-27 19:52:01 +00001#! /usr/bin/env python
Guido van Rossumdbaf3321994-10-03 10:25:54 +00002
Guido van Rossum96c4dd91996-08-26 05:14:20 +00003"""Freeze a Python script into a binary.
Guido van Rossumdbaf3321994-10-03 10:25:54 +00004
Guido van Rossum1e074031998-03-05 04:05:38 +00005usage: freeze [options...] script [module]...
Guido van Rossum00ff4331994-10-03 16:33:08 +00006
Guido van Rossum96c4dd91996-08-26 05:14:20 +00007Options:
Guido van Rossum00ff4331994-10-03 16:33:08 +00008
Guido van Rossum9a6e8551997-08-10 16:47:17 +00009-p prefix: This is the prefix used when you ran ``make install''
Guido van Rossum96c4dd91996-08-26 05:14:20 +000010 in the Python build directory.
Guido van Rossumd8336c21994-10-05 16:13:01 +000011 (If you never ran this, freeze won't work.)
Guido van Rossum96c4dd91996-08-26 05:14:20 +000012 The default is whatever sys.prefix evaluates to.
Guido van Rossum0b4b8a21997-08-10 16:56:48 +000013 It can also be the top directory of the Python source
14 tree; then -P must point to the build tree.
Guido van Rossumd8336c21994-10-05 16:13:01 +000015
Guido van Rossum150316e1995-08-08 14:21:07 +000016-P exec_prefix: Like -p but this is the 'exec_prefix', used to
Guido van Rossum0b4b8a21997-08-10 16:56:48 +000017 install objects etc. The default is whatever sys.exec_prefix
18 evaluates to, or the -p argument if given.
19 If -p points to the Python source tree, -P must point
20 to the build tree, if different.
Guido van Rossum150316e1995-08-08 14:21:07 +000021
Guido van Rossumd8336c21994-10-05 16:13:01 +000022-e extension: A directory containing additional .o files that
23 may be used to resolve modules. This directory
24 should also have a Setup file describing the .o files.
25 More than one -e option may be given.
26
Guido van Rossum96c4dd91996-08-26 05:14:20 +000027-o dir: Directory where the output files are created; default '.'.
28
Guido van Rossum75dc4961998-03-05 03:42:00 +000029-m: Additional arguments are module names instead of filenames.
30
Guido van Rossume35c6011998-05-18 20:25:54 +000031-a package=dir: Additional directories to be added to the package's
32 __path__. Used to simulate directories added by the
33 package at runtime (eg, by OpenGL and win32com).
34 More than one -a option may be given for each package.
35
Guido van Rossum78fc3631998-03-20 17:37:24 +000036-l file: Pass the file to the linker (windows only)
37
Guido van Rossum75dc4961998-03-05 03:42:00 +000038-d: Debugging mode for the module finder.
39
40-q: Make the module finder totally quiet.
41
Guido van Rossum9a6e8551997-08-10 16:47:17 +000042-h: Print this help message.
43
Guido van Rossum58a59481997-08-14 01:45:33 +000044-w: Toggle Windows (NT or 95) behavior.
45 (For debugging only -- on a win32 platform, win32 behaviour
46 is automatic.)
47
Guido van Rossum78fc3631998-03-20 17:37:24 +000048-x module Exclude the specified module.
49
50-s subsystem: Specify the subsystem (For Windows only.);
51 'console' (default), 'windows', 'service' or 'com_dll'
52
Guido van Rossum58a59481997-08-14 01:45:33 +000053
Guido van Rossum96c4dd91996-08-26 05:14:20 +000054Arguments:
55
Guido van Rossum1e074031998-03-05 04:05:38 +000056script: The Python script to be executed by the resulting binary.
Guido van Rossumd8336c21994-10-05 16:13:01 +000057
58module ...: Additional Python modules (referenced by pathname)
59 that will be included in the resulting binary. These
Guido van Rossum75dc4961998-03-05 03:42:00 +000060 may be .py or .pyc files. If -m is specified, these are
61 module names that are search in the path instead.
Guido van Rossum150316e1995-08-08 14:21:07 +000062
63NOTES:
64
65In order to use freeze successfully, you must have built Python and
Guido van Rossumd4cc04c1996-06-17 17:49:13 +000066installed it ("make install").
Guido van Rossum150316e1995-08-08 14:21:07 +000067
Guido van Rossum96c4dd91996-08-26 05:14:20 +000068The script should not use modules provided only as shared libraries;
69if it does, the resulting binary is not self-contained.
Guido van Rossumd8336c21994-10-05 16:13:01 +000070"""
Guido van Rossum00ff4331994-10-03 16:33:08 +000071
72
Guido van Rossum00ff4331994-10-03 16:33:08 +000073# Import standard modules
74
Guido van Rossumd8336c21994-10-05 16:13:01 +000075import cmp
Guido van Rossumdbaf3321994-10-03 10:25:54 +000076import getopt
Guido van Rossum00ff4331994-10-03 16:33:08 +000077import os
Guido van Rossumdbaf3321994-10-03 10:25:54 +000078import string
Guido van Rossum00ff4331994-10-03 16:33:08 +000079import sys
Guido van Rossumdbaf3321994-10-03 10:25:54 +000080
Guido van Rossumdbaf3321994-10-03 10:25:54 +000081
Guido van Rossum00ff4331994-10-03 16:33:08 +000082# Import the freeze-private modules
83
Guido van Rossumd8336c21994-10-05 16:13:01 +000084import checkextensions
Guido van Rossum75dc4961998-03-05 03:42:00 +000085import modulefinder
Guido van Rossum00ff4331994-10-03 16:33:08 +000086import makeconfig
87import makefreeze
88import makemakefile
89import parsesetup
90
Guido van Rossum00ff4331994-10-03 16:33:08 +000091
92# Main program
93
Guido van Rossumdbaf3321994-10-03 10:25:54 +000094def main():
Guido van Rossum0b4b8a21997-08-10 16:56:48 +000095 # overridable context
96 prefix = None # settable with -p option
97 exec_prefix = None # settable with -P option
98 extensions = []
Guido van Rossum78fc3631998-03-20 17:37:24 +000099 exclude = [] # settable with -x option
Guido van Rossume35c6011998-05-18 20:25:54 +0000100 addn_link = [] # settable with -l, but only honored under Windows.
Guido van Rossum1e074031998-03-05 04:05:38 +0000101 path = sys.path[:]
Guido van Rossum75dc4961998-03-05 03:42:00 +0000102 modargs = 0
103 debug = 1
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000104 odir = ''
Guido van Rossum58a59481997-08-14 01:45:33 +0000105 win = sys.platform[:3] == 'win'
Guido van Rossum00ff4331994-10-03 16:33:08 +0000106
Guido van Rossum78fc3631998-03-20 17:37:24 +0000107 # default the exclude list for each platform
Guido van Rossume35c6011998-05-18 20:25:54 +0000108## if win: exclude = exclude + [
109## 'dos', 'dospath', 'mac', 'macpath', 'MACFS', 'posix', 'os2']
Guido van Rossum78fc3631998-03-20 17:37:24 +0000110
Guido van Rossum94ce0d11997-12-08 05:01:06 +0000111 # modules that are imported by the Python runtime
112 implicits = ["site", "exceptions"]
113
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000114 # output files
115 frozen_c = 'frozen.c'
116 config_c = 'config.c'
117 target = 'a.out' # normally derived from script name
118 makefile = 'Makefile'
Guido van Rossum58a59481997-08-14 01:45:33 +0000119 subsystem = 'console'
Guido van Rossume35c6011998-05-18 20:25:54 +0000120 if win: extensions_c = 'frozen_extensions.c'
Guido van Rossum00ff4331994-10-03 16:33:08 +0000121
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000122 # parse command line
123 try:
Guido van Rossume35c6011998-05-18 20:25:54 +0000124 opts, args = getopt.getopt(sys.argv[1:], 'a:de:hmo:p:P:qs:wx:l:')
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000125 except getopt.error, msg:
126 usage('getopt error: ' + str(msg))
Guido van Rossum00ff4331994-10-03 16:33:08 +0000127
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000128 # proces option arguments
129 for o, a in opts:
130 if o == '-h':
131 print __doc__
132 return
Guido van Rossum75dc4961998-03-05 03:42:00 +0000133 if o == '-d':
134 debug = debug + 1
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000135 if o == '-e':
136 extensions.append(a)
Guido van Rossum75dc4961998-03-05 03:42:00 +0000137 if o == '-m':
138 modargs = 1
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000139 if o == '-o':
140 odir = a
141 if o == '-p':
142 prefix = a
143 if o == '-P':
144 exec_prefix = a
Guido van Rossum75dc4961998-03-05 03:42:00 +0000145 if o == '-q':
146 debug = 0
Guido van Rossum58a59481997-08-14 01:45:33 +0000147 if o == '-w':
148 win = not win
149 if o == '-s':
150 if not win:
151 usage("-s subsystem option only on Windows")
152 subsystem = a
Guido van Rossum78fc3631998-03-20 17:37:24 +0000153 if o == '-x':
154 exclude.append(a)
155 if o == '-l':
156 addn_link.append(a)
Guido van Rossume35c6011998-05-18 20:25:54 +0000157 if o == '-a':
158 apply(modulefinder.AddPackagePath, tuple(string.split(a,"=", 2)))
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000159
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000160 # default prefix and exec_prefix
161 if not exec_prefix:
162 if prefix:
163 exec_prefix = prefix
164 else:
165 exec_prefix = sys.exec_prefix
166 if not prefix:
167 prefix = sys.prefix
Guido van Rossum9a6e8551997-08-10 16:47:17 +0000168
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000169 # determine whether -p points to the Python source tree
Guido van Rossume0394251998-03-05 05:39:50 +0000170 ishome = os.path.exists(os.path.join(prefix, 'Python', 'ceval.c'))
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000171
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000172 # locations derived from options
173 version = sys.version[:3]
174 if ishome:
175 print "(Using Python source directory)"
176 binlib = exec_prefix
177 incldir = os.path.join(prefix, 'Include')
178 config_c_in = os.path.join(prefix, 'Modules', 'config.c.in')
Guido van Rossum58a59481997-08-14 01:45:33 +0000179 frozenmain_c = os.path.join(prefix, 'Python', 'frozenmain.c')
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000180 makefile_in = os.path.join(exec_prefix, 'Modules', 'Makefile')
Guido van Rossume35c6011998-05-18 20:25:54 +0000181 if win:
182 frozendllmain_c = os.path.join(exec_prefix, 'Pc\\frozen_dllmain.c')
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000183 else:
184 binlib = os.path.join(exec_prefix,
185 'lib', 'python%s' % version, 'config')
186 incldir = os.path.join(prefix, 'include', 'python%s' % version)
187 config_c_in = os.path.join(binlib, 'config.c.in')
188 frozenmain_c = os.path.join(binlib, 'frozenmain.c')
189 makefile_in = os.path.join(binlib, 'Makefile')
190 supp_sources = []
191 defines = []
192 includes = ['-I' + incldir, '-I' + binlib]
Guido van Rossumd8336c21994-10-05 16:13:01 +0000193
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000194 # sanity check of directories and files
195 for dir in [prefix, exec_prefix, binlib, incldir] + extensions:
196 if not os.path.exists(dir):
197 usage('needed directory %s not found' % dir)
198 if not os.path.isdir(dir):
199 usage('%s: not a directory' % dir)
Guido van Rossum58a59481997-08-14 01:45:33 +0000200 if win:
201 files = supp_sources
202 else:
203 files = [config_c_in, makefile_in] + supp_sources
204 for file in supp_sources:
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000205 if not os.path.exists(file):
206 usage('needed file %s not found' % file)
207 if not os.path.isfile(file):
208 usage('%s: not a plain file' % file)
Guido van Rossum58a59481997-08-14 01:45:33 +0000209 if not win:
210 for dir in extensions:
211 setup = os.path.join(dir, 'Setup')
212 if not os.path.exists(setup):
213 usage('needed file %s not found' % setup)
214 if not os.path.isfile(setup):
215 usage('%s: not a plain file' % setup)
Guido van Rossum00ff4331994-10-03 16:33:08 +0000216
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000217 # check that enough arguments are passed
218 if not args:
219 usage('at least one filename argument required')
Guido van Rossumd4cc04c1996-06-17 17:49:13 +0000220
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000221 # check that file arguments exist
222 for arg in args:
Guido van Rossum1e074031998-03-05 04:05:38 +0000223 if arg == '-m':
224 break
Guido van Rossum78fc3631998-03-20 17:37:24 +0000225 # if user specified -m on the command line before _any_
226 # file names, then nothing should be checked (as the
227 # very first file should be a module name)
228 if modargs:
229 break
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000230 if not os.path.exists(arg):
231 usage('argument %s not found' % arg)
232 if not os.path.isfile(arg):
233 usage('%s: not a plain file' % arg)
Guido van Rossum00ff4331994-10-03 16:33:08 +0000234
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000235 # process non-option arguments
236 scriptfile = args[0]
237 modules = args[1:]
Guido van Rossum00ff4331994-10-03 16:33:08 +0000238
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000239 # derive target name from script name
240 base = os.path.basename(scriptfile)
241 base, ext = os.path.splitext(base)
242 if base:
243 if base != scriptfile:
244 target = base
245 else:
246 target = base + '.bin'
Guido van Rossum00ff4331994-10-03 16:33:08 +0000247
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000248 # handle -o option
249 base_frozen_c = frozen_c
250 base_config_c = config_c
251 base_target = target
252 if odir and not os.path.isdir(odir):
253 try:
254 os.mkdir(odir)
255 print "Created output directory", odir
256 except os.error, msg:
257 usage('%s: mkdir failed (%s)' % (odir, str(msg)))
258 if odir:
259 frozen_c = os.path.join(odir, frozen_c)
260 config_c = os.path.join(odir, config_c)
261 target = os.path.join(odir, target)
262 makefile = os.path.join(odir, makefile)
Guido van Rossume35c6011998-05-18 20:25:54 +0000263 if win: extensions_c = os.path.join(odir, extensions_c)
Guido van Rossum00ff4331994-10-03 16:33:08 +0000264
Guido van Rossum78fc3631998-03-20 17:37:24 +0000265 # Handle special entry point requirements
266 # (on Windows, some frozen programs do not use __main__, but
267 # import the module directly. Eg, DLLs, Services, etc
268 custom_entry_point = None # Currently only used on Windows
269 python_entry_is_main = 1 # Is the entry point called __main__?
270 # handle -s option on Windows
271 if win:
272 import winmakemakefile
273 try:
Guido van Rossume35c6011998-05-18 20:25:54 +0000274 custom_entry_point, python_entry_is_main = \
275 winmakemakefile.get_custom_entry_point(subsystem)
Guido van Rossum78fc3631998-03-20 17:37:24 +0000276 except ValueError, why:
277 usage(why)
278
279
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000280 # Actual work starts here...
Guido van Rossumd8336c21994-10-05 16:13:01 +0000281
Guido van Rossum75dc4961998-03-05 03:42:00 +0000282 # collect all modules of the program
Guido van Rossum1e074031998-03-05 04:05:38 +0000283 dir = os.path.dirname(scriptfile)
284 path[0] = dir
Guido van Rossum78fc3631998-03-20 17:37:24 +0000285 mf = modulefinder.ModuleFinder(path, debug, exclude)
286
287 if win and subsystem=='service':
288 # If a Windows service, then add the "built-in" module.
289 mod = mf.add_module("servicemanager")
290 mod.__file__="dummy.pyd" # really built-in to the resulting EXE
291
Guido van Rossum75dc4961998-03-05 03:42:00 +0000292 for mod in implicits:
293 mf.import_hook(mod)
294 for mod in modules:
295 if mod == '-m':
296 modargs = 1
297 continue
298 if modargs:
299 if mod[-2:] == '.*':
300 mf.import_hook(mod[:-2], None, ["*"])
301 else:
302 mf.import_hook(mod)
303 else:
304 mf.load_file(mod)
Guido van Rossum78fc3631998-03-20 17:37:24 +0000305
306 # Add the main script as either __main__, or the actual module name.
307 if python_entry_is_main:
308 mf.run_script(scriptfile)
309 else:
310 if modargs:
311 mf.import_hook(scriptfile)
312 else:
313 mf.load_file(scriptfile)
314
Guido van Rossum75dc4961998-03-05 03:42:00 +0000315 if debug > 0:
316 mf.report()
317 print
318 dict = mf.modules
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000319
Guido van Rossum75dc4961998-03-05 03:42:00 +0000320 # generate output for frozen modules
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000321 backup = frozen_c + '~'
322 try:
323 os.rename(frozen_c, backup)
324 except os.error:
325 backup = None
326 outfp = open(frozen_c, 'w')
327 try:
Guido van Rossum78fc3631998-03-20 17:37:24 +0000328 makefreeze.makefreeze(outfp, dict, debug, custom_entry_point)
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000329 finally:
330 outfp.close()
331 if backup:
332 if cmp.cmp(backup, frozen_c):
Guido van Rossume0394251998-03-05 05:39:50 +0000333 sys.stderr.write('%s not changed, not written\n' % frozen_c)
334 os.unlink(frozen_c)
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000335 os.rename(backup, frozen_c)
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000336
Guido van Rossuma0e18351998-03-07 04:51:03 +0000337 # look for unfrozen modules (builtin and of unknown origin)
338 builtins = []
339 unknown = []
340 mods = dict.keys()
341 mods.sort()
342 for mod in mods:
343 if dict[mod].__code__:
344 continue
345 if not dict[mod].__file__:
346 builtins.append(mod)
347 else:
348 unknown.append(mod)
349
350 # search for unknown modules in extensions directories (not on Windows)
351 addfiles = []
Guido van Rossume35c6011998-05-18 20:25:54 +0000352 frozen_extensions = [] # Windows list of modules.
Guido van Rossuma937afd1998-04-23 14:39:24 +0000353 if unknown or (not win and builtins):
Guido van Rossum78fc3631998-03-20 17:37:24 +0000354 if not win:
355 addfiles, addmods = \
Guido van Rossuma937afd1998-04-23 14:39:24 +0000356 checkextensions.checkextensions(unknown+builtins,
357 extensions)
Guido van Rossum78fc3631998-03-20 17:37:24 +0000358 for mod in addmods:
Guido van Rossuma937afd1998-04-23 14:39:24 +0000359 if mod in unknown:
360 unknown.remove(mod)
361 builtins.append(mod)
Guido van Rossum78fc3631998-03-20 17:37:24 +0000362 else:
363 # Do the windows thang...
364 import checkextensions_win32
365 # Get a list of CExtension instances, each describing a module
366 # (including its source files)
Guido van Rossume35c6011998-05-18 20:25:54 +0000367 frozen_extensions = checkextensions_win32.checkextensions(
368 unknown, extensions)
369 for mod in frozen_extensions:
Guido van Rossum78fc3631998-03-20 17:37:24 +0000370 unknown.remove(mod.name)
Guido van Rossuma0e18351998-03-07 04:51:03 +0000371
372 # report unknown modules
373 if unknown:
374 sys.stderr.write('Warning: unknown modules remain: %s\n' %
375 string.join(unknown))
376
Guido van Rossum75dc4961998-03-05 03:42:00 +0000377 # windows gets different treatment
Guido van Rossum58a59481997-08-14 01:45:33 +0000378 if win:
379 # Taking a shortcut here...
Guido van Rossume35c6011998-05-18 20:25:54 +0000380 import winmakemakefile, checkextensions_win32
381 checkextensions_win32.write_extension_table(extensions_c,
382 frozen_extensions)
383 # Create a module definition for the bootstrap C code.
384 xtras = [frozenmain_c, os.path.basename(frozen_c),
385 frozendllmain_c, extensions_c]
386 maindefn = checkextensions_win32.CExtension( '__main__', xtras )
387 frozen_extensions.append( maindefn )
Guido van Rossum58a59481997-08-14 01:45:33 +0000388 outfp = open(makefile, 'w')
389 try:
390 winmakemakefile.makemakefile(outfp,
391 locals(),
Guido van Rossume35c6011998-05-18 20:25:54 +0000392 frozen_extensions,
Guido van Rossum31d53ed1998-03-07 04:08:04 +0000393 os.path.basename(target))
Guido van Rossum58a59481997-08-14 01:45:33 +0000394 finally:
395 outfp.close()
396 return
397
Guido van Rossum75dc4961998-03-05 03:42:00 +0000398 # generate config.c and Makefile
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000399 builtins.sort()
400 infp = open(config_c_in)
401 backup = config_c + '~'
402 try:
403 os.rename(config_c, backup)
404 except os.error:
405 backup = None
406 outfp = open(config_c, 'w')
407 try:
408 makeconfig.makeconfig(infp, outfp, builtins)
409 finally:
410 outfp.close()
411 infp.close()
412 if backup:
413 if cmp.cmp(backup, config_c):
Guido van Rossume0394251998-03-05 05:39:50 +0000414 sys.stderr.write('%s not changed, not written\n' % config_c)
415 os.unlink(config_c)
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000416 os.rename(backup, config_c)
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000417
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000418 cflags = defines + includes + ['$(OPT)']
419 libs = [os.path.join(binlib, 'libpython$(VERSION).a')]
Guido van Rossum00ff4331994-10-03 16:33:08 +0000420
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000421 somevars = {}
Guido van Rossum345df171997-11-22 22:10:01 +0000422 if os.path.exists(makefile_in):
423 makevars = parsesetup.getmakevars(makefile_in)
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000424 for key in makevars.keys():
425 somevars[key] = makevars[key]
Guido van Rossum00ff4331994-10-03 16:33:08 +0000426
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000427 somevars['CFLAGS'] = string.join(cflags) # override
428 files = ['$(OPT)', '$(LDFLAGS)', base_config_c, base_frozen_c] + \
429 supp_sources + addfiles + libs + \
430 ['$(MODLIBS)', '$(LIBS)', '$(SYSLIBS)']
Guido van Rossum00ff4331994-10-03 16:33:08 +0000431
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000432 backup = makefile + '~'
Guido van Rossume0394251998-03-05 05:39:50 +0000433 if os.path.exists(makefile):
434 try:
435 os.unlink(backup)
436 except os.error:
437 pass
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000438 try:
439 os.rename(makefile, backup)
440 except os.error:
441 backup = None
442 outfp = open(makefile, 'w')
443 try:
444 makemakefile.makemakefile(outfp, somevars, files, base_target)
445 finally:
446 outfp.close()
447 if backup:
448 if not cmp.cmp(backup, makefile):
449 print 'previous Makefile saved as', backup
450 else:
Guido van Rossume0394251998-03-05 05:39:50 +0000451 sys.stderr.write('%s not changed, not written\n' % makefile)
452 os.unlink(makefile)
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000453 os.rename(backup, makefile)
454
455 # Done!
456
457 if odir:
458 print 'Now run "make" in', odir,
459 print 'to build the target:', base_target
460 else:
461 print 'Now run "make" to build the target:', base_target
Guido van Rossum00ff4331994-10-03 16:33:08 +0000462
Guido van Rossumd8336c21994-10-05 16:13:01 +0000463
464# Print usage message and exit
465
Guido van Rossum9a6e8551997-08-10 16:47:17 +0000466def usage(msg):
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000467 sys.stdout = sys.stderr
468 print "Error:", msg
469 print "Use ``%s -h'' for help" % sys.argv[0]
470 sys.exit(2)
Guido van Rossumd8336c21994-10-05 16:13:01 +0000471
472
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000473main()