summaryrefslogtreecommitdiff
path: root/distutils2/command/build_py.py
diff options
context:
space:
mode:
author?ric Araujo <merwok@netwok.org>2011-11-12 02:58:14 +0100
committer?ric Araujo <merwok@netwok.org>2011-11-12 02:58:14 +0100
commita8791ff81a116924d6d385cf5aab2a54743855a4 (patch)
tree5e54e42afed98816ff98097620fa517a32d74855 /distutils2/command/build_py.py
parent34688250a4964f5b9fc893a43319acbb0cadc054 (diff)
downloaddisutils2-a8791ff81a116924d6d385cf5aab2a54743855a4.tar.gz
Improve byte-compilation to be independent of -O or -B.
All code (util.byte_compile, build_py, install_lib) can now create .pyc and/or.pyo files according to options given by users, without interference from the calling Python?s own optimize mode or from the sys.dont_write_bytecode switch. The rationale is that packaging gives control over the creation of .pyc/.pyo files to the user with its own explicit option, and the behavior should not be changed if the calling Python happens to run with -B or -O for whatever reason. This is actually a bug fix, not an improvement: Digging into the early history of distutils shows that the original author wanted this behavior (see for example comments in build_py in r12940).
Diffstat (limited to 'distutils2/command/build_py.py')
-rw-r--r--distutils2/command/build_py.py67
1 files changed, 24 insertions, 43 deletions
diff --git a/distutils2/command/build_py.py b/distutils2/command/build_py.py
index fec81a9..11e0442 100644
--- a/distutils2/command/build_py.py
+++ b/distutils2/command/build_py.py
@@ -1,7 +1,6 @@
"""Build pure Python modules (just copy to build directory)."""
import os
-import sys
from glob import glob
from distutils2 import logger
@@ -13,10 +12,14 @@ from distutils2.compat import Mixin2to3
# marking public APIs
__all__ = ['build_py']
+
class build_py(Command, Mixin2to3):
description = "build pure Python modules (copy to build directory)"
+ # The options for controlling byte compilation are two independent sets;
+ # more info in install_lib or the reST docs
+
user_options = [
('build-lib=', 'd', "directory to build (copy) to"),
('compile', 'c', "compile .py to .pyc"),
@@ -28,13 +31,14 @@ class build_py(Command, Mixin2to3):
('use-2to3', None,
"use 2to3 to make source python 3.x compatible"),
('convert-2to3-doctests', None,
- "use 2to3 to convert doctests in seperate text files"),
+ "use 2to3 to convert doctests in separate text files"),
('use-2to3-fixers', None,
"list additional fixers opted for during 2to3 conversion"),
]
boolean_options = ['compile', 'force']
- negative_opt = {'no-compile' : 'compile'}
+
+ negative_opt = {'no-compile': 'compile'}
def initialize_options(self):
self.build_lib = None
@@ -108,14 +112,15 @@ class build_py(Command, Mixin2to3):
self.run_2to3(self._updated_files, self._doctests_2to3,
self.use_2to3_fixers)
- self.byte_compile(self.get_outputs(include_bytecode=False))
+ self.byte_compile(self.get_outputs(include_bytecode=False),
+ prefix=self.build_lib)
# -- Top-level worker functions ------------------------------------
def get_data_files(self):
"""Generate list of '(package,src_dir,build_dir,filenames)' tuples.
- Helper function for `finalize_options()`.
+ Helper function for finalize_options.
"""
data = []
if not self.packages:
@@ -130,7 +135,7 @@ class build_py(Command, Mixin2to3):
# Length of path to strip from found files
plen = 0
if src_dir:
- plen = len(src_dir)+1
+ plen = len(src_dir) + 1
# Strip directory from globbed filenames
filenames = [
@@ -142,7 +147,7 @@ class build_py(Command, Mixin2to3):
def find_data_files(self, package, src_dir):
"""Return filenames for package's data files in 'src_dir'.
- Helper function for `get_data_files()`.
+ Helper function for get_data_files.
"""
globs = (self.package_data.get('', [])
+ self.package_data.get(package, []))
@@ -157,7 +162,7 @@ class build_py(Command, Mixin2to3):
def build_package_data(self):
"""Copy data files into build directory.
- Helper function for `run()`.
+ Helper function for run.
"""
# FIXME add tests for this method
for package, src_dir, build_dir, filenames in self.data_files:
@@ -167,16 +172,17 @@ class build_py(Command, Mixin2to3):
self.mkpath(os.path.dirname(target))
outf, copied = self.copy_file(srcfile,
target, preserve_mode=False)
- if copied and srcfile in self.distribution.convert_2to3.doctests:
+ doctests = self.distribution.convert_2to3_doctests
+ if copied and srcfile in doctests:
self._doctests_2to3.append(outf)
# XXX - this should be moved to the Distribution class as it is not
# only needed for build_py. It also has no dependencies on this class.
def get_package_dir(self, package):
"""Return the directory, relative to the top of the source
- distribution, where package 'package' should be found
- (at least according to the 'package_dir' option, if any)."""
-
+ distribution, where package 'package' should be found
+ (at least according to the 'package_dir' option, if any).
+ """
path = package.split('.')
if self.package_dir is not None:
path.insert(0, self.package_dir)
@@ -187,8 +193,7 @@ class build_py(Command, Mixin2to3):
return ''
def check_package(self, package, package_dir):
- """Helper function for `find_package_modules()` and `find_modules()'.
- """
+ """Helper function for find_package_modules and find_modules."""
# Empty dir name means current directory, which we can probably
# assume exists. Also, os.path.exists and isdir don't know about
# my "empty string means current dir" convention, so we have to
@@ -208,8 +213,8 @@ class build_py(Command, Mixin2to3):
if os.path.isfile(init_py):
return init_py
else:
- logger.warning(("package init file '%s' not found " +
- "(or not a regular file)"), init_py)
+ logger.warning("package init file %r not found "
+ "(or not a regular file)", init_py)
# Either not in a package at all (__init__.py not expected), or
# __init__.py doesn't exist -- so don't return the filename.
@@ -217,7 +222,7 @@ class build_py(Command, Mixin2to3):
def check_module(self, module, module_file):
if not os.path.isfile(module_file):
- logger.warning("file %s (for module %s) not found",
+ logger.warning("file %r (for module %r) not found",
module_file, module)
return False
else:
@@ -238,7 +243,7 @@ class build_py(Command, Mixin2to3):
module = os.path.splitext(os.path.basename(f))[0]
modules.append((package, module, f))
else:
- logger.debug("excluding %s", setup_script)
+ logger.debug("excluding %r", setup_script)
return modules
def find_modules(self):
@@ -331,7 +336,7 @@ class build_py(Command, Mixin2to3):
if include_bytecode:
if self.compile:
outputs.append(filename + "c")
- if self.optimize > 0:
+ if self.optimize:
outputs.append(filename + "o")
outputs += [
@@ -359,7 +364,6 @@ class build_py(Command, Mixin2to3):
def build_modules(self):
modules = self.find_modules()
for package, module, module_file in modules:
-
# Now "build" the module -- ie. copy the source file to
# self.build_lib (the build directory for Python source).
# (Actually, it gets copied to the directory for this package
@@ -368,7 +372,6 @@ class build_py(Command, Mixin2to3):
def build_packages(self):
for package in self.packages:
-
# Get list of (package, module, module_file) tuples based on
# scanning the package directory. 'package' is only included
# in the tuple so that 'find_modules()' and
@@ -386,25 +389,3 @@ class build_py(Command, Mixin2to3):
for package_, module, module_file in modules:
assert package == package_
self.build_module(module, module_file, package)
-
- def byte_compile(self, files):
- if getattr(sys, 'dont_write_bytecode', False):
- logger.warning('%s: byte-compiling is disabled, skipping.',
- self.get_command_name())
- return
-
- from distutils2.util import byte_compile # FIXME use compileall
- prefix = self.build_lib
- if prefix[-1] != os.sep:
- prefix = prefix + os.sep
-
- # XXX this code is essentially the same as the 'byte_compile()
- # method of the "install_lib" command, except for the determination
- # of the 'prefix' string. Hmmm.
-
- if self.compile:
- byte_compile(files, optimize=0,
- force=self.force, prefix=prefix, dry_run=self.dry_run)
- if self.optimize > 0:
- byte_compile(files, optimize=self.optimize,
- force=self.force, prefix=prefix, dry_run=self.dry_run)