mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	 81ee3efede
			
		
	
	
		81ee3efede
		
	
	
	
	
		
			
			svn+ssh://pythondev@svn.python.org/python/trunk
................
  r62425 | andrew.kuchling | 2008-04-21 03:45:57 +0200 (Mon, 21 Apr 2008) | 1 line
  Comment typo
................
  r62426 | mark.dickinson | 2008-04-21 03:55:50 +0200 (Mon, 21 Apr 2008) | 2 lines
  Silence 'r may be used uninitialized' compiler warning.
................
  r62427 | andrew.kuchling | 2008-04-21 04:08:00 +0200 (Mon, 21 Apr 2008) | 1 line
  Markup fix
................
  r62428 | andrew.kuchling | 2008-04-21 04:08:13 +0200 (Mon, 21 Apr 2008) | 1 line
  Wording changes
................
  r62429 | andrew.kuchling | 2008-04-21 04:14:24 +0200 (Mon, 21 Apr 2008) | 1 line
  Add various items
................
  r62434 | thomas.heller | 2008-04-21 15:46:55 +0200 (Mon, 21 Apr 2008) | 1 line
  Fix typo.
................
  r62435 | david.goodger | 2008-04-21 16:40:22 +0200 (Mon, 21 Apr 2008) | 1 line
  corrections ("reStructuredText" is one word)
................
  r62436 | david.goodger | 2008-04-21 16:43:33 +0200 (Mon, 21 Apr 2008) | 1 line
  capitalization
................
  r62441 | gregory.p.smith | 2008-04-21 19:46:40 +0200 (Mon, 21 Apr 2008) | 2 lines
  explicitly flush after the ... since there wasn't a newline
................
  r62444 | jeroen.ruigrok | 2008-04-21 22:15:39 +0200 (Mon, 21 Apr 2008) | 2 lines
  Windows x64 also falls under VER_PLATFORM_WIN32_NT.
................
  r62446 | gregory.p.smith | 2008-04-21 23:31:08 +0200 (Mon, 21 Apr 2008) | 3 lines
  If sys.stdin is not a tty, fall back to default_getpass after printing
  a warning instead of failing with a termios.error.
................
  r62447 | mark.dickinson | 2008-04-22 00:32:24 +0200 (Tue, 22 Apr 2008) | 8 lines
  test_math and test_cmath are failing on the FreeBSD 6.2 trunk buildbot,
  apparently because tanh(-0.) loses the sign of zero on that platform.
  If true, this is a bug in FreeBSD.
  Added a configure test to verify this.  I still need to figure out
  how best to deal with this failure.
................
  r62448 | amaury.forgeotdarc | 2008-04-22 00:35:30 +0200 (Tue, 22 Apr 2008) | 7 lines
  Issue 2665: On Windows, sys.stderr does not contain a valid file when running without a console.
  It seems to work, but will fail at the first flush.
  This causes IDLE to crash when too many warnings are printed.
  Will backport.
................
  r62450 | benjamin.peterson | 2008-04-22 00:57:00 +0200 (Tue, 22 Apr 2008) | 2 lines
  Fix Sphinx warnings
