From 58a594829c116ef118ff47a7c4079a9efd1dad03 Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Thu, 14 Aug 1997 01:45:33 +0000
Subject: Changes for building under windows.

---
 Tools/freeze/freeze.py          | 51 +++++++++++++++++++++++++++++++++--------
 Tools/freeze/winmakemakefile.py | 45 ++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+), 9 deletions(-)
 create mode 100644 Tools/freeze/winmakemakefile.py

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:
-- 
cgit v0.12

