diff options
-rwxr-xr-x | Tools/freeze/freeze.py | 51 | ||||
-rw-r--r-- | Tools/freeze/winmakemakefile.py | 45 |
2 files changed, 87 insertions, 9 deletions
diff --git a/Tools/freeze/freeze.py b/Tools/freeze/freeze.py index 5e74c67..58bfecb 100755 --- a/Tools/freeze/freeze.py +++ b/Tools/freeze/freeze.py @@ -28,6 +28,13 @@ Options: -h: Print this help message. +-w: Toggle Windows (NT or 95) behavior. + (For debugging only -- on a win32 platform, win32 behaviour + is automatic.) + +-s subsystem: Specify the subsystem; 'windows' or 'console' (default). + (For Windows only.) + Arguments: script.py: The Python script to be executed by the resulting binary. @@ -76,16 +83,18 @@ def main(): extensions = [] path = sys.path odir = '' + win = sys.platform[:3] == 'win' # output files frozen_c = 'frozen.c' config_c = 'config.c' target = 'a.out' # normally derived from script name makefile = 'Makefile' + subsystem = 'console' # parse command line try: - opts, args = getopt.getopt(sys.argv[1:], 'he:o:p:P:') + opts, args = getopt.getopt(sys.argv[1:], 'he:o:p:P:s:w') except getopt.error, msg: usage('getopt error: ' + str(msg)) @@ -102,6 +111,12 @@ def main(): prefix = a if o == '-P': exec_prefix = a + if o == '-w': + win = not win + if o == '-s': + if not win: + usage("-s subsystem option only on Windows") + subsystem = a # default prefix and exec_prefix if not exec_prefix: @@ -122,7 +137,7 @@ def main(): binlib = exec_prefix incldir = os.path.join(prefix, 'Include') config_c_in = os.path.join(prefix, 'Modules', 'config.c.in') - frozenmain_c = os.path.join(prefix, 'Modules', 'frozenmain.c') + frozenmain_c = os.path.join(prefix, 'Python', 'frozenmain.c') makefile_in = os.path.join(exec_prefix, 'Modules', 'Makefile') else: binlib = os.path.join(exec_prefix, @@ -141,17 +156,22 @@ def main(): usage('needed directory %s not found' % dir) if not os.path.isdir(dir): usage('%s: not a directory' % dir) - for file in [config_c_in, makefile_in] + supp_sources: + if win: + files = supp_sources + else: + files = [config_c_in, makefile_in] + supp_sources + for file in supp_sources: 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) - 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) + 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) # check that enough arguments are passed if not args: @@ -222,6 +242,19 @@ def main(): frozen_c) os.rename(backup, frozen_c) + if win: + # Taking a shortcut here... + import winmakemakefile + outfp = open(makefile, 'w') + try: + winmakemakefile.makemakefile(outfp, + locals(), + [frozenmain_c, frozen_c], + target) + finally: + outfp.close() + return + builtins = [] unknown = [] mods = dict.keys() diff --git a/Tools/freeze/winmakemakefile.py b/Tools/freeze/winmakemakefile.py new file mode 100644 index 0000000..66c33e8 --- /dev/null +++ b/Tools/freeze/winmakemakefile.py @@ -0,0 +1,45 @@ +import sys, os, string + +def makemakefile(outfp, vars, files, target): + save = sys.stdout + try: + sys.stdout = outfp + realwork(vars, files, target) + finally: + sys.stdout = save + +def realwork(vars, files, target): + print "# Makefile for Windows (NT or 95) generated by freeze.py script" + print + print "target =", target + print "pythonhome =", vars['prefix'] + print "pythonlib =", vars['exec_prefix'] + "/pcbuild/release/python15.lib" + print "subsystem =", vars['subsystem'] + print + print "all: $(target).exe" + print + + objects = [] + for file in files: + base = os.path.basename(file) + base, ext = os.path.splitext(base) + objects.append(base + ".obj") + print "%s.obj: %s" % (base, file) + print "\t$(CC) -c $(cdl)", + print "-I$(pythonhome)/Include -I$(pythonhome)/PC \\" + print "\t\t$(cflags) $(cdebug) $(cinclude) \\" + print "\t\t", file + print + + print "$(target).exe:", + for obj in objects: print obj, + print + print "\tlink -out:$(target).exe", + for obj in objects: print obj, + print "\\" + print "\t\t$(pythonlib) $(lcustom) shell32.lib comdlg32.lib wsock32.lib \\" + print "\t\t-subsystem:$(subsystem) $(resources)" + +# Local Variables: +# indent-tabs-mode: nil +# End: |