blob: dbca9639a1c181c9818009fc5302a3164b506063 [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 Rossum00ff4331994-10-03 16:33:08 +0000120
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000121 # parse command line
122 try:
Guido van Rossume35c6011998-05-18 20:25:54 +0000123 opts, args = getopt.getopt(sys.argv[1:], 'a:de:hmo:p:P:qs:wx:l:')
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000124 except getopt.error, msg:
125 usage('getopt error: ' + str(msg))
Guido van Rossum00ff4331994-10-03 16:33:08 +0000126
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000127 # proces option arguments
128 for o, a in opts:
129 if o == '-h':
130 print __doc__
131 return
Guido van Rossum75dc4961998-03-05 03:42:00 +0000132 if o == '-d':
133 debug = debug + 1
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000134 if o == '-e':
135 extensions.append(a)
Guido van Rossum75dc4961998-03-05 03:42:00 +0000136 if o == '-m':
137 modargs = 1
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000138 if o == '-o':
139 odir = a
140 if o == '-p':
141 prefix = a
142 if o == '-P':
143 exec_prefix = a
Guido van Rossum75dc4961998-03-05 03:42:00 +0000144 if o == '-q':
145 debug = 0
Guido van Rossum58a59481997-08-14 01:45:33 +0000146 if o == '-w':
147 win = not win
148 if o == '-s':
149 if not win:
150 usage("-s subsystem option only on Windows")
151 subsystem = a
Guido van Rossum78fc3631998-03-20 17:37:24 +0000152 if o == '-x':
153 exclude.append(a)
154 if o == '-l':
155 addn_link.append(a)
Guido van Rossume35c6011998-05-18 20:25:54 +0000156 if o == '-a':
157 apply(modulefinder.AddPackagePath, tuple(string.split(a,"=", 2)))
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000158
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000159 # default prefix and exec_prefix
160 if not exec_prefix:
161 if prefix:
162 exec_prefix = prefix
163 else:
164 exec_prefix = sys.exec_prefix
165 if not prefix:
166 prefix = sys.prefix
Guido van Rossum9a6e8551997-08-10 16:47:17 +0000167
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000168 # determine whether -p points to the Python source tree
Guido van Rossume0394251998-03-05 05:39:50 +0000169 ishome = os.path.exists(os.path.join(prefix, 'Python', 'ceval.c'))
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000170
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000171 # locations derived from options
172 version = sys.version[:3]
Guido van Rossum5e32a771998-07-07 22:47:38 +0000173 if win:
174 extensions_c = 'frozen_extensions.c'
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000175 if ishome:
176 print "(Using Python source directory)"
177 binlib = exec_prefix
178 incldir = os.path.join(prefix, 'Include')
Guido van Rossum590fc2c1998-06-12 14:09:03 +0000179 config_h_dir = exec_prefix
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000180 config_c_in = os.path.join(prefix, 'Modules', 'config.c.in')
Guido van Rossum58a59481997-08-14 01:45:33 +0000181 frozenmain_c = os.path.join(prefix, 'Python', 'frozenmain.c')
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000182 makefile_in = os.path.join(exec_prefix, 'Modules', 'Makefile')
Guido van Rossume35c6011998-05-18 20:25:54 +0000183 if win:
184 frozendllmain_c = os.path.join(exec_prefix, 'Pc\\frozen_dllmain.c')
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000185 else:
186 binlib = os.path.join(exec_prefix,
187 'lib', 'python%s' % version, 'config')
188 incldir = os.path.join(prefix, 'include', 'python%s' % version)
Guido van Rossum590fc2c1998-06-12 14:09:03 +0000189 config_h_dir = os.path.join(exec_prefix, 'include',
190 'python%s' % version)
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000191 config_c_in = os.path.join(binlib, 'config.c.in')
192 frozenmain_c = os.path.join(binlib, 'frozenmain.c')
193 makefile_in = os.path.join(binlib, 'Makefile')
Guido van Rossum5e32a771998-07-07 22:47:38 +0000194 frozendllmain_c = os.path.join(binlib, 'frozen_dllmain.c')
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000195 supp_sources = []
196 defines = []
Guido van Rossum590fc2c1998-06-12 14:09:03 +0000197 includes = ['-I' + incldir, '-I' + config_h_dir]
Guido van Rossumd8336c21994-10-05 16:13:01 +0000198
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000199 # sanity check of directories and files
200 for dir in [prefix, exec_prefix, binlib, incldir] + extensions:
201 if not os.path.exists(dir):
202 usage('needed directory %s not found' % dir)
203 if not os.path.isdir(dir):
204 usage('%s: not a directory' % dir)
Guido van Rossum58a59481997-08-14 01:45:33 +0000205 if win:
206 files = supp_sources
207 else:
208 files = [config_c_in, makefile_in] + supp_sources
209 for file in supp_sources:
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000210 if not os.path.exists(file):
211 usage('needed file %s not found' % file)
212 if not os.path.isfile(file):
213 usage('%s: not a plain file' % file)
Guido van Rossum58a59481997-08-14 01:45:33 +0000214 if not win:
215 for dir in extensions:
216 setup = os.path.join(dir, 'Setup')
217 if not os.path.exists(setup):
218 usage('needed file %s not found' % setup)
219 if not os.path.isfile(setup):
220 usage('%s: not a plain file' % setup)
Guido van Rossum00ff4331994-10-03 16:33:08 +0000221
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000222 # check that enough arguments are passed
223 if not args:
224 usage('at least one filename argument required')
Guido van Rossumd4cc04c1996-06-17 17:49:13 +0000225
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000226 # check that file arguments exist
227 for arg in args:
Guido van Rossum1e074031998-03-05 04:05:38 +0000228 if arg == '-m':
229 break
Guido van Rossum78fc3631998-03-20 17:37:24 +0000230 # if user specified -m on the command line before _any_
231 # file names, then nothing should be checked (as the
232 # very first file should be a module name)
233 if modargs:
234 break
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000235 if not os.path.exists(arg):
236 usage('argument %s not found' % arg)
237 if not os.path.isfile(arg):
238 usage('%s: not a plain file' % arg)
Guido van Rossum00ff4331994-10-03 16:33:08 +0000239
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000240 # process non-option arguments
241 scriptfile = args[0]
242 modules = args[1:]
Guido van Rossum00ff4331994-10-03 16:33:08 +0000243
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000244 # derive target name from script name
245 base = os.path.basename(scriptfile)
246 base, ext = os.path.splitext(base)
247 if base:
248 if base != scriptfile:
249 target = base
250 else:
251 target = base + '.bin'
Guido van Rossum00ff4331994-10-03 16:33:08 +0000252
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000253 # handle -o option
254 base_frozen_c = frozen_c
255 base_config_c = config_c
256 base_target = target
257 if odir and not os.path.isdir(odir):
258 try:
259 os.mkdir(odir)
260 print "Created output directory", odir
261 except os.error, msg:
262 usage('%s: mkdir failed (%s)' % (odir, str(msg)))
263 if odir:
264 frozen_c = os.path.join(odir, frozen_c)
265 config_c = os.path.join(odir, config_c)
266 target = os.path.join(odir, target)
267 makefile = os.path.join(odir, makefile)
Guido van Rossume35c6011998-05-18 20:25:54 +0000268 if win: extensions_c = os.path.join(odir, extensions_c)
Guido van Rossum00ff4331994-10-03 16:33:08 +0000269
Guido van Rossum78fc3631998-03-20 17:37:24 +0000270 # Handle special entry point requirements
271 # (on Windows, some frozen programs do not use __main__, but
272 # import the module directly. Eg, DLLs, Services, etc
273 custom_entry_point = None # Currently only used on Windows
274 python_entry_is_main = 1 # Is the entry point called __main__?
275 # handle -s option on Windows
276 if win:
277 import winmakemakefile
278 try:
Guido van Rossume35c6011998-05-18 20:25:54 +0000279 custom_entry_point, python_entry_is_main = \
280 winmakemakefile.get_custom_entry_point(subsystem)
Guido van Rossum78fc3631998-03-20 17:37:24 +0000281 except ValueError, why:
282 usage(why)
283
284
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000285 # Actual work starts here...
Guido van Rossumd8336c21994-10-05 16:13:01 +0000286
Guido van Rossum75dc4961998-03-05 03:42:00 +0000287 # collect all modules of the program
Guido van Rossum1e074031998-03-05 04:05:38 +0000288 dir = os.path.dirname(scriptfile)
289 path[0] = dir
Guido van Rossum78fc3631998-03-20 17:37:24 +0000290 mf = modulefinder.ModuleFinder(path, debug, exclude)
291
292 if win and subsystem=='service':
293 # If a Windows service, then add the "built-in" module.
294 mod = mf.add_module("servicemanager")
295 mod.__file__="dummy.pyd" # really built-in to the resulting EXE
296
Guido van Rossum75dc4961998-03-05 03:42:00 +0000297 for mod in implicits:
298 mf.import_hook(mod)
299 for mod in modules:
300 if mod == '-m':
301 modargs = 1
302 continue
303 if modargs:
304 if mod[-2:] == '.*':
305 mf.import_hook(mod[:-2], None, ["*"])
306 else:
307 mf.import_hook(mod)
308 else:
309 mf.load_file(mod)
Guido van Rossum78fc3631998-03-20 17:37:24 +0000310
311 # Add the main script as either __main__, or the actual module name.
312 if python_entry_is_main:
313 mf.run_script(scriptfile)
314 else:
315 if modargs:
316 mf.import_hook(scriptfile)
317 else:
318 mf.load_file(scriptfile)
319
Guido van Rossum75dc4961998-03-05 03:42:00 +0000320 if debug > 0:
321 mf.report()
322 print
323 dict = mf.modules
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000324
Guido van Rossum75dc4961998-03-05 03:42:00 +0000325 # generate output for frozen modules
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000326 backup = frozen_c + '~'
327 try:
328 os.rename(frozen_c, backup)
329 except os.error:
330 backup = None
331 outfp = open(frozen_c, 'w')
332 try:
Guido van Rossum78fc3631998-03-20 17:37:24 +0000333 makefreeze.makefreeze(outfp, dict, debug, custom_entry_point)
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000334 finally:
335 outfp.close()
336 if backup:
337 if cmp.cmp(backup, frozen_c):
Guido van Rossume0394251998-03-05 05:39:50 +0000338 sys.stderr.write('%s not changed, not written\n' % frozen_c)
339 os.unlink(frozen_c)
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000340 os.rename(backup, frozen_c)
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000341
Guido van Rossuma0e18351998-03-07 04:51:03 +0000342 # look for unfrozen modules (builtin and of unknown origin)
343 builtins = []
344 unknown = []
345 mods = dict.keys()
346 mods.sort()
347 for mod in mods:
348 if dict[mod].__code__:
349 continue
350 if not dict[mod].__file__:
351 builtins.append(mod)
352 else:
353 unknown.append(mod)
354
355 # search for unknown modules in extensions directories (not on Windows)
356 addfiles = []
Guido van Rossume35c6011998-05-18 20:25:54 +0000357 frozen_extensions = [] # Windows list of modules.
Guido van Rossuma937afd1998-04-23 14:39:24 +0000358 if unknown or (not win and builtins):
Guido van Rossum78fc3631998-03-20 17:37:24 +0000359 if not win:
360 addfiles, addmods = \
Guido van Rossuma937afd1998-04-23 14:39:24 +0000361 checkextensions.checkextensions(unknown+builtins,
362 extensions)
Guido van Rossum78fc3631998-03-20 17:37:24 +0000363 for mod in addmods:
Guido van Rossuma937afd1998-04-23 14:39:24 +0000364 if mod in unknown:
365 unknown.remove(mod)
366 builtins.append(mod)
Guido van Rossum78fc3631998-03-20 17:37:24 +0000367 else:
368 # Do the windows thang...
369 import checkextensions_win32
370 # Get a list of CExtension instances, each describing a module
371 # (including its source files)
Guido van Rossume35c6011998-05-18 20:25:54 +0000372 frozen_extensions = checkextensions_win32.checkextensions(
373 unknown, extensions)
374 for mod in frozen_extensions:
Guido van Rossum78fc3631998-03-20 17:37:24 +0000375 unknown.remove(mod.name)
Guido van Rossuma0e18351998-03-07 04:51:03 +0000376
377 # report unknown modules
378 if unknown:
379 sys.stderr.write('Warning: unknown modules remain: %s\n' %
380 string.join(unknown))
381
Guido van Rossum75dc4961998-03-05 03:42:00 +0000382 # windows gets different treatment
Guido van Rossum58a59481997-08-14 01:45:33 +0000383 if win:
384 # Taking a shortcut here...
Guido van Rossume35c6011998-05-18 20:25:54 +0000385 import winmakemakefile, checkextensions_win32
386 checkextensions_win32.write_extension_table(extensions_c,
387 frozen_extensions)
388 # Create a module definition for the bootstrap C code.
389 xtras = [frozenmain_c, os.path.basename(frozen_c),
390 frozendllmain_c, extensions_c]
391 maindefn = checkextensions_win32.CExtension( '__main__', xtras )
392 frozen_extensions.append( maindefn )
Guido van Rossum58a59481997-08-14 01:45:33 +0000393 outfp = open(makefile, 'w')
394 try:
395 winmakemakefile.makemakefile(outfp,
396 locals(),
Guido van Rossume35c6011998-05-18 20:25:54 +0000397 frozen_extensions,
Guido van Rossum31d53ed1998-03-07 04:08:04 +0000398 os.path.basename(target))
Guido van Rossum58a59481997-08-14 01:45:33 +0000399 finally:
400 outfp.close()
401 return
402
Guido van Rossum75dc4961998-03-05 03:42:00 +0000403 # generate config.c and Makefile
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000404 builtins.sort()
405 infp = open(config_c_in)
406 backup = config_c + '~'
407 try:
408 os.rename(config_c, backup)
409 except os.error:
410 backup = None
411 outfp = open(config_c, 'w')
412 try:
413 makeconfig.makeconfig(infp, outfp, builtins)
414 finally:
415 outfp.close()
416 infp.close()
417 if backup:
418 if cmp.cmp(backup, config_c):
Guido van Rossume0394251998-03-05 05:39:50 +0000419 sys.stderr.write('%s not changed, not written\n' % config_c)
420 os.unlink(config_c)
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000421 os.rename(backup, config_c)
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000422
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000423 cflags = defines + includes + ['$(OPT)']
424 libs = [os.path.join(binlib, 'libpython$(VERSION).a')]
Guido van Rossum00ff4331994-10-03 16:33:08 +0000425
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000426 somevars = {}
Guido van Rossum345df171997-11-22 22:10:01 +0000427 if os.path.exists(makefile_in):
428 makevars = parsesetup.getmakevars(makefile_in)
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000429 for key in makevars.keys():
430 somevars[key] = makevars[key]
Guido van Rossum00ff4331994-10-03 16:33:08 +0000431
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000432 somevars['CFLAGS'] = string.join(cflags) # override
433 files = ['$(OPT)', '$(LDFLAGS)', base_config_c, base_frozen_c] + \
434 supp_sources + addfiles + libs + \
435 ['$(MODLIBS)', '$(LIBS)', '$(SYSLIBS)']
Guido van Rossum00ff4331994-10-03 16:33:08 +0000436
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000437 backup = makefile + '~'
Guido van Rossume0394251998-03-05 05:39:50 +0000438 if os.path.exists(makefile):
439 try:
440 os.unlink(backup)
441 except os.error:
442 pass
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000443 try:
444 os.rename(makefile, backup)
445 except os.error:
446 backup = None
447 outfp = open(makefile, 'w')
448 try:
449 makemakefile.makemakefile(outfp, somevars, files, base_target)
450 finally:
451 outfp.close()
452 if backup:
453 if not cmp.cmp(backup, makefile):
454 print 'previous Makefile saved as', backup
455 else:
Guido van Rossume0394251998-03-05 05:39:50 +0000456 sys.stderr.write('%s not changed, not written\n' % makefile)
457 os.unlink(makefile)
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000458 os.rename(backup, makefile)
459
460 # Done!
461
462 if odir:
463 print 'Now run "make" in', odir,
464 print 'to build the target:', base_target
465 else:
466 print 'Now run "make" to build the target:', base_target
Guido van Rossum00ff4331994-10-03 16:33:08 +0000467
Guido van Rossumd8336c21994-10-05 16:13:01 +0000468
469# Print usage message and exit
470
Guido van Rossum9a6e8551997-08-10 16:47:17 +0000471def usage(msg):
Guido van Rossum0b4b8a21997-08-10 16:56:48 +0000472 sys.stdout = sys.stderr
473 print "Error:", msg
474 print "Use ``%s -h'' for help" % sys.argv[0]
475 sys.exit(2)
Guido van Rossumd8336c21994-10-05 16:13:01 +0000476
477
Guido van Rossumdbaf3321994-10-03 10:25:54 +0000478main()