................
  r62451 | mark.dickinson | 2008-04-22 02:54:27 +0200 (Tue, 22 Apr 2008) | 3 lines
  Make configure test for tanh(-0.) == -0. committed in r62447 actually
  work.  (The test wasn't properly linked with libm.  Sigh.)
................
  r62452 | benjamin.peterson | 2008-04-22 04:16:03 +0200 (Tue, 22 Apr 2008) | 2 lines
  Various io doc updates
................
  r62453 | neal.norwitz | 2008-04-22 07:07:47 +0200 (Tue, 22 Apr 2008) | 1 line
  Add Thomas Lee
................
  r62454 | gregory.p.smith | 2008-04-22 10:08:41 +0200 (Tue, 22 Apr 2008) | 8 lines
  Major improvements:
  * Default to using /dev/tty for the password prompt and input before
    falling back to sys.stdin and sys.stderr.
  * Use sys.stderr instead of sys.stdout.
  * print the 'password may be echoed' warning to stream used to display
    the prompt rather than always sys.stderr.
  * warn() with GetPassWarning when input may be echoed.
................
  r62455 | gregory.p.smith | 2008-04-22 10:11:33 +0200 (Tue, 22 Apr 2008) | 2 lines
  update the getpass entry
................
  r62463 | amaury.forgeotdarc | 2008-04-22 23:14:41 +0200 (Tue, 22 Apr 2008) | 5 lines
  Issue #2670: urllib2.build_opener() failed when two handlers
  derive the same default base class.
  Will backport.
................
  r62465 | skip.montanaro | 2008-04-23 00:45:09 +0200 (Wed, 23 Apr 2008) | 3 lines
  Factor in documentation changes from issue 1753732.
................
  r62466 | gregory.p.smith | 2008-04-23 03:06:42 +0200 (Wed, 23 Apr 2008) | 2 lines
  syntax fixup
................
  r62469 | benjamin.peterson | 2008-04-23 22:38:06 +0200 (Wed, 23 Apr 2008) | 2 lines
  #2673 Fix example typo in optparse docs
................
  r62474 | martin.v.loewis | 2008-04-24 11:50:50 +0200 (Thu, 24 Apr 2008) | 2 lines
  Add Guilherme Polo.
................
  r62476 | martin.v.loewis | 2008-04-24 15:16:36 +0200 (Thu, 24 Apr 2008) | 3 lines
  Remove Py_Refcnt, Py_Type, Py_Size, as they were added only
  for backwards compatibility, yet 2.5 did not have them at all.
................
  r62477 | martin.v.loewis | 2008-04-24 15:17:24 +0200 (Thu, 24 Apr 2008) | 2 lines
  Fix typo.
................
  r62478 | martin.v.loewis | 2008-04-24 15:18:03 +0200 (Thu, 24 Apr 2008) | 2 lines
  Add Jesus Cea.
................
  r62480 | amaury.forgeotdarc | 2008-04-24 20:07:05 +0200 (Thu, 24 Apr 2008) | 4 lines
  Issue2681: the literal 0o8 was wrongly accepted, and evaluated as float(0.0).
  This happened only when 8 is the first digit.
  Credits go to Lukas Meuser.
................
  r62485 | amaury.forgeotdarc | 2008-04-24 22:10:26 +0200 (Thu, 24 Apr 2008) | 5 lines
  Disable gc when running test_trace, or we may record the __del__ of collected objects.
  See http://mail.python.org/pipermail/python-checkins/2008-April/068633.html
  the extra events perfectly match several calls to socket._fileobject.__del__()
................
  r62492 | neal.norwitz | 2008-04-25 05:40:17 +0200 (Fri, 25 Apr 2008) | 1 line
  Fix typo (now -> no)
................
  r62497 | armin.rigo | 2008-04-25 11:35:18 +0200 (Fri, 25 Apr 2008) | 2 lines
  A new crasher.
................
  r62498 | thomas.heller | 2008-04-25 17:44:16 +0200 (Fri, 25 Apr 2008) | 1 line
  Add from_buffer and from_buffer_copy class methods to ctypes types.
................
  r62500 | mark.dickinson | 2008-04-25 18:59:09 +0200 (Fri, 25 Apr 2008) | 3 lines
  Issue 2635: fix bug in the fix_sentence_endings option to textwrap.fill.
................
  r62507 | benjamin.peterson | 2008-04-25 23:43:56 +0200 (Fri, 25 Apr 2008) | 2 lines
  Allow test_import to work when it is invoked directly
................
  r62513 | georg.brandl | 2008-04-26 20:31:07 +0200 (Sat, 26 Apr 2008) | 2 lines
  #2691: document PyLong (s)size_t APIs, patch by Alexander Belopolsky.
................
  r62514 | georg.brandl | 2008-04-26 20:32:17 +0200 (Sat, 26 Apr 2008) | 2 lines
  Add missing return type to dealloc.
................
  r62516 | alexandre.vassalotti | 2008-04-27 02:52:24 +0200 (Sun, 27 Apr 2008) | 2 lines
  Fixed URL of PEP 205 in weakref's module docstring.
................
  r62521 | georg.brandl | 2008-04-27 11:39:59 +0200 (Sun, 27 Apr 2008) | 2 lines
  #2677: add note that not all functions may accept keyword args.
................
  r62531 | georg.brandl | 2008-04-27 19:38:55 +0200 (Sun, 27 Apr 2008) | 2 lines
  Use correct XHTML tags.
................
  r62535 | benjamin.peterson | 2008-04-27 20:14:39 +0200 (Sun, 27 Apr 2008) | 2 lines
  #2700 Document PyNumber_ToBase
................
  r62545 | skip.montanaro | 2008-04-27 22:53:57 +0200 (Sun, 27 Apr 2008) | 1 line
  minor wording changes, rewrap a few lines
................
  r62546 | kurt.kaiser | 2008-04-27 23:07:41 +0200 (Sun, 27 Apr 2008) | 7 lines
  Home / Control-A toggles between left margin and end of leading white
  space.  Patch 1196903 Jeff Shute.
  M    idlelib/PyShell.py
  M    idlelib/EditorWindow.py
  M    idlelib/NEWS.txt
................
  r62548 | kurt.kaiser | 2008-04-27 23:38:05 +0200 (Sun, 27 Apr 2008) | 2 lines
  Improved AutoCompleteWindow logic.  Patch 2062 Tal Einat.
................
  r62549 | kurt.kaiser | 2008-04-27 23:52:19 +0200 (Sun, 27 Apr 2008) | 4 lines
  Autocompletion of filenames now support alternate separators, e.g. the
  '/' char on Windows.  Patch 2061 Tal Einat.
................
  r62550 | skip.montanaro | 2008-04-28 00:49:56 +0200 (Mon, 28 Apr 2008) | 6 lines
  A few small changes:
  * The only exception we should catch when trying to import cStringIO is an
    ImportError.
  * Delete the function signatures embedded in the mk*temp docstrings.
  * The tempdir global variable was initialized twice.
................
  r62551 | skip.montanaro | 2008-04-28 00:52:02 +0200 (Mon, 28 Apr 2008) | 4 lines
  Wrap some long paragraphs and include the default values for optional
  function parameters.
................
  r62553 | skip.montanaro | 2008-04-28 04:57:23 +0200 (Mon, 28 Apr 2008) | 7 lines
  Minor cleanups:
  * Avoid creating unused local variables where we can.  Where we can't prefix
    the unused variables with '_'.
  * Avoid shadowing builtins where it won't change the external interface of a
    function.
  * Use None as default path arg to readmodule and readmodule_ex.
................
  r62554 | skip.montanaro | 2008-04-28 04:59:45 +0200 (Mon, 28 Apr 2008) | 6 lines
  Correct documentation to match implementation: "Class" instead of
  "class_descriptor", "Function" instead of "function_descriptor".  Note
  default path value for readmodule*.  Wrap some long paragraphs.  Don't
  mention 'inpackage' which isn't part of the public API.
................
  r62555 | brett.cannon | 2008-04-28 05:23:50 +0200 (Mon, 28 Apr 2008) | 5 lines
  Fix a bug introduced by the warnings rewrite where tracebacks were being
  improperly indented.
  Closes issue #2699.
................
  r62556 | skip.montanaro | 2008-04-28 05:25:37 +0200 (Mon, 28 Apr 2008) | 2 lines
  Wrap some long lines.
................
  r62557 | skip.montanaro | 2008-04-28 05:27:53 +0200 (Mon, 28 Apr 2008) | 6 lines
  Get rid of _test(), _main(), _debug() and _check().  Tests are no longer
  needed (better set available in Lib/test/test_robotparser.py).  Clean up a
  few PEP 8 nits (compound statements on a single line, whitespace around
  operators).
................
  r62558 | brett.cannon | 2008-04-28 06:50:06 +0200 (Mon, 28 Apr 2008) | 3 lines
  Rename the test_traceback_print() function to traceback_print() to prevent
  test_capi from automatically calling the function.
................
  r62559 | georg.brandl | 2008-04-28 07:16:30 +0200 (Mon, 28 Apr 2008) | 2 lines
  Fix markup.
................
  r62569 | amaury.forgeotdarc | 2008-04-28 23:07:06 +0200 (Mon, 28 Apr 2008) | 5 lines
  test_sundry performs minimal tests (a simple import...) on modules that are not tested otherwise.
  Some of them now have tests and can be removed.
  Only 70 to go...
................
  r62574 | andrew.kuchling | 2008-04-29 04:03:54 +0200 (Tue, 29 Apr 2008) | 1 line
  Strip down SSL docs; I'm not managing to get test programs working, so I'll just give a minimal description
................
  r62577 | martin.v.loewis | 2008-04-29 08:10:53 +0200 (Tue, 29 Apr 2008) | 2 lines
  Add Rodrigo and Heiko.
................
  r62593 | nick.coghlan | 2008-04-30 16:23:36 +0200 (Wed, 30 Apr 2008) | 1 line
  Update command line usage documentation to reflect 2.6 changes (also includes some minor cleanups). Addresses TODO list issue 2258
................
  r62595 | andrew.kuchling | 2008-04-30 18:19:55 +0200 (Wed, 30 Apr 2008) | 1 line
  Typo fix
................
  r62604 | benjamin.peterson | 2008-04-30 23:03:58 +0200 (Wed, 30 Apr 2008) | 2 lines
  make test_support's captured_output a bit more robust when exceptions happen
................
  r62605 | georg.brandl | 2008-04-30 23:08:42 +0200 (Wed, 30 Apr 2008) | 2 lines
  #1748: use functools.wraps instead of rolling own metadata update.
................
  r62606 | benjamin.peterson | 2008-04-30 23:25:55 +0200 (Wed, 30 Apr 2008) | 2 lines
  Remove some from __future__ import with_statements
................
  r62608 | benjamin.peterson | 2008-05-01 00:03:36 +0200 (Thu, 01 May 2008) | 2 lines
  Fix typo in whatsnew
................
  r62616 | georg.brandl | 2008-05-01 20:24:32 +0200 (Thu, 01 May 2008) | 2 lines
  Fix synopsis.
................
  r62626 | brett.cannon | 2008-05-02 04:25:09 +0200 (Fri, 02 May 2008) | 6 lines
  Fix a backwards-compatibility mistake where a new optional argument for
  warnings.showwarning() was being used. This broke pre-existing replacements for
  the function since they didn't support the extra argument.
  Closes issue 2705.
................
  r62627 | gregory.p.smith | 2008-05-02 09:26:52 +0200 (Fri, 02 May 2008) | 20 lines
  This should fix issue2632.  A long description of the two competing
  problems is in the bug report (one old, one recently introduced trying
  to fix the old one).  In short:
  buffer data during socket._fileobject.read() and readlines() within a
  cStringIO object instead of a [] of str()s returned from the recv()
  call.
  This prevents excessive memory use due to the size parameter being
  passed to recv() being grossly larger than the actual size of the data
  returned *and* prevents excessive cpu usage due to looping in python
  calling recv() with a very tiny size value if min() is used as the
  previous memory-use bug "fix" did.
  It also documents what the socket._fileobject._rbufsize member is
  actually used for.
  This is a candidate for back porting to 2.5.
................
  r62636 | mark.hammond | 2008-05-02 14:48:15 +0200 (Fri, 02 May 2008) | 2 lines
  #2581: Vista UAC/elevation support for bdist_wininst
................
  r62638 | facundo.batista | 2008-05-02 19:39:00 +0200 (Fri, 02 May 2008) | 3 lines
  Fixed some test structures. Thanks Mark Dickinson.
................
  r62644 | ronald.oussoren | 2008-05-02 21:45:11 +0200 (Fri, 02 May 2008) | 7 lines
  Fix for issue #2573: Can't change the framework name on OS X builds
  This introduces a new configure option: --with-framework-name=NAME
  (defaulting to 'Python'). This allows you to install several copies
  of the Python framework with different names (such as a normal build
  and a debug build).
................
  r62645 | ronald.oussoren | 2008-05-02 21:58:56 +0200 (Fri, 02 May 2008) | 2 lines
  Finish fix for issue2573, previous patch was incomplete.
................
  r62647 | martin.v.loewis | 2008-05-02 23:30:20 +0200 (Fri, 02 May 2008) | 13 lines
  Merged revisions 62263-62646 via svnmerge from
  svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3
  ........
    r62470 | david.wolever | 2008-04-24 02:11:07 +0200 (Do, 24 Apr 2008) | 3 lines
    Fixed up and applied the patch for #2431 -- speeding up 2to3 with a lookup table.
  ........
    r62646 | martin.v.loewis | 2008-05-02 23:29:27 +0200 (Fr, 02 Mai 2008) | 2 lines
    Fix whitespace.
  ........
................
  r62648 | ronald.oussoren | 2008-05-02 23:42:35 +0200 (Fri, 02 May 2008) | 4 lines
  Fix for #1905: PythonLauncher not working correctly on OSX 10.5/Leopard
  This fixes both Python Launchar and the terminalcommand module.
................
  r62651 | ronald.oussoren | 2008-05-02 23:54:56 +0200 (Fri, 02 May 2008) | 2 lines
  Fix for issue #2520 (cannot import macerrors)
................
  r62652 | benjamin.peterson | 2008-05-03 00:12:58 +0200 (Sat, 03 May 2008) | 2 lines
  capitalization nit for reStructuredText
................
  r62653 | brett.cannon | 2008-05-03 03:02:41 +0200 (Sat, 03 May 2008) | 2 lines
  Fix some indentation errors.
................
  r62656 | brett.cannon | 2008-05-03 05:19:39 +0200 (Sat, 03 May 2008) | 6 lines
  Fix the C implementation of 'warnings' to infer the filename of the module that
  raised an exception properly when __file__ is not set, __name__ == '__main__',
  and sys.argv[0] is a false value.
  Closes issue2743.
................
  r62661 | amaury.forgeotdarc | 2008-05-03 14:21:13 +0200 (Sat, 03 May 2008) | 8 lines
  In test_io, StatefulIncrementalDecoderTest was not part of the test suite.
  And of course, the test failed:
  a bytearray was used without reason in io.TextIOWrapper.tell().
  The difference is that iterating over bytes (i.e. str in python2.6) returns 1-char bytes,
  whereas bytearrays yield integers.
  This code should still work with python3.0
................
  r62663 | benjamin.peterson | 2008-05-03 17:56:42 +0200 (Sat, 03 May 2008) | 2 lines
  The compiling struct is now passed around to all AST helpers (see issue 2720)
................
  r62680 | benjamin.peterson | 2008-05-03 23:35:18 +0200 (Sat, 03 May 2008) | 2 lines
  Moved testing of builtin types out of test_builtin and into type specific modules
................
  r62686 | mark.dickinson | 2008-05-04 04:25:46 +0200 (Sun, 04 May 2008) | 4 lines
  Make sure that Context traps and flags dictionaries have values 0 and 1
  (as documented) rather than True and False.
................
  r62687 | benjamin.peterson | 2008-05-04 05:05:49 +0200 (Sun, 04 May 2008) | 2 lines
  Fix typo in whatsnew
................
  r62696 | georg.brandl | 2008-05-04 11:15:04 +0200 (Sun, 04 May 2008) | 2 lines
  #2752: wrong meaning of '' for socket host.
................
  r62699 | christian.heimes | 2008-05-04 13:50:53 +0200 (Sun, 04 May 2008) | 1 line
  Added note that Python requires at least Win2k SP4
................
  r62700 | gerhard.haering | 2008-05-04 14:59:57 +0200 (Sun, 04 May 2008) | 3 lines
  SQLite requires 64-bit integers in order to build. So the whole HAVE_LONG_LONG
  #ifdefing was useless.
................
  r62701 | gerhard.haering | 2008-05-04 15:15:12 +0200 (Sun, 04 May 2008) | 3 lines
  Applied sqliterow-richcmp.diff patch from Thomas Heller in Issue2152. The
  sqlite3.Row type is now correctly hashable.
................
  r62702 | gerhard.haering | 2008-05-04 15:42:44 +0200 (Sun, 04 May 2008) | 5 lines
  Implemented feature request 2157: Converter names are cut off at '('
  characters. This avoids the common case of something like 'NUMBER(10)' not
  being parsed as 'NUMBER', like expected. Also corrected the docs about
  converter names being case-sensitive. They aren't any longer.
................
  r62703 | georg.brandl | 2008-05-04 17:45:05 +0200 (Sun, 04 May 2008) | 2 lines
  #2757: Remove spare newline.
................
  r62711 | benjamin.peterson | 2008-05-04 21:10:02 +0200 (Sun, 04 May 2008) | 2 lines
  Fix typo in bugs.rst
................
		
	
			
		
			
				
	
	
		
			327 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			327 lines
		
	
	
	
		
			14 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """distutils.command.bdist_wininst
 | |
| 
 | |
| Implements the Distutils 'bdist_wininst' command: create a windows installer
 | |
| exe-program."""
 | |
| 
 | |
| __revision__ = "$Id$"
 | |
| 
 | |
| import sys, os
 | |
| from distutils.core import Command
 | |
| from distutils.util import get_platform
 | |
| from distutils.dir_util import create_tree, remove_tree
 | |
| from distutils.errors import *
 | |
| from distutils.sysconfig import get_python_version
 | |
| from distutils import log
 | |
| 
 | |
| class bdist_wininst(Command):
 | |
| 
 | |
|     description = "create an executable installer for MS Windows"
 | |
| 
 | |
|     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"),
 | |
|                     ('target-version=', None,
 | |
|                      "require a specific python version" +
 | |
|                      " on the target system"),
 | |
|                     ('no-target-compile', 'c',
 | |
|                      "do not compile .py to .pyc on the target system"),
 | |
|                     ('no-target-optimize', 'o',
 | |
|                      "do not compile .py to .pyo (optimized)"
 | |
|                      "on the target system"),
 | |
|                     ('dist-dir=', 'd',
 | |
|                      "directory to put final built distributions in"),
 | |
|                     ('bitmap=', 'b',
 | |
|                      "bitmap to use for the installer instead of python-powered logo"),
 | |
|                     ('title=', 't',
 | |
|                      "title to display on the installer background instead of default"),
 | |
|                     ('skip-build', None,
 | |
|                      "skip rebuilding everything (for testing/debugging)"),
 | |
|                     ('install-script=', None,
 | |
|                      "basename of installation script to be run after"
 | |
|                      "installation or before deinstallation"),
 | |
|                     ('pre-install-script=', None,
 | |
|                      "Fully qualified filename of a script to be run before "
 | |
|                      "any files are installed.  This script need not be in the "
 | |
|                      "distribution"),
 | |
|                     ('user-access-control=', None,
 | |
|                      "specify Vista's UAC handling - 'none'/default=no "
 | |
|                      "handling, 'auto'=use UAC if target Python installed for "
 | |
|                      "all users, 'force'=always use UAC"),
 | |
|                    ]
 | |
| 
 | |
|     boolean_options = ['keep-temp', 'no-target-compile', 'no-target-optimize',
 | |
|                        'skip-build']
 | |
| 
 | |
|     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
 | |
|         self.target_version = None
 | |
|         self.dist_dir = None
 | |
|         self.bitmap = None
 | |
|         self.title = None
 | |
|         self.skip_build = 0
 | |
|         self.install_script = None
 | |
|         self.pre_install_script = None
 | |
|         self.user_access_control = None
 | |
| 
 | |
| 
 | |
|     def finalize_options(self):
 | |
|         if self.bdist_dir is None:
 | |
|             bdist_base = self.get_finalized_command('bdist').bdist_base
 | |
|             self.bdist_dir = os.path.join(bdist_base, 'wininst')
 | |
|         if not self.target_version:
 | |
|             self.target_version = ""
 | |
|         if not self.skip_build and self.distribution.has_ext_modules():
 | |
|             short_version = get_python_version()
 | |
|             if self.target_version and self.target_version != short_version:
 | |
|                 raise DistutilsOptionError(
 | |
|                       "target version can only be %s, or the '--skip_build'" \
 | |
|                       " option must be specified" % (short_version,))
 | |
|             self.target_version = short_version
 | |
| 
 | |
|         self.set_undefined_options('bdist',
 | |
|                                    ('dist_dir', 'dist_dir'),
 | |
|                                    ('plat_name', 'plat_name'),
 | |
|                                   )
 | |
| 
 | |
|         if self.install_script:
 | |
|             for script in self.distribution.scripts:
 | |
|                 if self.install_script == os.path.basename(script):
 | |
|                     break
 | |
|             else:
 | |
|                 raise DistutilsOptionError(
 | |
|                       "install_script '%s' not found in scripts"
 | |
|                       % self.install_script)
 | |
| 
 | |
|     def run(self):
 | |
|         if (sys.platform != "win32" and
 | |
|             (self.distribution.has_ext_modules() or
 | |
|              self.distribution.has_c_libraries())):
 | |
|             raise DistutilsPlatformError \
 | |
|                   ("distribution contains extensions and/or C libraries; "
 | |
|                    "must be compiled on a Windows 32 platform")
 | |
| 
 | |
|         if not self.skip_build:
 | |
|             self.run_command('build')
 | |
| 
 | |
|         install = self.reinitialize_command('install', reinit_subcommands=1)
 | |
|         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
 | |
|         install_lib.compile = 0
 | |
|         install_lib.optimize = 0
 | |
| 
 | |
|         if self.distribution.has_ext_modules():
 | |
|             # If we are building an installer for a Python version other
 | |
|             # than the one we are currently running, then we need to ensure
 | |
|             # our build_lib reflects the other Python version rather than ours.
 | |
