summaryrefslogtreecommitdiffstats
path: root/Lib/distutils/command/install_lib.py
diff options
context:
space:
mode:
authorGreg Ward <gward@python.net>2000-10-02 02:15:08 (GMT)
committerGreg Ward <gward@python.net>2000-10-02 02:15:08 (GMT)
commitcb9c9aed01abc99cad2fbadd0b407d226bbbb2ba (patch)
treefbd48b443553d50a93878964fcb48b73a3e22b60 /Lib/distutils/command/install_lib.py
parent04cc88df05d85d0c8908d912b37c86108e55eccd (diff)
downloadcpython-cb9c9aed01abc99cad2fbadd0b407d226bbbb2ba.zip
cpython-cb9c9aed01abc99cad2fbadd0b407d226bbbb2ba.tar.gz
cpython-cb9c9aed01abc99cad2fbadd0b407d226bbbb2ba.tar.bz2
Finished the overhaul of byte-compilation options: there's now a 6-way
choice between (compile, no-compile) * (optimize=0, optimize=1, optimize=2). Details: - added --no-compile option to complement --compile, which has been there for ages - changed --optimize (which never worked) to a value option, which expects 0, 1, or 2 - renamed 'bytecompile()' method to 'byte_compile()', and beefed it up to handle both 'compile' and 'optimize' options - fix '_bytecode_filenames()' to respect the new options
Diffstat (limited to 'Lib/distutils/command/install_lib.py')
-rw-r--r--Lib/distutils/command/install_lib.py81
1 files changed, 66 insertions, 15 deletions
diff --git a/Lib/distutils/command/install_lib.py b/Lib/distutils/command/install_lib.py
index 2396eed..80da3ac 100644
--- a/Lib/distutils/command/install_lib.py
+++ b/Lib/distutils/command/install_lib.py
@@ -3,24 +3,44 @@
__revision__ = "$Id$"
import sys, os, string
+from types import IntType
from distutils.core import Command
+from distutils.errors import DistutilsOptionError
from distutils.dir_util import copy_tree
-from distutils.util import byte_compile
class install_lib (Command):
description = "install all Python modules (extensions and pure Python)"
+ # The byte-compilation options are a tad confusing. Here are the
+ # possible scenarios:
+ # 1) no compilation at all (--no-compile --no-optimize)
+ # 2) compile .pyc only (--compile --no-optimize; default)
+ # 3) compile .pyc and "level 1" .pyo (--compile --optimize)
+ # 4) compile "level 1" .pyo only (--no-compile --optimize)
+ # 5) compile .pyc and "level 2" .pyo (--compile --optimize-more)
+ # 6) compile "level 2" .pyo only (--no-compile --optimize-more)
+ #
+ # The UI for this is two option, 'compile' and 'optimize'.
+ # 'compile' is strictly boolean, and only decides whether to
+ # generate .pyc files. 'optimize' is three-way (0, 1, or 2), and
+ # decides both whether to generate .pyo files and what level of
+ # optimization to use.
+
user_options = [
('install-dir=', 'd', "directory to install to"),
('build-dir=','b', "build directory (where to install from)"),
('force', 'f', "force installation (overwrite existing files)"),
- ('compile', 'c', "compile .py to .pyc"),
- ('optimize', 'o', "compile .py to .pyo (optimized)"),
+ ('compile', 'c', "compile .py to .pyc [default]"),
+ ('no-compile', None, "don't compile .py files"),
+ ('optimize=', 'O',
+ "also compile with optimization: -O1 for \"python -O\", "
+ "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"),
('skip-build', None, "skip the build steps"),
]
- boolean_options = ['force', 'compile', 'optimize', 'skip-build']
+ boolean_options = ['force', 'compile', 'skip-build']
+ negative_opt = {'no-compile' : 'compile'}
def initialize_options (self):
@@ -28,8 +48,8 @@ class install_lib (Command):
self.install_dir = None
self.build_dir = None
self.force = 0
- self.compile = 1
- self.optimize = 1
+ self.compile = None
+ self.optimize = None
self.skip_build = None
def finalize_options (self):
@@ -41,11 +61,25 @@ class install_lib (Command):
('build_lib', 'build_dir'),
('install_lib', 'install_dir'),
('force', 'force'),
- ('compile_py', 'compile'),
- ('optimize_py', 'optimize'),
+ ('compile', 'compile'),
+ ('optimize', 'optimize'),
('skip_build', 'skip_build'),
)
+ if self.compile is None:
+ self.compile = 1
+ if self.optimize is None:
+ self.optimize = 0
+
+ print "install_lib: compile=%s, optimize=%s" % \
+ (`self.compile`, `self.optimize`)
+ if type(self.optimize) is not IntType:
+ try:
+ self.optimize = int(self.optimize)
+ assert 0 <= self.optimize <= 2
+ except (ValueError, AssertionError):
+ raise DistutilsOptionError, "optimize must be 0, 1, or 2"
+
def run (self):
# Make sure we have built everything we need first
@@ -58,7 +92,7 @@ class install_lib (Command):
# (Optionally) compile .py to .pyc
if outfiles is not None and self.distribution.has_pure_modules():
- self.bytecompile(outfiles)
+ self.byte_compile(outfiles)
# run ()
@@ -82,10 +116,25 @@ class install_lib (Command):
return
return outfiles
- def bytecompile (self, files):
- byte_compile(files,
- force=self.force,
- verbose=self.verbose, dry_run=self.dry_run)
+ def byte_compile (self, files):
+ from distutils.util import byte_compile
+
+ # Get the "--root" directory supplied to the "install" command,
+ # and use it as a prefix to strip off the purported filename
+ # encoded in bytecode files. This is far from complete, but it
+ # should at least generate usable bytecode in RPM distributions.
+ install_root = self.get_finalized_command('install').root
+
+ if self.compile:
+ byte_compile(files, optimize=0,
+ force=self.force,
+ prefix=install_root,
+ verbose=self.verbose, dry_run=self.dry_run)
+ if self.optimize > 0:
+ byte_compile(files, optimize=self.optimize,
+ force=self.force,
+ prefix=install_root,
+ verbose=self.verbose, dry_run=self.dry_run)
# -- Utility methods -----------------------------------------------
@@ -111,8 +160,10 @@ class install_lib (Command):
def _bytecode_filenames (self, py_filenames):
bytecode_files = []
for py_file in py_filenames:
- bytecode = py_file + (__debug__ and "c" or "o")
- bytecode_files.append(bytecode)
+ if self.compile:
+ bytecode_files.append(py_file + "c")
+ if self.optmize > 0:
+ bytecode_files.append(py_file + "o")
return bytecode_files