summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xTools/freeze/freeze.py51
-rw-r--r--Tools/freeze/winmakemakefile.py45
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: