Build reorg:

* 'build_dir' -> 'build_lib', which by default takes its value
    straight from 'build_lib' in the 'build' command
  * added 'build_temp' and 'inplace' options
  * change 'build_extensions()' to put object files (compiler turds) in
    'build_temp' dir
  * complicated the name-of-extension-file shenanigans in
    'build_extensions()' to support "in-place" extension building, i.e.
    put the extension right into the source tree (handy for developers)
  * added 'get_ext_fullname()', renamed 'extension_filename()' to
    'get_ext_filename()', and tweaked the latter a bit -- all to support
    the new filename shenanigans
This commit is contained in:
Greg Ward 2000-03-01 01:43:28 +00:00
parent 42a3bf564a
commit e51d69efb0
1 changed files with 41 additions and 16 deletions

View File

@ -43,8 +43,13 @@ class build_ext (Command):
# in between initialize_options() and finalize_options())
user_options = [
('build-dir=', 'd',
('build-lib=', 'b',
"directory for compiled extension modules"),
('build-temp=', 't',
"directory for temporary files (build by-products)"),
('inplace', 'i',
"ignore build-lib and put compiled extensions into the source" +
"directory alongside your pure Python modules"),
('include-dirs=', 'I',
"list of directories to search for header files"),
('define=', 'D',
@ -66,7 +71,9 @@ class build_ext (Command):
def initialize_options (self):
self.extensions = None
self.build_dir = None
self.build_lib = None
self.build_temp = None
self.inplace = 0
self.package = None
self.include_dirs = None
@ -83,7 +90,8 @@ def finalize_options (self):
from distutils import sysconfig
self.set_undefined_options ('build',
('build_platlib', 'build_dir'),
('build_lib', 'build_lib'),
('build_temp', 'build_temp'),
('debug', 'debug'))
if self.package is None:
@ -227,15 +235,15 @@ def build_extensions (self, extensions):
# precedent!)
macros = build_info.get ('macros')
include_dirs = build_info.get ('include_dirs')
self.compiler.compile (sources,
macros=macros,
include_dirs=include_dirs,
debug=self.debug)
objects = self.compiler.compile (sources,
output_dir=self.build_temp,
macros=macros,
include_dirs=include_dirs,
debug=self.debug)
# Now link the object files together into a "shared object" --
# of course, first we have to figure out all the other things
# that go into the mix.
objects = self.compiler.object_filenames (sources)
extra_objects = build_info.get ('extra_objects')
if extra_objects:
objects.extend (extra_objects)
@ -257,12 +265,25 @@ def build_extensions (self, extensions):
else:
modname = string.split (extension_name, '.')[-1]
extra_args.append('/export:init%s'%modname)
# end if MSVC
fullname = self.get_ext_fullname (extension_name)
if self.inplace:
# ignore build-lib -- put the compiled extension into
# the source tree along with pure Python modules
modpath = string.split (fullname, '.')
package = string.join (modpath[0:-1], '.')
base = modpath[-1]
build_py = self.find_peer ('build_py')
package_dir = build_py.get_package_dir (package)
ext_filename = os.path.join (package_dir,
self.get_ext_filename(base))
else:
ext_filename = os.path.join (self.build_lib,
self.get_ext_filename(fullname))
ext_filename = self.extension_filename \
(extension_name, self.package)
ext_filename = os.path.join (self.build_dir, ext_filename)
dest_dir = os.path.dirname (ext_filename)
self.mkpath (dest_dir)
self.compiler.link_shared_object (objects, ext_filename,
libraries=libraries,
library_dirs=library_dirs,
@ -272,10 +293,14 @@ def build_extensions (self, extensions):
# build_extensions ()
def extension_filename (self, ext_name, package=None):
def get_ext_fullname (self, ext_name):
if self.package is None:
return ext_name
else:
return self.package + '.' + ext_name
def get_ext_filename (self, ext_name):
from distutils import sysconfig
if package:
ext_name = package + '.' + ext_name
ext_path = string.split (ext_name, '.')
return apply (os.path.join, ext_path) + sysconfig.SO