|             # Note that for target_version!=sys.version, we must have skipped the
 | |
|             # build step, so there is no issue with enforcing the build of this
 | |
|             # version.
 | |
|             target_version = self.target_version
 | |
|             if not target_version:
 | |
|                 assert self.skip_build, "Should have already checked this"
 | |
|                 target_version = sys.version[0:3]
 | |
|             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)
 | |
| 
 | |
|         # Use a custom scheme for the zip-file, because we have to decide
 | |
|         # at installation time which scheme to use.
 | |
|         for key in ('purelib', 'platlib', 'headers', 'scripts', 'data'):
 | |
|             value = key.upper()
 | |
|             if key == 'headers':
 | |
|                 value = value + '/Include/$dist_name'
 | |
|             setattr(install,
 | |
|                     'install_' + key,
 | |
|                     value)
 | |
| 
 | |
|         log.info("installing to %s", self.bdist_dir)
 | |
|         install.ensure_finalized()
 | |
| 
 | |
|         # avoid warning of 'install_lib' about installing
 | |
|         # into a directory not in sys.path
 | |
|         sys.path.insert(0, os.path.join(self.bdist_dir, 'PURELIB'))
 | |
| 
 | |
|         install.run()
 | |
| 
 | |
|         del sys.path[0]
 | |
| 
 | |
|         # And make an archive relative to the root of the
 | |
|         # pseudo-installation tree.
 | |
|         from tempfile import mktemp
 | |
|         archive_basename = mktemp()
 | |
|         fullname = self.distribution.get_fullname()
 | |
|         arcname = self.make_archive(archive_basename, "zip",
 | |
|                                     root_dir=self.bdist_dir)
 | |
|         # create an exe containing the zip-file
 | |
|         self.create_exe(arcname, fullname, self.bitmap)
 | |
|         if self.distribution.has_ext_modules():
 | |
|             pyversion = get_python_version()
 | |
|         else:
 | |
|             pyversion = 'any'
 | |
|         self.distribution.dist_files.append(('bdist_wininst', pyversion,
 | |
|                                              self.get_installer_filename(fullname)))
 | |
|         # remove the zip-file again
 | |
|         log.debug("removing temporary file '%s'", arcname)
 | |
|         os.remove(arcname)
 | |
| 
 | |
|         if not self.keep_temp:
 | |
|             remove_tree(self.bdist_dir, dry_run=self.dry_run)
 | |
| 
 | |
|     def get_inidata(self):
 | |
|         # Return data describing the installation.
 | |
|         lines = []
 | |
|         metadata = self.distribution.metadata
 | |
| 
 | |
|         # Write the [metadata] section.
 | |
|         lines.append("[metadata]")
 | |
| 
 | |
|         # 'info' will be displayed in the installer's dialog box,
 | |
|         # describing the items to be installed.
 | |
|         info = (metadata.long_description or '') + '\n'
 | |
| 
 | |
|         # Escape newline characters
 | |
|         def escape(s):
 | |
|             return s.replace("\n", "\\n")
 | |
| 
 | |
|         for name in ["author", "author_email", "description", "maintainer",
 | |
|                      "maintainer_email", "name", "url", "version"]:
 | |
|             data = getattr(metadata, name, "")
 | |
|             if data:
 | |
|                 info = info + ("\n    %s: %s" % \
 | |
|                                (name.capitalize(), escape(data)))
 | |
|                 lines.append("%s=%s" % (name, escape(data)))
 | |
| 
 | |
|         # The [setup] section contains entries controlling
 | |
|         # the installer runtime.
 | |
|         lines.append("\n[Setup]")
 | |
|         if self.install_script:
 | |
|             lines.append("install_script=%s" % self.install_script)
 | |
|         lines.append("info=%s" % escape(info))
 | |
|         lines.append("target_compile=%d" % (not self.no_target_compile))
 | |
|         lines.append("target_optimize=%d" % (not self.no_target_optimize))
 | |
|         if self.target_version:
 | |
|             lines.append("target_version=%s" % self.target_version)
 | |
|         if self.user_access_control:
 | |
|             lines.append("user_access_control=%s" % self.user_access_control)
 | |
| 
 | |
|         title = self.title or self.distribution.get_fullname()
 | |
|         lines.append("title=%s" % escape(title))
 | |
|         import time
 | |
|         import distutils
 | |
|         build_info = "Built %s with distutils-%s" % \
 | |
|                      (time.ctime(time.time()), distutils.__version__)
 | |
|         lines.append("build_info=%s" % build_info)
 | |
|         return "\n".join(lines)
 | |
| 
 | |
|     def create_exe(self, arcname, fullname, bitmap=None):
 | |
|         import struct
 | |
| 
 | |
|         self.mkpath(self.dist_dir)
 | |
| 
 | |
|         cfgdata = self.get_inidata()
 | |
| 
 | |
|         installer_name = self.get_installer_filename(fullname)
 | |
|         self.announce("creating %s" % installer_name)
 | |
| 
 | |
|         if bitmap:
 | |
|             bitmapdata = open(bitmap, "rb").read()
 | |
|             bitmaplen = len(bitmapdata)
 | |
|         else:
 | |
|             bitmaplen = 0
 | |
| 
 | |
|         file = open(installer_name, "wb")
 | |
|         file.write(self.get_exe_bytes())
 | |
|         if bitmap:
 | |
|             file.write(bitmapdata)
 | |
| 
 | |
|         # Convert cfgdata from unicode to ascii, mbcs encoded
 | |
|         if isinstance(cfgdata, str):
 | |
|             cfgdata = cfgdata.encode("mbcs")
 | |
| 
 | |
|         # Append the pre-install script
 | |
|         cfgdata = cfgdata + "\0"
 | |
|         if self.pre_install_script:
 | |
|             script_data = open(self.pre_install_script, "r").read()
 | |
|             cfgdata = cfgdata + script_data + "\n\0"
 | |
|         else:
 | |
|             # empty pre-install script
 | |
|             cfgdata = cfgdata + "\0"
 | |
|         file.write(cfgdata)
 | |
| 
 | |
|         # The 'magic number' 0x1234567B is used to make sure that the
 | |
|         # binary layout of 'cfgdata' is what the wininst.exe binary
 | |
|         # expects.  If the layout changes, increment that number, make
 | |
|         # the corresponding changes to the wininst.exe sources, and
 | |
|         # recompile them.
 | |
|         header = struct.pack("<iii",
 | |
|                              0x1234567B,       # tag
 | |
|                              len(cfgdata),     # length
 | |
|                              bitmaplen,        # number of bytes in bitmap
 | |
|                              )
 | |
|         file.write(header)
 | |
|         file.write(open(arcname, "rb").read())
 | |
| 
 | |
|     def get_installer_filename(self, fullname):
 | |
|         # Factored out to allow overriding in subclasses
 | |
|         if self.target_version:
 | |
|             # 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.%s-py%s.exe" %
 | |
|                                            (fullname, self.plat_name, self.target_version))
 | |
|         else:
 | |
|             installer_name = os.path.join(self.dist_dir,
 | |
|                                           "%s.%s.exe" % (fullname, self.plat_name))
 | |
|         return installer_name
 | |
| 
 | |
|     def get_exe_bytes(self):
 | |
|         from distutils.msvccompiler import get_build_version
 | |
|         # If a target-version other than the current version has been
 | |
|         # specified, then using the MSVC version from *this* build is no good.
 | |
|         # Without actually finding and executing the target version and parsing
 | |
|         # its sys.version, we just hard-code our knowledge of old versions.
 | |
|         # NOTE: Possible alternative is to allow "--target-version" to
 | |
|         # specify a Python executable rather than a simple version string.
 | |
|         # We can then execute this program to obtain any info we need, such
 | |
|         # as the real sys.version string for the build.
 | |
|         cur_version = get_python_version()
 | |
|         if self.target_version and self.target_version != cur_version:
 | |
|             # If the target version is *later* than us, then we assume they
 | |
|             # use what we use
 | |
|             # string compares seem wrong, but are what sysconfig.py itself uses
 | |
|             if self.target_version > cur_version:
 | |
|                 bv = get_build_version()
 | |
|             else:
 | |
|                 if self.target_version < "2.4":
 | |
|                     bv = 6.0
 | |
|                 else:
 | |
|                     bv = 7.1
 | |
|         else:
 | |
|             # for current version - use authoritative check.
 | |
|             bv = get_build_version()
 | |
| 
 | |
|         # wininst-x.y.exe is in the same directory as this file
 | |
|         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?
 | |
|         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()
 |