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:
parent
42a3bf564a
commit
e51d69efb0
|
@ -43,8 +43,13 @@ class build_ext (Command):
|
||||||
# in between initialize_options() and finalize_options())
|
# in between initialize_options() and finalize_options())
|
||||||
|
|
||||||
user_options = [
|
user_options = [
|
||||||
('build-dir=', 'd',
|
('build-lib=', 'b',
|
||||||
"directory for compiled extension modules"),
|
"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',
|
('include-dirs=', 'I',
|
||||||
"list of directories to search for header files"),
|
"list of directories to search for header files"),
|
||||||
('define=', 'D',
|
('define=', 'D',
|
||||||
|
@ -66,7 +71,9 @@ class build_ext (Command):
|
||||||
|
|
||||||
def initialize_options (self):
|
def initialize_options (self):
|
||||||
self.extensions = None
|
self.extensions = None
|
||||||
self.build_dir = None
|
self.build_lib = None
|
||||||
|
self.build_temp = None
|
||||||
|
self.inplace = 0
|
||||||
self.package = None
|
self.package = None
|
||||||
|
|
||||||
self.include_dirs = None
|
self.include_dirs = None
|
||||||
|
@ -83,7 +90,8 @@ class build_ext (Command):
|
||||||
from distutils import sysconfig
|
from distutils import sysconfig
|
||||||
|
|
||||||
self.set_undefined_options ('build',
|
self.set_undefined_options ('build',
|
||||||
('build_platlib', 'build_dir'),
|
('build_lib', 'build_lib'),
|
||||||
|
('build_temp', 'build_temp'),
|
||||||
('debug', 'debug'))
|
('debug', 'debug'))
|
||||||
|
|
||||||
if self.package is None:
|
if self.package is None:
|
||||||
|
@ -227,7 +235,8 @@ class build_ext (Command):
|
||||||
# precedent!)
|
# precedent!)
|
||||||
macros = build_info.get ('macros')
|
macros = build_info.get ('macros')
|
||||||
include_dirs = build_info.get ('include_dirs')
|
include_dirs = build_info.get ('include_dirs')
|
||||||
self.compiler.compile (sources,
|
objects = self.compiler.compile (sources,
|
||||||
|
output_dir=self.build_temp,
|
||||||
macros=macros,
|
macros=macros,
|
||||||
include_dirs=include_dirs,
|
include_dirs=include_dirs,
|
||||||
debug=self.debug)
|
debug=self.debug)
|
||||||
|
@ -235,7 +244,6 @@ class build_ext (Command):
|
||||||
# Now link the object files together into a "shared object" --
|
# Now link the object files together into a "shared object" --
|
||||||
# of course, first we have to figure out all the other things
|
# of course, first we have to figure out all the other things
|
||||||
# that go into the mix.
|
# that go into the mix.
|
||||||
objects = self.compiler.object_filenames (sources)
|
|
||||||
extra_objects = build_info.get ('extra_objects')
|
extra_objects = build_info.get ('extra_objects')
|
||||||
if extra_objects:
|
if extra_objects:
|
||||||
objects.extend (extra_objects)
|
objects.extend (extra_objects)
|
||||||
|
@ -257,12 +265,25 @@ class build_ext (Command):
|
||||||
else:
|
else:
|
||||||
modname = string.split (extension_name, '.')[-1]
|
modname = string.split (extension_name, '.')[-1]
|
||||||
extra_args.append('/export:init%s'%modname)
|
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,
|
self.compiler.link_shared_object (objects, ext_filename,
|
||||||
libraries=libraries,
|
libraries=libraries,
|
||||||
library_dirs=library_dirs,
|
library_dirs=library_dirs,
|
||||||
|
@ -272,10 +293,14 @@ class build_ext (Command):
|
||||||
# build_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
|
from distutils import sysconfig
|
||||||
if package:
|
|
||||||
ext_name = package + '.' + ext_name
|
|
||||||
ext_path = string.split (ext_name, '.')
|
ext_path = string.split (ext_name, '.')
|
||||||
return apply (os.path.join, ext_path) + sysconfig.SO
|
return apply (os.path.join, ext_path) + sysconfig.SO
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue