[Python-checkins] r62197 - in python/trunk: Doc/distutils/builtdist.rst Lib/distutils/command/bdist.py Lib/distutils/command/bdist_msi.py Lib/distutils/command/bdist_wininst.py Lib/distutils/command/build.py Lib/distutils/command/build_ext.py Lib/distutils/command/install.py Lib/distutils/command/wininst-9.0-amd64.exe Lib/distutils/msvc9compiler.py Lib/distutils/msvccompiler.py Lib/distutils/util.py Misc/NEWS PC/example_nt/readme.txt PC/example_nt/setup.py PCbuild/bdist_wininst.vcproj PCbuild/pcbuild.sln

mark.hammond python-checkins at python.org
Mon Apr 7 03:53:40 CEST 2008


Author: mark.hammond
Date: Mon Apr  7 03:53:39 2008
New Revision: 62197

Added:
   python/trunk/Lib/distutils/command/wininst-9.0-amd64.exe   (contents, props changed)
   python/trunk/PC/example_nt/setup.py   (contents, props changed)
Modified:
   python/trunk/Doc/distutils/builtdist.rst
   python/trunk/Lib/distutils/command/bdist.py
   python/trunk/Lib/distutils/command/bdist_msi.py
   python/trunk/Lib/distutils/command/bdist_wininst.py
   python/trunk/Lib/distutils/command/build.py
   python/trunk/Lib/distutils/command/build_ext.py
   python/trunk/Lib/distutils/command/install.py
   python/trunk/Lib/distutils/msvc9compiler.py
   python/trunk/Lib/distutils/msvccompiler.py
   python/trunk/Lib/distutils/util.py
   python/trunk/Misc/NEWS
   python/trunk/PC/example_nt/readme.txt
   python/trunk/PCbuild/bdist_wininst.vcproj
   python/trunk/PCbuild/pcbuild.sln
Log:
Issue #2513: enable 64bit cross compilation on windows.


Modified: python/trunk/Doc/distutils/builtdist.rst
==============================================================================
--- python/trunk/Doc/distutils/builtdist.rst	(original)
+++ python/trunk/Doc/distutils/builtdist.rst	Mon Apr  7 03:53:39 2008
@@ -329,6 +329,42 @@
 The installer file will be written to the "distribution directory" --- normally
 :file:`dist/`, but customizable with the :option:`--dist-dir` option.
 
+.. _cross-compile-windows:
+
+Cross-compiling on Windows
+=====================
+
+Starting with Python 2.6, distutils is capable of cross-compiling between 
+Windows platforms.  In practice, this means that with the correct tools 
+installed, you can use a 32bit version of Windows to create 64bit extensions
+and vice-versa.
+
+To build for an alternate platform, specify the :option:`--plat-name` option 
+to the build command.  Valid values are currently 'win32', 'win-amd64' and 
+'win-ia64'.  For example, on a 32bit version of Windows, you could execute::
+
+   python setup.py build --plat-name=win-amd64
+
+to build a 64bit version of your extension.  The Windows Installers also 
+support this option, so the command::
+
+   python setup.py build --plat-name=win-amd64 bdist_wininst
+
+would create a 64bit installation executable on your 32bit version of Windows.
+
+To cross-compile, you must download the Python source code and cross-compile 
+Python itself for the platform you are targetting - it is not possible from a
+binary installtion of Python (as the .lib etc file for other platforms are
+not included.)  In practice, this means the user of a 32 bit operating 
+system will need to use Visual Studio 2008 to open the 
+:file:`PCBuild/PCbuild.sln` solution in the Python source tree and build the 
+"x64" configuration of the 'pythoncore' project before cross-compiling 
+extensions is possible.
+
+Note that by default, Visual Studio 2008 does not install 64bit compilers or
+tools.  You may need to reexecute the Visual Studio setup process and select
+these tools (using Control Panel->[Add/Remove] Programs is a convenient way to
+check or modify your existing install.)
 
 .. _postinstallation-script:
 

Modified: python/trunk/Lib/distutils/command/bdist.py
==============================================================================
--- python/trunk/Lib/distutils/command/bdist.py	(original)
+++ python/trunk/Lib/distutils/command/bdist.py	Mon Apr  7 03:53:39 2008
@@ -97,7 +97,10 @@
     def finalize_options (self):
         # have to finalize 'plat_name' before 'bdist_base'
         if self.plat_name is None:
-            self.plat_name = get_platform()
+            if self.skip_build:
+                self.plat_name = get_platform()
+            else:
+                self.plat_name = self.get_finalized_command('build').plat_name
 
         # 'bdist_base' -- parent of per-built-distribution-format
         # temporary directories (eg. we'll probably have
@@ -121,7 +124,6 @@
 
     # finalize_options()
 
-
     def run (self):
 
         # Figure out which sub-commands we need to run.

Modified: python/trunk/Lib/distutils/command/bdist_msi.py
==============================================================================
--- python/trunk/Lib/distutils/command/bdist_msi.py	(original)
+++ python/trunk/Lib/distutils/command/bdist_msi.py	Mon Apr  7 03:53:39 2008
@@ -9,11 +9,11 @@
 
 import sys, os
 from distutils.core import Command
-from distutils.util import get_platform
 from distutils.dir_util import remove_tree
 from distutils.sysconfig import get_python_version
 from distutils.version import StrictVersion
 from distutils.errors import DistutilsOptionError
+from distutils.util import get_platform
 from distutils import log
 import msilib
 from msilib import schema, sequence, text
@@ -87,6 +87,9 @@
 
     user_options = [('bdist-dir=', None,
                      "temporary directory for creating the distribution"),
+                    ('plat-name=', 'p',
+                     "platform name to embed in generated filenames "
+                     "(default: %s)" % get_platform()),
                     ('keep-temp', 'k',
                      "keep the pseudo-installation tree around after " +
                      "creating the distribution archive"),
@@ -116,6 +119,7 @@
 
     def initialize_options (self):
         self.bdist_dir = None
+        self.plat_name = None
         self.keep_temp = 0
         self.no_target_compile = 0
         self.no_target_optimize = 0
@@ -139,7 +143,10 @@
         else:
             self.target_version = short_version
 
-        self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))
+        self.set_undefined_options('bdist',
+                                   ('dist_dir', 'dist_dir'),
+                                   ('plat_name', 'plat_name'),
+                                   )
 
         if self.pre_install_script:
             raise DistutilsOptionError, "the pre-install-script feature is not yet implemented"
@@ -181,7 +188,7 @@
             if not target_version:
                 assert self.skip_build, "Should have already checked this"
                 target_version = sys.version[0:3]
-            plat_specifier = ".%s-%s" % (get_platform(), target_version)
+            plat_specifier = ".%s-%s" % (self.plat_name, target_version)
             build = self.get_finalized_command('build')
             build.build_lib = os.path.join(build.build_base,
                                            'lib' + plat_specifier)
@@ -633,8 +640,7 @@
 
     def get_installer_filename(self, fullname):
         # Factored out to allow overriding in subclasses
-        plat = get_platform()
-        installer_name = os.path.join(self.dist_dir,
-                                      "%s.%s-py%s.msi" %
-                                       (fullname, plat, self.target_version))
+        base_name = "%s.%s-py%s.msi" % (fullname, self.plat_name,
+                                        self.target_version)
+        installer_name = os.path.join(self.dist_dir, base_name)
         return installer_name

Modified: python/trunk/Lib/distutils/command/bdist_wininst.py
==============================================================================
--- python/trunk/Lib/distutils/command/bdist_wininst.py	(original)
+++ python/trunk/Lib/distutils/command/bdist_wininst.py	Mon Apr  7 03:53:39 2008
@@ -21,6 +21,9 @@
 
     user_options = [('bdist-dir=', None,
                      "temporary directory for creating the distribution"),
+                    ('plat-name=', 'p',
+                     "platform name to embed in generated filenames "
+                     "(default: %s)" % get_platform()),
                     ('keep-temp', 'k',
                      "keep the pseudo-installation tree around after " +
                      "creating the distribution archive"),
@@ -54,6 +57,7 @@
 
     def initialize_options (self):
         self.bdist_dir = None
+        self.plat_name = None
         self.keep_temp = 0
         self.no_target_compile = 0
         self.no_target_optimize = 0
@@ -82,7 +86,10 @@
                       " option must be specified" % (short_version,)
             self.target_version = short_version
 
-        self.set_undefined_options('bdist', ('dist_dir', 'dist_dir'))
+        self.set_undefined_options('bdist',
+                                   ('dist_dir', 'dist_dir'),
+                                   ('plat_name', 'plat_name'),
+                                  )
 
         if self.install_script:
             for script in self.distribution.scripts:
@@ -110,6 +117,7 @@
         install.root = self.bdist_dir
         install.skip_build = self.skip_build
         install.warn_dir = 0
+        install.plat_name = self.plat_name
 
         install_lib = self.reinitialize_command('install_lib')
         # we do not want to include pyc or pyo files
@@ -127,7 +135,7 @@
             if not target_version:
                 assert self.skip_build, "Should have already checked this"
                 target_version = sys.version[0:3]
-            plat_specifier = ".%s-%s" % (get_platform(), target_version)
+            plat_specifier = ".%s-%s" % (self.plat_name, target_version)
             build = self.get_finalized_command('build')
             build.build_lib = os.path.join(build.build_base,
                                            'lib' + plat_specifier)
@@ -285,11 +293,11 @@
             # if we create an installer for a specific python version,
             # it's better to include this in the name
             installer_name = os.path.join(self.dist_dir,
-                                          "%s.win32-py%s.exe" %
-                                           (fullname, self.target_version))
+                                          "%s.%s-py%s.exe" %
+                                           (fullname, self.plat_name, self.target_version))
         else:
             installer_name = os.path.join(self.dist_dir,
-                                          "%s.win32.exe" % fullname)
+                                          "%s.%s.exe" % (fullname, self.plat_name))
         return installer_name
     # get_installer_filename()
 
@@ -312,9 +320,9 @@
                 bv = get_build_version()
             else:
                 if self.target_version < "2.4":
-                    bv = "6"
+                    bv = 6.0
                 else:
-                    bv = "7.1"
+                    bv = 7.1
         else:
             # for current version - use authoritative check.
             bv = get_build_version()
@@ -323,6 +331,10 @@
         directory = os.path.dirname(__file__)
         # we must use a wininst-x.y.exe built with the same C compiler
         # used for python.  XXX What about mingw, borland, and so on?
-        filename = os.path.join(directory, "wininst-%.1f.exe" % bv)
+        if self.plat_name == 'win32':
+            sfix = ''
+        else:
+            sfix = self.plat_name[3:] # strip 'win' - leaves eg '-amd64'
+        filename = os.path.join(directory, "wininst-%.1f%s.exe" % (bv, sfix))
         return open(filename, "rb").read()
 # class bdist_wininst

Modified: python/trunk/Lib/distutils/command/build.py
==============================================================================
--- python/trunk/Lib/distutils/command/build.py	(original)
+++ python/trunk/Lib/distutils/command/build.py	Mon Apr  7 03:53:39 2008
@@ -8,6 +8,7 @@
 
 import sys, os
 from distutils.core import Command
+from distutils.errors import DistutilsOptionError
 from distutils.util import get_platform
 
 
@@ -34,6 +35,9 @@
          "build directory for scripts"),
         ('build-temp=', 't',
          "temporary build directory"),
+        ('plat-name=', 'p',
+         "platform name to build for, if supported "
+         "(default: %s)" % get_platform()),
         ('compiler=', 'c',
          "specify the compiler type"),
         ('debug', 'g',
@@ -61,13 +65,25 @@
         self.build_temp = None
         self.build_scripts = None
         self.compiler = None
+        self.plat_name = None
         self.debug = None
         self.force = 0
         self.executable = None
 
     def finalize_options (self):
 
-        plat_specifier = ".%s-%s" % (get_platform(), sys.version[0:3])
+        if self.plat_name is None:
+            self.plat_name = get_platform()
+        else:
+            # plat-name only supported for windows (other platforms are
+            # supported via ./configure flags, if at all).  Avoid misleading
+            # other platforms.
+            if os.name != 'nt':
+                raise DistutilsOptionError(
+                            "--plat-name only supported on Windows (try "
+                            "using './configure --help' on your platform)")
+
+        plat_specifier = ".%s-%s" % (self.plat_name, sys.version[0:3])
 
         # Make it so Python 2.x and Python 2.x with --with-pydebug don't
         # share the same build directories. Doing so confuses the build

Modified: python/trunk/Lib/distutils/command/build_ext.py
==============================================================================
--- python/trunk/Lib/distutils/command/build_ext.py	(original)
+++ python/trunk/Lib/distutils/command/build_ext.py	Mon Apr  7 03:53:39 2008
@@ -15,6 +15,7 @@
 from distutils.sysconfig import customize_compiler, get_python_version
 from distutils.dep_util import newer_group
 from distutils.extension import Extension
+from distutils.util import get_platform
 from distutils import log
 
 if os.name == 'nt':
@@ -60,6 +61,9 @@
          "directory for compiled extension modules"),
         ('build-temp=', 't',
          "directory for temporary files (build by-products)"),
+        ('plat-name=', 'p',
+         "platform name to cross-compile for, if supported "
+         "(default: %s)" % get_platform()),
         ('inplace', 'i',
          "ignore build-lib and put compiled extensions into the source " +
          "directory alongside your pure Python modules"),
@@ -101,6 +105,7 @@
     def initialize_options (self):
         self.extensions = None
         self.build_lib = None
+        self.plat_name = None
         self.build_temp = None
         self.inplace = 0
         self.package = None
@@ -127,7 +132,9 @@
                                    ('build_temp', 'build_temp'),
                                    ('compiler', 'compiler'),
                                    ('debug', 'debug'),
-                                   ('force', 'force'))
+                                   ('force', 'force'),
+                                   ('plat_name', 'plat_name'),
+                                   )
 
         if self.package is None:
             self.package = self.distribution.ext_package
@@ -171,6 +178,9 @@
         # for Release and Debug builds.
         # also Python's library directory must be appended to library_dirs
         if os.name == 'nt':
+            # the 'libs' directory is for binary installs - we assume that
+            # must be the *native* platform.  But we don't really support
+            # cross-compiling via a binary install anyway, so we let it go.
             self.library_dirs.append(os.path.join(sys.exec_prefix, 'libs'))
             if self.debug:
                 self.build_temp = os.path.join(self.build_temp, "Debug")
@@ -181,8 +191,17 @@
             # this allows distutils on windows to work in the source tree
             self.include_dirs.append(os.path.join(sys.exec_prefix, 'PC'))
             if MSVC_VERSION == 9:
-                self.library_dirs.append(os.path.join(sys.exec_prefix,
-                                         'PCbuild'))
+                # Use the .lib files for the correct architecture
+                if self.plat_name == 'win32':
+                    suffix = ''
+                else:
+                    # win-amd64 or win-ia64
+                    suffix = self.plat_name[4:]
+                new_lib = os.path.join(sys.exec_prefix, 'PCbuild')
+                if suffix:
+                    new_lib = os.path.join(new_lib, suffix)
+                self.library_dirs.append(new_lib)
+
             elif MSVC_VERSION == 8:
                 self.library_dirs.append(os.path.join(sys.exec_prefix,
                                          'PC', 'VS8.0', 'win32release'))
@@ -275,6 +294,11 @@
                                      dry_run=self.dry_run,
                                      force=self.force)
         customize_compiler(self.compiler)
+        # If we are cross-compiling, init the compiler now (if we are not
+        # cross-compiling, init would not hurt, but people may rely on
+        # late initialization of compiler even if they shouldn't...)
+        if os.name == 'nt' and self.plat_name != get_platform():
+            self.compiler.initialize(self.plat_name)
 
         # And make sure that any compile/link-related options (which might
         # come from the command-line or from the setup script) are set in

Modified: python/trunk/Lib/distutils/command/install.py
==============================================================================
--- python/trunk/Lib/distutils/command/install.py	(original)
+++ python/trunk/Lib/distutils/command/install.py	Mon Apr  7 03:53:39 2008
@@ -16,6 +16,7 @@
 from distutils.errors import DistutilsPlatformError
 from distutils.file_util import write_file
 from distutils.util import convert_path, subst_vars, change_root
+from distutils.util import get_platform
 from distutils.errors import DistutilsOptionError
 
 if sys.version < "2.2":
@@ -503,6 +504,14 @@
         # Obviously have to build before we can install
         if not self.skip_build:
             self.run_command('build')
+            # If we built for any other platform, we can't install.
+            build_plat = self.distribution.get_command_obj('build').plat_name
+            # check warn_dir - it is a clue that the 'install' is happening
+            # internally, and not to sys.path, so we don't check the platform
+            # matches what we are running.
+            if self.warn_dir and build_plat != get_platform():
+                raise DistutilsPlatformError("Can't install when "
+                                             "cross-compiling")
 
         # Run all sub-commands (at least those that need to be run)
         for cmd_name in self.get_sub_commands():

Added: python/trunk/Lib/distutils/command/wininst-9.0-amd64.exe
==============================================================================
Binary file. No diff available.

Modified: python/trunk/Lib/distutils/msvc9compiler.py
==============================================================================
--- python/trunk/Lib/distutils/msvc9compiler.py	(original)
+++ python/trunk/Lib/distutils/msvc9compiler.py	Mon Apr  7 03:53:39 2008
@@ -22,6 +22,7 @@
 from distutils.ccompiler import (CCompiler, gen_preprocess_options,
     gen_lib_options)
 from distutils import log
+from distutils.util import get_platform
 
 import _winreg
 
@@ -38,13 +39,15 @@
 VS_BASE = r"Software\Microsoft\VisualStudio\%0.1f"
 WINSDK_BASE = r"Software\Microsoft\Microsoft SDKs\Windows"
 NET_BASE = r"Software\Microsoft\.NETFramework"
-ARCHS = {'DEFAULT' : 'x86',
-    'intel' : 'x86', 'x86' : 'x86',
-    'amd64' : 'x64', 'x64' : 'x64',
-    'itanium' : 'ia64', 'ia64' : 'ia64',
-    }
 
-# The globals VERSION, ARCH, MACROS and VC_ENV are defined later
+# A map keyed by get_platform() return values to values accepted by
+# 'vcvarsall.bat'.  Note a cross-compile may combine these (eg, 'x86_amd64' is
+# the param to cross-compile on x86 targetting amd64.)
+PLAT_TO_VCVARS = {
+    'win32' : 'x86',
+    'win-amd64' : 'amd64',
+    'win-ia64' : 'ia64',
+}
 
 class Reg:
     """Helper class to read values from the registry
@@ -176,23 +179,6 @@
     # else we don't know what version of the compiler this is
     return None
 
-def get_build_architecture():
-    """Return the processor architecture.
-
-    Possible results are "x86" or "amd64".
-    """
-    prefix = " bit ("
-    i = sys.version.find(prefix)
-    if i == -1:
-        return "x86"
-    j = sys.version.find(")", i)
-    sysarch = sys.version[i+len(prefix):j].lower()
-    arch = ARCHS.get(sysarch, None)
-    if arch is None:
-        return ARCHS['DEFAULT']
-    else:
-        return arch
-
 def normalize_and_reduce_paths(paths):
     """Return a list of normalized paths with duplicates removed.
 
@@ -251,6 +237,7 @@
 
     if vcvarsall is None:
         raise IOError("Unable to find vcvarsall.bat")
+    log.debug("Calling 'vcvarsall.bat %s' (version=%s)", arch, version)
     popen = subprocess.Popen('"%s" %s & set' % (vcvarsall, arch),
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
@@ -281,9 +268,7 @@
 VERSION = get_build_version()
 if VERSION < 8.0:
     raise DistutilsPlatformError("VC %0.1f is not supported by this module" % VERSION)
-ARCH = get_build_architecture()
 # MACROS = MacroExpander(VERSION)
-VC_ENV = query_vcvarsall(VERSION, ARCH)
 
 class MSVCCompiler(CCompiler) :
     """Concrete class that implements an interface to Microsoft Visual C++,
@@ -318,13 +303,25 @@
     def __init__(self, verbose=0, dry_run=0, force=0):
         CCompiler.__init__ (self, verbose, dry_run, force)
         self.__version = VERSION
-        self.__arch = ARCH
         self.__root = r"Software\Microsoft\VisualStudio"
         # self.__macros = MACROS
         self.__path = []
+        # target platform (.plat_name is consistent with 'bdist')
+        self.plat_name = None
+        self.__arch = None # deprecated name
         self.initialized = False
 
-    def initialize(self):
+    def initialize(self, plat_name=None):
+        # multi-init means we would need to check platform same each time...
+        assert not self.initialized, "don't init multiple times"
+        if plat_name is None:
+            plat_name = get_platform()
+        # sanity check for platforms to prevent obscure errors later.
+        ok_plats = 'win32', 'win-amd64', 'win-ia64'
+        if plat_name not in ok_plats:
+            raise DistutilsPlatformError("--plat-name must be one of %s" %
+                                         (ok_plats,))
+
         if "DISTUTILS_USE_SDK" in os.environ and "MSSdk" in os.environ and self.find_exe("cl.exe"):
             # Assume that the SDK set up everything alright; don't try to be
             # smarter
@@ -334,9 +331,24 @@
             self.rc = "rc.exe"
             self.mc = "mc.exe"
         else:
-            self.__paths = VC_ENV['path'].split(os.pathsep)
-            os.environ['lib'] = VC_ENV['lib']
-            os.environ['include'] = VC_ENV['include']
+            # On x86, 'vcvars32.bat amd64' creates an env that doesn't work;
+            # to cross compile, you use 'x86_amd64'.
+            # On AMD64, 'vcvars32.bat amd64' is a native build env; to cross
+            # compile use 'x86' (ie, it runs the x86 compiler directly)
+            # No idea how itanium handles this, if at all.
+            if plat_name == get_platform() or plat_name == 'win32':
+                # native build or cross-compile to win32
+                plat_spec = PLAT_TO_VCVARS[plat_name]
+            else:
+                # cross compile from win32 -> some 64bit
+                plat_spec = PLAT_TO_VCVARS[get_platform()] + '_' + \
+                            PLAT_TO_VCVARS[plat_name]
+
+            vc_env = query_vcvarsall(VERSION, plat_spec)
+
+            self.__paths = vc_env['path'].split(os.pathsep)
+            os.environ['lib'] = vc_env['lib']
+            os.environ['include'] = vc_env['include']
 
             if len(self.__paths) == 0:
                 raise DistutilsPlatformError("Python was built with %s, "

Modified: python/trunk/Lib/distutils/msvccompiler.py
==============================================================================
--- python/trunk/Lib/distutils/msvccompiler.py	(original)
+++ python/trunk/Lib/distutils/msvccompiler.py	Mon Apr  7 03:53:39 2008
@@ -656,5 +656,5 @@
     log.debug("Importing new compiler from distutils.msvc9compiler")
     OldMSVCCompiler = MSVCCompiler
     from distutils.msvc9compiler import MSVCCompiler
-    from distutils.msvc9compiler import get_build_architecture
+    # get_build_architecture not really relevant now we support cross-compile
     from distutils.msvc9compiler import MacroExpander

Modified: python/trunk/Lib/distutils/util.py
==============================================================================
--- python/trunk/Lib/distutils/util.py	(original)
+++ python/trunk/Lib/distutils/util.py	Mon Apr  7 03:53:39 2008
@@ -30,7 +30,7 @@
        irix64-6.2
 
     Windows will return one of:
-       win-x86_64 (64bit Windows on x86_64 (AMD64))
+       win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc)
        win-ia64 (64bit Windows on Itanium)
        win32 (all others - specifically, sys.platform is returned)
 
@@ -45,7 +45,7 @@
         j = string.find(sys.version, ")", i)
         look = sys.version[i+len(prefix):j].lower()
         if look=='amd64':
-            return 'win-x86_64'
+            return 'win-amd64'
         if look=='itanium':
             return 'win-ia64'
         return sys.platform

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Mon Apr  7 03:53:39 2008
@@ -18,6 +18,10 @@
 Library
 -------
 
+- Issue #2513: distutils on Windows is now capable of cross-compiling 
+  extension modules between 32 and 64 bit platforms.  See the distutls
+  build documentation for more information.
+
 - Issue #815646: Individual file objects may now be used from multiple
   threads at once without fear of crashing the Python interpreter.  If
   file.close() is called while an object is in use by another thread

Modified: python/trunk/PC/example_nt/readme.txt
==============================================================================
--- python/trunk/PC/example_nt/readme.txt	(original)
+++ python/trunk/PC/example_nt/readme.txt	Mon Apr  7 03:53:39 2008
@@ -2,12 +2,34 @@
 =======================================
 
 This directory contains everything needed (except for the Python
-distribution!) to build a Python extension module using Microsoft VC++
-("Developer Studio") version 7.1.  It has been tested with VC++ 7.1 on 
-Python 2.4.  You can also use earlier versions of VC to build Python 
-extensions, but the sample VC project file (example.dsw in this directory) 
-is in VC 7.1 format. Notice that you need to use the same compiler version
-that was used to build Python itself.
+distribution!) to build a Python extension module using Microsoft VC++.
+Notice that you need to use the same compiler version that was used to build 
+Python itself.
+
+The simplest way to build this example is to use the distutils script
+'setup.py'.  To do this, simply execute:
+
+  % python setup.py install
+
+after everything builds and installs, you can test it:
+
+  % python -c "import example; example.foo()"
+  Hello, world
+
+See setup.py for more details.  alternatively, see below for instructions on 
+how to build inside the Visual Studio environment.
+
+Visual Studio Build Instructions
+================================
+
+These are instructions how to build an extension using Visual C++.  The
+instructions and project files have not been updated to the latest VC
+version.  In general, it is recommended you use the 'setup.py' instructions
+above.
+
+It has been tested with VC++ 7.1 on Python 2.4.  You can also use earlier 
+versions of VC to build Python extensions, but the sample VC project file 
+(example.dsw in this directory) is in VC 7.1 format.
 
 COPY THIS DIRECTORY!
 --------------------

Added: python/trunk/PC/example_nt/setup.py
==============================================================================
--- (empty file)
+++ python/trunk/PC/example_nt/setup.py	Mon Apr  7 03:53:39 2008
@@ -0,0 +1,22 @@
+# This is an example of a distutils 'setup' script for the example_nt
+# sample.  This provides a simpler way of building your extension
+# and means you can avoid keeping MSVC solution files etc in source-control.
+# It also means it should magically build with all compilers supported by
+# python.
+
+# USAGE: you probably want 'setup.py install' - but execute 'setup.py --help'
+# for all the details.
+
+# NOTE: This is *not* a sample for distutils - it is just the smallest
+# script that can build this.  See distutils docs for more info.
+
+from distutils.core import setup, Extension
+
+example_mod = Extension('example', sources = ['example.c'])
+
+
+setup(name = "example",
+    version = "1.0",
+    description = "A sample extension module",
+    ext_modules = [example_mod],
+)

Modified: python/trunk/PCbuild/bdist_wininst.vcproj
==============================================================================
--- python/trunk/PCbuild/bdist_wininst.vcproj	(original)
+++ python/trunk/PCbuild/bdist_wininst.vcproj	Mon Apr  7 03:53:39 2008
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="Windows-1252"?>
 <VisualStudioProject
 	ProjectType="Visual C++"
-	Version="9,00"
+	Version="9.00"
 	Name="bdist_wininst"
 	ProjectGUID="{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}"
 	RootNamespace="wininst"
@@ -11,6 +11,9 @@
 		<Platform
 			Name="Win32"
 		/>
+		<Platform
+			Name="x64"
+		/>
 	</Platforms>
 	<ToolFiles>
 	</ToolFiles>
@@ -104,6 +107,96 @@
 				Name="VCPostBuildEventTool"
 			/>
 		</Configuration>
+		<Configuration
+			Name="Release|x64"
+			OutputDirectory="$(PlatformName)\$(ConfigurationName)"
+			IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
+			ConfigurationType="1"
+			InheritedPropertySheets=".\pyproject.vsprops;.\release.vsprops"
+			UseOfMFC="0"
+			ATLMinimizesCRunTimeLibraryUsage="false"
+			CharacterSet="0"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="NDEBUG"
+				MkTypLibCompatible="true"
+				SuppressStartupBanner="true"
+				TargetEnvironment="3"
+				TypeLibraryName=".\..\lib\distutils\command\wininst.tlb"
+				HeaderFileName=""
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="1"
+				InlineFunctionExpansion="1"
+				AdditionalIncludeDirectories="..\PC\bdist_wininst;..\Include;..\Modules\zlib"
+				PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE"
+				StringPooling="true"
+				RuntimeLibrary="2"
+				EnableFunctionLevelLinking="true"
+				WarningLevel="3"
+				SuppressStartupBanner="true"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="0"
+				AdditionalIncludeDirectories="..\PC;..\PC\bdist_wininst;..\Include"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				AdditionalDependencies="comctl32.lib imagehlp.lib"
+				OutputFile="..\lib\distutils\command\wininst-9.0-amd64.exe"
+				LinkIncremental="1"
+				SuppressStartupBanner="true"
+				IgnoreDefaultLibraryNames="LIBC"
+				ProgramDatabaseFile="..\lib\distutils\command\wininst-9.0-amd64.pdb"
+				SubSystem="2"
+				RandomizedBaseAddress="1"
+				DataExecutionPrevention="0"
+				TargetMachine="17"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
 	</Configurations>
 	<References>
 	</References>

Modified: python/trunk/PCbuild/pcbuild.sln
==============================================================================
--- python/trunk/PCbuild/pcbuild.sln	(original)
+++ python/trunk/PCbuild/pcbuild.sln	Mon Apr  7 03:53:39 2008
@@ -482,13 +482,13 @@
 		{D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.ActiveCfg = Release|x64
 		{D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.Build.0 = Release|x64
 		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|Win32.ActiveCfg = Release|Win32
-		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|x64.ActiveCfg = Release|Win32
+		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|x64.ActiveCfg = Release|x64
 		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|Win32.ActiveCfg = Release|Win32
-		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|x64.ActiveCfg = Release|Win32
+		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|x64.ActiveCfg = Release|x64
 		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|Win32.ActiveCfg = Release|Win32
-		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|x64.ActiveCfg = Release|Win32
+		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|x64.ActiveCfg = Release|x64
 		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|Win32.ActiveCfg = Release|Win32
-		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|x64.ActiveCfg = Release|Win32
+		{EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|x64.ActiveCfg = Release|x64
 		{447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.ActiveCfg = Debug|Win32
 		{447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|Win32.Build.0 = Debug|Win32
 		{447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|x64.ActiveCfg = Debug|x64


More information about the Python-checkins mailing list