Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
nexedi
cython
Commits
849d829a
Commit
849d829a
authored
Sep 10, 2016
by
scoder
Committed by
GitHub
Sep 10, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1456 from robertwb/distutils
Replace old build_ext with new cythonize(...) version.
parents
ae7b046b
87e72124
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
375 additions
and
367 deletions
+375
-367
CHANGES.rst
CHANGES.rst
+3
-1
Cython/Build/Dependencies.py
Cython/Build/Dependencies.py
+4
-1
Cython/Build/Distutils.py
Cython/Build/Distutils.py
+1
-13
Cython/Debugger/Tests/TestLibCython.py
Cython/Debugger/Tests/TestLibCython.py
+1
-5
Cython/Distutils/build_ext.py
Cython/Distutils/build_ext.py
+17
-341
Cython/Distutils/old_build_ext.py
Cython/Distutils/old_build_ext.py
+343
-0
pyximport/pyxbuild.py
pyximport/pyxbuild.py
+4
-4
tests/build/compile_env_distutils.srctree
tests/build/compile_env_distutils.srctree
+2
-2
No files found.
CHANGES.rst
View file @
849d829a
...
...
@@ -59,7 +59,9 @@ Other changes
the current jupyter kernel. The language level can be set explicitly with
"%%cython -2" or "%%cython -3".
* Usage of ``Cython.Distutils.build_ext`` is now discouraged.
* The distutils extension ``Cython.Distutils.build_ext`` has now been updated
to use cythonize which properly handles dependencies. The old extension can
still be found in ``Cython.Distutils.old_build_ext`` and is now deprecated.
0.24.1 (2016-07-15)
...
...
Cython/Build/Dependencies.py
View file @
849d829a
...
...
@@ -3,6 +3,7 @@ from __future__ import absolute_import, print_function
import
cython
from
..
import
__version__
import
collections
import
re
,
os
,
sys
,
time
from
glob
import
iglob
...
...
@@ -642,7 +643,9 @@ def create_extension_list(patterns, exclude=None, ctx=None, aliases=None, quiet=
print
(
'Please put "# distutils: language=%s" in your .pyx or .pxd file(s)'
%
language
)
if
exclude
is
None
:
exclude
=
[]
if
not
isinstance
(
patterns
,
(
list
,
tuple
)):
if
patterns
is
None
:
return
[],
{}
elif
isinstance
(
patterns
,
basestring
)
or
not
isinstance
(
patterns
,
collections
.
Iterable
):
patterns
=
[
patterns
]
explicit_modules
=
set
([
m
.
name
for
m
in
patterns
if
isinstance
(
m
,
Extension
)])
seen
=
set
()
...
...
Cython/Build/Distutils.py
View file @
849d829a
import
sys
from
.Dependencies
import
cythonize
if
'setuptools'
in
sys
.
modules
:
from
setuptools.command
import
build_ext
as
_build_ext
else
:
from
distutils.command
import
build_ext
as
_build_ext
class
build_ext
(
_build_ext
.
build_ext
,
object
):
def
finalize_options
(
self
):
self
.
distribution
.
ext_modules
[:]
=
cythonize
(
self
.
distribution
.
ext_modules
)
super
(
build_ext
,
self
).
finalize_options
()
from
Cython.Distutils.build_ext
import
build_ext
Cython/Debugger/Tests/TestLibCython.py
View file @
849d829a
...
...
@@ -14,7 +14,7 @@ from distutils import ccompiler
import
runtests
import
Cython.Distutils.extension
import
Cython.Distutils.build_ext
import
Cython.Distutils.
old_build_ext
as
build_ext
from
Cython.Debugger
import
Cygdb
as
cygdb
root
=
os
.
path
.
dirname
(
os
.
path
.
abspath
(
__file__
))
...
...
@@ -24,10 +24,6 @@ cfuncs_file = os.path.join(root, 'cfuncs.c')
with
open
(
codefile
)
as
f
:
source_to_lineno
=
dict
((
line
.
strip
(),
i
+
1
)
for
i
,
line
in
enumerate
(
f
))
# Cython.Distutils.__init__ imports build_ext from build_ext which means we
# can't access the module anymore. Get it from sys.modules instead.
build_ext
=
sys
.
modules
[
'Cython.Distutils.build_ext'
]
have_gdb
=
None
def
test_gdb
():
...
...
Cython/Distutils/build_ext.py
View file @
849d829a
"""Cython.Distutils.build_ext
Implements a version of the Distutils 'build_ext' command, for
building Cython extension modules."""
# This module should be kept compatible with Python 2.3.
__revision__
=
"$Id:$"
import
inspect
import
sys
import
os
from
distutils.errors
import
DistutilsPlatformError
from
distutils.dep_util
import
newer
,
newer_group
from
distutils
import
log
from
distutils.command
import
build_ext
as
_build_ext
from
distutils
import
sysconfig
import
warnings
try
:
from_setuptools
=
'setuptools/extension.py'
in
inspect
.
getouterframes
(
inspect
.
currentframe
(),
2
)[
2
][
1
]
except
Exception
:
from_setuptools
=
False
if
not
from_setuptools
:
warnings
.
warn
(
"Cython.Distutils.build_ext does not properly handle dependencies "
"and is deprectated. Use Cython.Build.build_ext instead."
)
try
:
from
__builtin__
import
basestring
except
ImportError
:
basestring
=
str
extension_name_re
=
_build_ext
.
extension_name_re
show_compilers
=
_build_ext
.
show_compilers
class
Optimization
(
object
):
def
__init__
(
self
):
self
.
flags
=
(
'OPT'
,
'CFLAGS'
,
'CPPFLAGS'
,
'EXTRA_CFLAGS'
,
'BASECFLAGS'
,
'PY_CFLAGS'
,
)
self
.
state
=
sysconfig
.
get_config_vars
(
*
self
.
flags
)
self
.
config_vars
=
sysconfig
.
get_config_vars
()
def
disable_optimization
(
self
):
"disable optimization for the C or C++ compiler"
badoptions
=
(
'-O1'
,
'-O2'
,
'-O3'
)
for
flag
,
option
in
zip
(
self
.
flags
,
self
.
state
):
if
option
is
not
None
:
L
=
[
opt
for
opt
in
option
.
split
()
if
opt
not
in
badoptions
]
self
.
config_vars
[
flag
]
=
' '
.
join
(
L
)
def
restore_state
(
self
):
"restore the original state"
for
flag
,
option
in
zip
(
self
.
flags
,
self
.
state
):
if
option
is
not
None
:
self
.
config_vars
[
flag
]
=
option
optimization
=
Optimization
()
class
build_ext
(
_build_ext
.
build_ext
):
description
=
"build C/C++ and Cython extensions (compile/link to build directory)"
sep_by
=
_build_ext
.
build_ext
.
sep_by
user_options
=
_build_ext
.
build_ext
.
user_options
boolean_options
=
_build_ext
.
build_ext
.
boolean_options
help_options
=
_build_ext
.
build_ext
.
help_options
# Add the pyrex specific data.
user_options
.
extend
([
(
'cython-cplus'
,
None
,
"generate C++ source files"
),
(
'cython-create-listing'
,
None
,
"write errors to a listing file"
),
(
'cython-line-directives'
,
None
,
"emit source line directives"
),
(
'cython-include-dirs='
,
None
,
"path to the Cython include files"
+
sep_by
),
(
'cython-c-in-temp'
,
None
,
"put generated C files in temp directory"
),
(
'cython-gen-pxi'
,
None
,
"generate .pxi file for public declarations"
),
(
'cython-directives='
,
None
,
"compiler directive overrides"
),
(
'cython-gdb'
,
None
,
"generate debug information for cygdb"
),
(
'cython-compile-time-env'
,
None
,
"cython compile time environment"
),
# For backwards compatibility.
(
'pyrex-cplus'
,
None
,
"generate C++ source files"
),
(
'pyrex-create-listing'
,
None
,
"write errors to a listing file"
),
(
'pyrex-line-directives'
,
None
,
"emit source line directives"
),
(
'pyrex-include-dirs='
,
None
,
"path to the Cython include files"
+
sep_by
),
(
'pyrex-c-in-temp'
,
None
,
"put generated C files in temp directory"
),
(
'pyrex-gen-pxi'
,
None
,
"generate .pxi file for public declarations"
),
(
'pyrex-directives='
,
None
,
"compiler directive overrides"
),
(
'pyrex-gdb'
,
None
,
"generate debug information for cygdb"
),
])
boolean_options
.
extend
([
'cython-cplus'
,
'cython-create-listing'
,
'cython-line-directives'
,
'cython-c-in-temp'
,
'cython-gdb'
,
# For backwards compatibility.
'pyrex-cplus'
,
'pyrex-create-listing'
,
'pyrex-line-directives'
,
'pyrex-c-in-temp'
,
'pyrex-gdb'
,
])
def
initialize_options
(
self
):
_build_ext
.
build_ext
.
initialize_options
(
self
)
self
.
cython_cplus
=
0
self
.
cython_create_listing
=
0
self
.
cython_line_directives
=
0
self
.
cython_include_dirs
=
None
self
.
cython_directives
=
None
self
.
cython_c_in_temp
=
0
self
.
cython_gen_pxi
=
0
self
.
cython_gdb
=
False
self
.
no_c_in_traceback
=
0
self
.
cython_compile_time_env
=
None
def
__getattr__
(
self
,
name
):
if
name
[:
6
]
==
'pyrex_'
:
return
getattr
(
self
,
'cython_'
+
name
[
6
:])
else
:
return
_build_ext
.
build_ext
.
__getattr__
(
self
,
name
)
def
__setattr__
(
self
,
name
,
value
):
if
name
[:
6
]
==
'pyrex_'
:
return
setattr
(
self
,
'cython_'
+
name
[
6
:],
value
)
else
:
# _build_ext.build_ext.__setattr__(self, name, value)
self
.
__dict__
[
name
]
=
value
def
finalize_options
(
self
):
_build_ext
.
build_ext
.
finalize_options
(
self
)
if
self
.
cython_include_dirs
is
None
:
self
.
cython_include_dirs
=
[]
elif
isinstance
(
self
.
cython_include_dirs
,
basestring
):
self
.
cython_include_dirs
=
\
self
.
cython_include_dirs
.
split
(
os
.
pathsep
)
if
self
.
cython_directives
is
None
:
self
.
cython_directives
=
{}
# finalize_options ()
def
run
(
self
):
# We have one shot at this before build_ext initializes the compiler.
# If --pyrex-gdb is in effect as a command line option or as option
# of any Extension module, disable optimization for the C or C++
# compiler.
if
self
.
cython_gdb
or
[
1
for
ext
in
self
.
extensions
if
getattr
(
ext
,
'cython_gdb'
,
False
)]:
optimization
.
disable_optimization
()
_build_ext
.
build_ext
.
run
(
self
)
def
build_extensions
(
self
):
# First, sanity-check the 'extensions' list
self
.
check_extensions_list
(
self
.
extensions
)
for
ext
in
self
.
extensions
:
ext
.
sources
=
self
.
cython_sources
(
ext
.
sources
,
ext
)
self
.
build_extension
(
ext
)
def
cython_sources
(
self
,
sources
,
extension
):
"""
Walk the list of source files in 'sources', looking for Cython
source files (.pyx and .py). Run Cython on all that are
found, and return a modified 'sources' list with Cython source
files replaced by the generated C (or C++) files.
"""
try
:
from
Cython.Compiler.Main
\
import
CompilationOptions
,
\
default_options
as
cython_default_options
,
\
compile
as
cython_compile
from
Cython.Compiler.Errors
import
PyrexError
except
ImportError
:
e
=
sys
.
exc_info
()[
1
]
print
(
"failed to import Cython: %s"
%
e
)
raise
DistutilsPlatformError
(
"Cython does not appear to be installed"
)
new_sources
=
[]
cython_sources
=
[]
cython_targets
=
{}
# Setup create_list and cplus from the extension options if
# Cython.Distutils.extension.Extension is used, otherwise just
# use what was parsed from the command-line or the configuration file.
# cplus will also be set to true is extension.language is equal to
# 'C++' or 'c++'.
#try:
# create_listing = self.cython_create_listing or \
# extension.cython_create_listing
# cplus = self.cython_cplus or \
# extension.cython_cplus or \
# (extension.language != None and \
# extension.language.lower() == 'c++')
#except AttributeError:
# create_listing = self.cython_create_listing
# cplus = self.cython_cplus or \
# (extension.language != None and \
# extension.language.lower() == 'c++')
create_listing
=
self
.
cython_create_listing
or
\
getattr
(
extension
,
'cython_create_listing'
,
0
)
line_directives
=
self
.
cython_line_directives
or
\
getattr
(
extension
,
'cython_line_directives'
,
0
)
no_c_in_traceback
=
self
.
no_c_in_traceback
or
\
getattr
(
extension
,
'no_c_in_traceback'
,
0
)
cplus
=
self
.
cython_cplus
or
getattr
(
extension
,
'cython_cplus'
,
0
)
or
\
(
extension
.
language
and
extension
.
language
.
lower
()
==
'c++'
)
cython_gen_pxi
=
self
.
cython_gen_pxi
or
getattr
(
extension
,
'cython_gen_pxi'
,
0
)
cython_gdb
=
self
.
cython_gdb
or
getattr
(
extension
,
'cython_gdb'
,
False
)
cython_compile_time_env
=
self
.
cython_compile_time_env
or
\
getattr
(
extension
,
'cython_compile_time_env'
,
None
)
# Set up the include_path for the Cython compiler:
# 1. Start with the command line option.
# 2. Add in any (unique) paths from the extension
# cython_include_dirs (if Cython.Distutils.extension is used).
# 3. Add in any (unique) paths from the extension include_dirs
includes
=
self
.
cython_include_dirs
try
:
for
i
in
extension
.
cython_include_dirs
:
if
not
i
in
includes
:
includes
.
append
(
i
)
except
AttributeError
:
pass
# In case extension.include_dirs is a generator, evaluate it and keep
# result
extension
.
include_dirs
=
list
(
extension
.
include_dirs
)
for
i
in
extension
.
include_dirs
:
if
not
i
in
includes
:
includes
.
append
(
i
)
# Set up Cython compiler directives:
# 1. Start with the command line option.
# 2. Add in any (unique) entries from the extension
# cython_directives (if Cython.Distutils.extension is used).
directives
=
self
.
cython_directives
if
hasattr
(
extension
,
"cython_directives"
):
directives
.
update
(
extension
.
cython_directives
)
# Set the target_ext to '.c'. Cython will change this to '.cpp' if
# needed.
if
cplus
:
target_ext
=
'.cpp'
else
:
target_ext
=
'.c'
# Decide whether to drop the generated C files into the temp dir
# or the source tree.
if
not
self
.
inplace
and
(
self
.
cython_c_in_temp
or
getattr
(
extension
,
'cython_c_in_temp'
,
0
)):
target_dir
=
os
.
path
.
join
(
self
.
build_temp
,
"pyrex"
)
for
package_name
in
extension
.
name
.
split
(
'.'
)[:
-
1
]:
target_dir
=
os
.
path
.
join
(
target_dir
,
package_name
)
else
:
target_dir
=
None
newest_dependency
=
None
for
source
in
sources
:
(
base
,
ext
)
=
os
.
path
.
splitext
(
os
.
path
.
basename
(
source
))
if
ext
==
".py"
:
# FIXME: we might want to special case this some more
ext
=
'.pyx'
if
ext
==
".pyx"
:
# Cython source file
output_dir
=
target_dir
or
os
.
path
.
dirname
(
source
)
new_sources
.
append
(
os
.
path
.
join
(
output_dir
,
base
+
target_ext
))
cython_sources
.
append
(
source
)
cython_targets
[
source
]
=
new_sources
[
-
1
]
elif
ext
==
'.pxi'
or
ext
==
'.pxd'
:
if
newest_dependency
is
None
\
or
newer
(
source
,
newest_dependency
):
newest_dependency
=
source
else
:
new_sources
.
append
(
source
)
if
not
cython_sources
:
return
new_sources
module_name
=
extension
.
name
for
source
in
cython_sources
:
target
=
cython_targets
[
source
]
depends
=
[
source
]
+
list
(
extension
.
depends
or
())
if
(
source
[
-
4
:].
lower
()
==
".pyx"
and
os
.
path
.
isfile
(
source
[:
-
3
]
+
"pxd"
)):
depends
+=
[
source
[:
-
3
]
+
"pxd"
]
rebuild
=
self
.
force
or
newer_group
(
depends
,
target
,
'newer'
)
if
not
rebuild
and
newest_dependency
is
not
None
:
rebuild
=
newer
(
newest_dependency
,
target
)
if
rebuild
:
log
.
info
(
"cythoning %s to %s"
,
source
,
target
)
self
.
mkpath
(
os
.
path
.
dirname
(
target
))
if
self
.
inplace
:
output_dir
=
os
.
curdir
else
:
output_dir
=
self
.
build_lib
options
=
CompilationOptions
(
cython_default_options
,
use_listing_file
=
create_listing
,
include_path
=
includes
,
compiler_directives
=
directives
,
output_file
=
target
,
cplus
=
cplus
,
emit_linenums
=
line_directives
,
c_line_in_traceback
=
not
no_c_in_traceback
,
generate_pxi
=
cython_gen_pxi
,
output_dir
=
output_dir
,
gdb_debug
=
cython_gdb
,
compile_time_env
=
cython_compile_time_env
)
result
=
cython_compile
(
source
,
options
=
options
,
full_module_name
=
module_name
)
else
:
log
.
info
(
"skipping '%s' Cython extension (up-to-date)"
,
target
)
return
new_sources
# cython_sources ()
# class build_ext
if
'setuptools'
in
sys
.
modules
:
try
:
from
setuptools.command
import
build_ext
as
_build_ext
except
ImportError
:
# We may be in the process of importing setuptools, which tries
# to import this.
from
distutils.command
import
build_ext
as
_build_ext
else
:
from
distutils.command
import
build_ext
as
_build_ext
class
build_ext
(
_build_ext
.
build_ext
,
object
):
def
finalize_options
(
self
):
if
self
.
distribution
.
ext_modules
:
from
Cython.Build.Dependencies
import
cythonize
self
.
distribution
.
ext_modules
[:]
=
cythonize
(
self
.
distribution
.
ext_modules
)
super
(
build_ext
,
self
).
finalize_options
()
Cython/Distutils/old_build_ext.py
0 → 100644
View file @
849d829a
"""Cython.Distutils.old_build_ext
Implements a version of the Distutils 'build_ext' command, for
building Cython extension modules."""
# This module should be kept compatible with Python 2.3.
__revision__
=
"$Id:$"
import
inspect
import
sys
import
os
from
distutils.errors
import
DistutilsPlatformError
from
distutils.dep_util
import
newer
,
newer_group
from
distutils
import
log
from
distutils.command
import
build_ext
as
_build_ext
from
distutils
import
sysconfig
import
warnings
try
:
from_setuptools
=
'setuptools/extension.py'
in
inspect
.
getouterframes
(
inspect
.
currentframe
(),
2
)[
2
][
1
]
except
Exception
:
from_setuptools
=
False
if
not
from_setuptools
:
warnings
.
warn
(
"Cython.Distutils.old_build_ext does not properly handle dependencies "
"and is deprectated."
)
try
:
from
__builtin__
import
basestring
except
ImportError
:
basestring
=
str
extension_name_re
=
_build_ext
.
extension_name_re
show_compilers
=
_build_ext
.
show_compilers
class
Optimization
(
object
):
def
__init__
(
self
):
self
.
flags
=
(
'OPT'
,
'CFLAGS'
,
'CPPFLAGS'
,
'EXTRA_CFLAGS'
,
'BASECFLAGS'
,
'PY_CFLAGS'
,
)
self
.
state
=
sysconfig
.
get_config_vars
(
*
self
.
flags
)
self
.
config_vars
=
sysconfig
.
get_config_vars
()
def
disable_optimization
(
self
):
"disable optimization for the C or C++ compiler"
badoptions
=
(
'-O1'
,
'-O2'
,
'-O3'
)
for
flag
,
option
in
zip
(
self
.
flags
,
self
.
state
):
if
option
is
not
None
:
L
=
[
opt
for
opt
in
option
.
split
()
if
opt
not
in
badoptions
]
self
.
config_vars
[
flag
]
=
' '
.
join
(
L
)
def
restore_state
(
self
):
"restore the original state"
for
flag
,
option
in
zip
(
self
.
flags
,
self
.
state
):
if
option
is
not
None
:
self
.
config_vars
[
flag
]
=
option
optimization
=
Optimization
()
class
old_build_ext
(
_build_ext
.
build_ext
):
description
=
"build C/C++ and Cython extensions (compile/link to build directory)"
sep_by
=
_build_ext
.
build_ext
.
sep_by
user_options
=
_build_ext
.
build_ext
.
user_options
boolean_options
=
_build_ext
.
build_ext
.
boolean_options
help_options
=
_build_ext
.
build_ext
.
help_options
# Add the pyrex specific data.
user_options
.
extend
([
(
'cython-cplus'
,
None
,
"generate C++ source files"
),
(
'cython-create-listing'
,
None
,
"write errors to a listing file"
),
(
'cython-line-directives'
,
None
,
"emit source line directives"
),
(
'cython-include-dirs='
,
None
,
"path to the Cython include files"
+
sep_by
),
(
'cython-c-in-temp'
,
None
,
"put generated C files in temp directory"
),
(
'cython-gen-pxi'
,
None
,
"generate .pxi file for public declarations"
),
(
'cython-directives='
,
None
,
"compiler directive overrides"
),
(
'cython-gdb'
,
None
,
"generate debug information for cygdb"
),
(
'cython-compile-time-env'
,
None
,
"cython compile time environment"
),
# For backwards compatibility.
(
'pyrex-cplus'
,
None
,
"generate C++ source files"
),
(
'pyrex-create-listing'
,
None
,
"write errors to a listing file"
),
(
'pyrex-line-directives'
,
None
,
"emit source line directives"
),
(
'pyrex-include-dirs='
,
None
,
"path to the Cython include files"
+
sep_by
),
(
'pyrex-c-in-temp'
,
None
,
"put generated C files in temp directory"
),
(
'pyrex-gen-pxi'
,
None
,
"generate .pxi file for public declarations"
),
(
'pyrex-directives='
,
None
,
"compiler directive overrides"
),
(
'pyrex-gdb'
,
None
,
"generate debug information for cygdb"
),
])
boolean_options
.
extend
([
'cython-cplus'
,
'cython-create-listing'
,
'cython-line-directives'
,
'cython-c-in-temp'
,
'cython-gdb'
,
# For backwards compatibility.
'pyrex-cplus'
,
'pyrex-create-listing'
,
'pyrex-line-directives'
,
'pyrex-c-in-temp'
,
'pyrex-gdb'
,
])
def
initialize_options
(
self
):
_build_ext
.
build_ext
.
initialize_options
(
self
)
self
.
cython_cplus
=
0
self
.
cython_create_listing
=
0
self
.
cython_line_directives
=
0
self
.
cython_include_dirs
=
None
self
.
cython_directives
=
None
self
.
cython_c_in_temp
=
0
self
.
cython_gen_pxi
=
0
self
.
cython_gdb
=
False
self
.
no_c_in_traceback
=
0
self
.
cython_compile_time_env
=
None
def
__getattr__
(
self
,
name
):
if
name
[:
6
]
==
'pyrex_'
:
return
getattr
(
self
,
'cython_'
+
name
[
6
:])
else
:
return
_build_ext
.
build_ext
.
__getattr__
(
self
,
name
)
def
__setattr__
(
self
,
name
,
value
):
if
name
[:
6
]
==
'pyrex_'
:
return
setattr
(
self
,
'cython_'
+
name
[
6
:],
value
)
else
:
# _build_ext.build_ext.__setattr__(self, name, value)
self
.
__dict__
[
name
]
=
value
def
finalize_options
(
self
):
_build_ext
.
build_ext
.
finalize_options
(
self
)
if
self
.
cython_include_dirs
is
None
:
self
.
cython_include_dirs
=
[]
elif
isinstance
(
self
.
cython_include_dirs
,
basestring
):
self
.
cython_include_dirs
=
\
self
.
cython_include_dirs
.
split
(
os
.
pathsep
)
if
self
.
cython_directives
is
None
:
self
.
cython_directives
=
{}
# finalize_options ()
def
run
(
self
):
# We have one shot at this before build_ext initializes the compiler.
# If --pyrex-gdb is in effect as a command line option or as option
# of any Extension module, disable optimization for the C or C++
# compiler.
if
self
.
cython_gdb
or
[
1
for
ext
in
self
.
extensions
if
getattr
(
ext
,
'cython_gdb'
,
False
)]:
optimization
.
disable_optimization
()
_build_ext
.
build_ext
.
run
(
self
)
def
build_extensions
(
self
):
# First, sanity-check the 'extensions' list
self
.
check_extensions_list
(
self
.
extensions
)
for
ext
in
self
.
extensions
:
ext
.
sources
=
self
.
cython_sources
(
ext
.
sources
,
ext
)
self
.
build_extension
(
ext
)
def
cython_sources
(
self
,
sources
,
extension
):
"""
Walk the list of source files in 'sources', looking for Cython
source files (.pyx and .py). Run Cython on all that are
found, and return a modified 'sources' list with Cython source
files replaced by the generated C (or C++) files.
"""
try
:
from
Cython.Compiler.Main
\
import
CompilationOptions
,
\
default_options
as
cython_default_options
,
\
compile
as
cython_compile
from
Cython.Compiler.Errors
import
PyrexError
except
ImportError
:
e
=
sys
.
exc_info
()[
1
]
print
(
"failed to import Cython: %s"
%
e
)
raise
DistutilsPlatformError
(
"Cython does not appear to be installed"
)
new_sources
=
[]
cython_sources
=
[]
cython_targets
=
{}
# Setup create_list and cplus from the extension options if
# Cython.Distutils.extension.Extension is used, otherwise just
# use what was parsed from the command-line or the configuration file.
# cplus will also be set to true is extension.language is equal to
# 'C++' or 'c++'.
#try:
# create_listing = self.cython_create_listing or \
# extension.cython_create_listing
# cplus = self.cython_cplus or \
# extension.cython_cplus or \
# (extension.language != None and \
# extension.language.lower() == 'c++')
#except AttributeError:
# create_listing = self.cython_create_listing
# cplus = self.cython_cplus or \
# (extension.language != None and \
# extension.language.lower() == 'c++')
create_listing
=
self
.
cython_create_listing
or
\
getattr
(
extension
,
'cython_create_listing'
,
0
)
line_directives
=
self
.
cython_line_directives
or
\
getattr
(
extension
,
'cython_line_directives'
,
0
)
no_c_in_traceback
=
self
.
no_c_in_traceback
or
\
getattr
(
extension
,
'no_c_in_traceback'
,
0
)
cplus
=
self
.
cython_cplus
or
getattr
(
extension
,
'cython_cplus'
,
0
)
or
\
(
extension
.
language
and
extension
.
language
.
lower
()
==
'c++'
)
cython_gen_pxi
=
self
.
cython_gen_pxi
or
getattr
(
extension
,
'cython_gen_pxi'
,
0
)
cython_gdb
=
self
.
cython_gdb
or
getattr
(
extension
,
'cython_gdb'
,
False
)
cython_compile_time_env
=
self
.
cython_compile_time_env
or
\
getattr
(
extension
,
'cython_compile_time_env'
,
None
)
# Set up the include_path for the Cython compiler:
# 1. Start with the command line option.
# 2. Add in any (unique) paths from the extension
# cython_include_dirs (if Cython.Distutils.extension is used).
# 3. Add in any (unique) paths from the extension include_dirs
includes
=
self
.
cython_include_dirs
try
:
for
i
in
extension
.
cython_include_dirs
:
if
not
i
in
includes
:
includes
.
append
(
i
)
except
AttributeError
:
pass
# In case extension.include_dirs is a generator, evaluate it and keep
# result
extension
.
include_dirs
=
list
(
extension
.
include_dirs
)
for
i
in
extension
.
include_dirs
:
if
not
i
in
includes
:
includes
.
append
(
i
)
# Set up Cython compiler directives:
# 1. Start with the command line option.
# 2. Add in any (unique) entries from the extension
# cython_directives (if Cython.Distutils.extension is used).
directives
=
self
.
cython_directives
if
hasattr
(
extension
,
"cython_directives"
):
directives
.
update
(
extension
.
cython_directives
)
# Set the target_ext to '.c'. Cython will change this to '.cpp' if
# needed.
if
cplus
:
target_ext
=
'.cpp'
else
:
target_ext
=
'.c'
# Decide whether to drop the generated C files into the temp dir
# or the source tree.
if
not
self
.
inplace
and
(
self
.
cython_c_in_temp
or
getattr
(
extension
,
'cython_c_in_temp'
,
0
)):
target_dir
=
os
.
path
.
join
(
self
.
build_temp
,
"pyrex"
)
for
package_name
in
extension
.
name
.
split
(
'.'
)[:
-
1
]:
target_dir
=
os
.
path
.
join
(
target_dir
,
package_name
)
else
:
target_dir
=
None
newest_dependency
=
None
for
source
in
sources
:
(
base
,
ext
)
=
os
.
path
.
splitext
(
os
.
path
.
basename
(
source
))
if
ext
==
".py"
:
# FIXME: we might want to special case this some more
ext
=
'.pyx'
if
ext
==
".pyx"
:
# Cython source file
output_dir
=
target_dir
or
os
.
path
.
dirname
(
source
)
new_sources
.
append
(
os
.
path
.
join
(
output_dir
,
base
+
target_ext
))
cython_sources
.
append
(
source
)
cython_targets
[
source
]
=
new_sources
[
-
1
]
elif
ext
==
'.pxi'
or
ext
==
'.pxd'
:
if
newest_dependency
is
None
\
or
newer
(
source
,
newest_dependency
):
newest_dependency
=
source
else
:
new_sources
.
append
(
source
)
if
not
cython_sources
:
return
new_sources
module_name
=
extension
.
name
for
source
in
cython_sources
:
target
=
cython_targets
[
source
]
depends
=
[
source
]
+
list
(
extension
.
depends
or
())
if
(
source
[
-
4
:].
lower
()
==
".pyx"
and
os
.
path
.
isfile
(
source
[:
-
3
]
+
"pxd"
)):
depends
+=
[
source
[:
-
3
]
+
"pxd"
]
rebuild
=
self
.
force
or
newer_group
(
depends
,
target
,
'newer'
)
if
not
rebuild
and
newest_dependency
is
not
None
:
rebuild
=
newer
(
newest_dependency
,
target
)
if
rebuild
:
log
.
info
(
"cythoning %s to %s"
,
source
,
target
)
self
.
mkpath
(
os
.
path
.
dirname
(
target
))
if
self
.
inplace
:
output_dir
=
os
.
curdir
else
:
output_dir
=
self
.
build_lib
options
=
CompilationOptions
(
cython_default_options
,
use_listing_file
=
create_listing
,
include_path
=
includes
,
compiler_directives
=
directives
,
output_file
=
target
,
cplus
=
cplus
,
emit_linenums
=
line_directives
,
c_line_in_traceback
=
not
no_c_in_traceback
,
generate_pxi
=
cython_gen_pxi
,
output_dir
=
output_dir
,
gdb_debug
=
cython_gdb
,
compile_time_env
=
cython_compile_time_env
)
result
=
cython_compile
(
source
,
options
=
options
,
full_module_name
=
module_name
)
else
:
log
.
info
(
"skipping '%s' Cython extension (up-to-date)"
,
target
)
return
new_sources
# cython_sources ()
# class build_ext
pyximport/pyxbuild.py
View file @
849d829a
...
...
@@ -10,7 +10,7 @@ from distutils.errors import DistutilsArgError, DistutilsError, CCompilerError
from
distutils.extension
import
Extension
from
distutils.util
import
grok_environment_error
try
:
from
Cython.Distutils
import
build_ext
from
Cython.Distutils
.old_build_ext
import
old_build_ext
as
build_ext
HAS_CYTHON
=
True
except
ImportError
:
HAS_CYTHON
=
False
...
...
@@ -22,7 +22,7 @@ _reloads={}
def
pyx_to_dll
(
filename
,
ext
=
None
,
force_rebuild
=
0
,
build_in_temp
=
False
,
pyxbuild_dir
=
None
,
setup_args
=
None
,
reload_support
=
False
,
inplace
=
False
):
"""Compile a PYX file to a DLL and return the name of the generated .so
"""Compile a PYX file to a DLL and return the name of the generated .so
or .dll ."""
assert
os
.
path
.
exists
(
filename
),
"Could not find %s"
%
os
.
path
.
abspath
(
filename
)
...
...
@@ -102,7 +102,7 @@ def pyx_to_dll(filename, ext=None, force_rebuild=0, build_in_temp=False, pyxbuil
dist
.
run_commands
()
so_path
=
obj_build_ext
.
get_outputs
()[
0
]
if
obj_build_ext
.
inplace
:
# Python distutils get_outputs()[ returns a wrong so_path
# Python distutils get_outputs()[ returns a wrong so_path
# when --inplace ; see http://bugs.python.org/issue5977
# workaround:
so_path
=
os
.
path
.
join
(
os
.
path
.
dirname
(
filename
),
...
...
@@ -139,7 +139,7 @@ def pyx_to_dll(filename, ext=None, force_rebuild=0, build_in_temp=False, pyxbuil
continue
break
else
:
# used up all 100 slots
# used up all 100 slots
raise
ImportError
(
"reload count for %s reached maximum"
%
org_path
)
_reloads
[
org_path
]
=
(
timestamp
,
so_path
,
count
)
return
so_path
...
...
tests/build/compile_env_distutils.srctree
View file @
849d829a
...
...
@@ -5,10 +5,10 @@ PYTHON -c "import a; import sys; sys.exit(a.compile_env_test())"
from distutils.core import setup
from Cython.Distutils.extension import Extension
from Cython.Distutils
import
build_ext
from Cython.Distutils
.old_build_ext import old_
build_ext
setup(
cmdclass = {'build_ext': build_ext},
cmdclass = {'build_ext':
old_
build_ext},
ext_modules = [Extension(
"a", ["a.pyx"],
pyrex_compile_time_env = {'TEST': True},
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment