| Index: third_party/cython/src/Tools/site_scons/site_tools/pyext.py
|
| diff --git a/third_party/cython/src/Tools/site_scons/site_tools/pyext.py b/third_party/cython/src/Tools/site_scons/site_tools/pyext.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..edcf6afae9e5ff302715c252bb6615a18879a696
|
| --- /dev/null
|
| +++ b/third_party/cython/src/Tools/site_scons/site_tools/pyext.py
|
| @@ -0,0 +1,236 @@
|
| +"""SCons.Tool.pyext
|
| +
|
| +Tool-specific initialization for python extensions builder.
|
| +
|
| +AUTHORS:
|
| + - David Cournapeau
|
| + - Dag Sverre Seljebotn
|
| +
|
| +"""
|
| +
|
| +#
|
| +# __COPYRIGHT__
|
| +#
|
| +# Permission is hereby granted, free of charge, to any person obtaining
|
| +# a copy of this software and associated documentation files (the
|
| +# "Software"), to deal in the Software without restriction, including
|
| +# without limitation the rights to use, copy, modify, merge, publish,
|
| +# distribute, sublicense, and/or sell copies of the Software, and to
|
| +# permit persons to whom the Software is furnished to do so, subject to
|
| +# the following conditions:
|
| +#
|
| +# The above copyright notice and this permission notice shall be included
|
| +# in all copies or substantial portions of the Software.
|
| +#
|
| +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
| +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
| +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
| +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
| +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
| +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
| +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
| +#
|
| +
|
| +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
|
| +
|
| +import sys
|
| +
|
| +import SCons
|
| +from SCons.Tool import SourceFileScanner, ProgramScanner
|
| +
|
| +# Create common python builders
|
| +
|
| +def createPythonObjectBuilder(env):
|
| + """This is a utility function that creates the PythonObject Builder in an
|
| + Environment if it is not there already.
|
| +
|
| + If it is already there, we return the existing one.
|
| + """
|
| +
|
| + try:
|
| + pyobj = env['BUILDERS']['PythonObject']
|
| + except KeyError:
|
| + pyobj = SCons.Builder.Builder(action = {},
|
| + emitter = {},
|
| + prefix = '$PYEXTOBJPREFIX',
|
| + suffix = '$PYEXTOBJSUFFIX',
|
| + src_builder = ['CFile', 'CXXFile'],
|
| + source_scanner = SourceFileScanner,
|
| + single_source = 1)
|
| + env['BUILDERS']['PythonObject'] = pyobj
|
| +
|
| + return pyobj
|
| +
|
| +def createPythonExtensionBuilder(env):
|
| + """This is a utility function that creates the PythonExtension Builder in
|
| + an Environment if it is not there already.
|
| +
|
| + If it is already there, we return the existing one.
|
| + """
|
| +
|
| + try:
|
| + pyext = env['BUILDERS']['PythonExtension']
|
| + except KeyError:
|
| + import SCons.Action
|
| + import SCons.Defaults
|
| + action = SCons.Action.Action("$PYEXTLINKCOM", "$PYEXTLINKCOMSTR")
|
| + action_list = [ SCons.Defaults.SharedCheck,
|
| + action]
|
| + pyext = SCons.Builder.Builder(action = action_list,
|
| + emitter = "$SHLIBEMITTER",
|
| + prefix = '$PYEXTPREFIX',
|
| + suffix = '$PYEXTSUFFIX',
|
| + target_scanner = ProgramScanner,
|
| + src_suffix = '$PYEXTOBJSUFFIX',
|
| + src_builder = 'PythonObject')
|
| + env['BUILDERS']['PythonExtension'] = pyext
|
| +
|
| + return pyext
|
| +
|
| +def pyext_coms(platform):
|
| + """Return PYEXTCCCOM, PYEXTCXXCOM and PYEXTLINKCOM for the given
|
| + platform."""
|
| + if platform == 'win32':
|
| + pyext_cccom = "$PYEXTCC /Fo$TARGET /c $PYEXTCCSHARED "\
|
| + "$PYEXTCFLAGS $PYEXTCCFLAGS $_CCCOMCOM "\
|
| + "$_PYEXTCPPINCFLAGS $SOURCES"
|
| + pyext_cxxcom = "$PYEXTCXX /Fo$TARGET /c $PYEXTCSHARED "\
|
| + "$PYEXTCXXFLAGS $PYEXTCCFLAGS $_CCCOMCOM "\
|
| + "$_PYEXTCPPINCFLAGS $SOURCES"
|
| + pyext_linkcom = '${TEMPFILE("$PYEXTLINK $PYEXTLINKFLAGS '\
|
| + '/OUT:$TARGET.windows $( $_LIBDIRFLAGS $) '\
|
| + '$_LIBFLAGS $_PYEXTRUNTIME $SOURCES.windows")}'
|
| + else:
|
| + pyext_cccom = "$PYEXTCC -o $TARGET -c $PYEXTCCSHARED "\
|
| + "$PYEXTCFLAGS $PYEXTCCFLAGS $_CCCOMCOM "\
|
| + "$_PYEXTCPPINCFLAGS $SOURCES"
|
| + pyext_cxxcom = "$PYEXTCXX -o $TARGET -c $PYEXTCSHARED "\
|
| + "$PYEXTCXXFLAGS $PYEXTCCFLAGS $_CCCOMCOM "\
|
| + "$_PYEXTCPPINCFLAGS $SOURCES"
|
| + pyext_linkcom = "$PYEXTLINK -o $TARGET $PYEXTLINKFLAGS "\
|
| + "$SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_PYEXTRUNTIME"
|
| +
|
| + if platform == 'darwin':
|
| + pyext_linkcom += ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS'
|
| +
|
| + return pyext_cccom, pyext_cxxcom, pyext_linkcom
|
| +
|
| +def set_basic_vars(env):
|
| + # Set construction variables which are independant on whether we are using
|
| + # distutils or not.
|
| + env['PYEXTCPPPATH'] = SCons.Util.CLVar('$PYEXTINCPATH')
|
| +
|
| + env['_PYEXTCPPINCFLAGS'] = '$( ${_concat(INCPREFIX, PYEXTCPPPATH, '\
|
| + 'INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)'
|
| + env['PYEXTOBJSUFFIX'] = '$SHOBJSUFFIX'
|
| + env['PYEXTOBJPREFIX'] = '$SHOBJPREFIX'
|
| +
|
| + env['PYEXTRUNTIME'] = SCons.Util.CLVar("")
|
| + # XXX: this should be handled with different flags
|
| + env['_PYEXTRUNTIME'] = '$( ${_concat(LIBLINKPREFIX, PYEXTRUNTIME, '\
|
| + 'LIBLINKSUFFIX, __env__)} $)'
|
| + # XXX: This won't work in all cases (using mingw, for example). To make
|
| + # this work, we need to know whether PYEXTCC accepts /c and /Fo or -c -o.
|
| + # This is difficult with the current way tools work in scons.
|
| + pycc, pycxx, pylink = pyext_coms(sys.platform)
|
| +
|
| + env['PYEXTLINKFLAGSEND'] = SCons.Util.CLVar('$LINKFLAGSEND')
|
| +
|
| + env['PYEXTCCCOM'] = pycc
|
| + env['PYEXTCXXCOM'] = pycxx
|
| + env['PYEXTLINKCOM'] = pylink
|
| +
|
| +def _set_configuration_nodistutils(env):
|
| + # Set env variables to sensible values when not using distutils
|
| + def_cfg = {'PYEXTCC' : '$SHCC',
|
| + 'PYEXTCFLAGS' : '$SHCFLAGS',
|
| + 'PYEXTCCFLAGS' : '$SHCCFLAGS',
|
| + 'PYEXTCXX' : '$SHCXX',
|
| + 'PYEXTCXXFLAGS' : '$SHCXXFLAGS',
|
| + 'PYEXTLINK' : '$LDMODULE',
|
| + 'PYEXTSUFFIX' : '$LDMODULESUFFIX',
|
| + 'PYEXTPREFIX' : ''}
|
| +
|
| + if sys.platform == 'darwin':
|
| + def_cfg['PYEXTSUFFIX'] = '.so'
|
| +
|
| + for k, v in def_cfg.items():
|
| + ifnotset(env, k, v)
|
| +
|
| + ifnotset(env, 'PYEXT_ALLOW_UNDEFINED',
|
| + SCons.Util.CLVar('$ALLOW_UNDEFINED'))
|
| + ifnotset(env, 'PYEXTLINKFLAGS', SCons.Util.CLVar('$LDMODULEFLAGS'))
|
| +
|
| + env.AppendUnique(PYEXTLINKFLAGS = env['PYEXT_ALLOW_UNDEFINED'])
|
| +
|
| +def ifnotset(env, name, value):
|
| + if not env.has_key(name):
|
| + env[name] = value
|
| +
|
| +def set_configuration(env, use_distutils):
|
| + """Set construction variables which are platform dependants.
|
| +
|
| + If use_distutils == True, use distutils configuration. Otherwise, use
|
| + 'sensible' default.
|
| +
|
| + Any variable already defined is untouched."""
|
| +
|
| + # We define commands as strings so that we can either execute them using
|
| + # eval (same python for scons and distutils) or by executing them through
|
| + # the shell.
|
| + dist_cfg = {'PYEXTCC': ("sysconfig.get_config_var('CC')", False),
|
| + 'PYEXTCFLAGS': ("sysconfig.get_config_var('CFLAGS')", True),
|
| + 'PYEXTCCSHARED': ("sysconfig.get_config_var('CCSHARED')", False),
|
| + 'PYEXTLINKFLAGS': ("sysconfig.get_config_var('LDFLAGS')", True),
|
| + 'PYEXTLINK': ("sysconfig.get_config_var('LDSHARED')", False),
|
| + 'PYEXTINCPATH': ("sysconfig.get_python_inc()", False),
|
| + 'PYEXTSUFFIX': ("sysconfig.get_config_var('SO')", False)}
|
| +
|
| + from distutils import sysconfig
|
| +
|
| + # We set the python path even when not using distutils, because we rarely
|
| + # want to change this, even if not using distutils
|
| + ifnotset(env, 'PYEXTINCPATH', sysconfig.get_python_inc())
|
| +
|
| + if use_distutils:
|
| + for k, (v, should_split) in dist_cfg.items():
|
| + val = eval(v)
|
| + if should_split:
|
| + val = val.split()
|
| + ifnotset(env, k, val)
|
| + else:
|
| + _set_configuration_nodistutils(env)
|
| +
|
| +def generate(env):
|
| + """Add Builders and construction variables for python extensions to an
|
| + Environment."""
|
| +
|
| + if not env.has_key('PYEXT_USE_DISTUTILS'):
|
| + env['PYEXT_USE_DISTUTILS'] = False
|
| +
|
| + # This sets all constructions variables used for pyext builders.
|
| + set_basic_vars(env)
|
| +
|
| + set_configuration(env, env['PYEXT_USE_DISTUTILS'])
|
| +
|
| + # Create the PythonObject builder
|
| + pyobj = createPythonObjectBuilder(env)
|
| + action = SCons.Action.Action("$PYEXTCCCOM", "$PYEXTCCCOMSTR")
|
| + pyobj.add_emitter('.c', SCons.Defaults.SharedObjectEmitter)
|
| + pyobj.add_action('.c', action)
|
| +
|
| + action = SCons.Action.Action("$PYEXTCXXCOM", "$PYEXTCXXCOMSTR")
|
| + pyobj.add_emitter('$CXXFILESUFFIX', SCons.Defaults.SharedObjectEmitter)
|
| + pyobj.add_action('$CXXFILESUFFIX', action)
|
| +
|
| + # Create the PythonExtension builder
|
| + createPythonExtensionBuilder(env)
|
| +
|
| +def exists(env):
|
| + try:
|
| + # This is not quite right: if someone defines all variables by himself,
|
| + # it would work without distutils
|
| + from distutils import sysconfig
|
| + return True
|
| + except ImportError:
|
| + return False
|
|
|