Comment out ___XXXslice__ methods so we don't break Py3 tests.
[cython.git] / setup.py
index da55aa931072a92ab208229f870023a538870102..401a60fd825c36a9171c7c91518d614ff2035656 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -3,21 +3,16 @@ from distutils.sysconfig import get_python_lib
 import os, os.path
 import sys
 
-if 'sdist' in sys.argv:
+if 'sdist' in sys.argv and sys.platform != "win32" and sys.version_info >= (2,4):
     # Record the current revision in .hgrev
-    import subprocess # os.popen is cleaner but depricated
-    changset = subprocess.Popen("hg log --rev tip | grep changeset", 
-                                shell=True,
-                                stdout=subprocess.PIPE).stdout.read()
-    rev = changset.split(':')[-1].strip()
+    import subprocess # os.popen is cleaner but deprecated
+    changeset = subprocess.Popen("hg identify --id --rev tip".split(),
+                                 stdout=subprocess.PIPE).stdout.read()
+    rev = changeset.decode('ISO-8859-1').strip()
     hgrev = open('.hgrev', 'w')
     hgrev.write(rev)
     hgrev.close()
 
-compiler_dir = os.path.join(get_python_lib(prefix=''), 'Cython/Compiler')
-if sys.platform == "win32":
-    compiler_dir = compiler_dir[len(sys.prefix)+1:]
-
 if sys.platform == "darwin":
     # Don't create resource files on OS X tar.
     os.environ['COPY_EXTENDED_ATTRIBUTES_DISABLE'] = 'true'
@@ -41,23 +36,35 @@ if sys.version_info[0] >= 3:
     build_py.fixer_names = fixers
     add_command_class("build_py", build_py)
 
+pxd_include_dirs = [
+    directory for directory, dirs, files in os.walk('Cython/Includes')
+    if '__init__.pyx' in files or '__init__.pxd' in files
+    or directory == 'Cython/Includes' or directory == 'Cython/Includes/Deprecated']
+
+pxd_include_patterns = [
+    p+'/*.pxd' for p in pxd_include_dirs ] + [
+    p+'/*.pyx' for p in pxd_include_dirs ]
 
 if sys.version_info < (2,4):
+    install_base_dir = get_python_lib(prefix='')
     import glob
-    cython_dir = os.path.join(get_python_lib(prefix=''), 'Cython')
-    compiler_dir = os.path.join(cython_dir, 'Compiler')
+    patterns = pxd_include_patterns + [
+        'Cython/Plex/*.pxd',
+        'Cython/Compiler/*.pxd',
+        'Cython/Runtime/*.pyx'
+        ]
     setup_args['data_files'] = [
-        (cython_dir, [ f for pattern in
-                       ['Cython/Includes/*.pxd',
-                        'Cython/Plex/*.pxd',
-                        'Cython/Compiler/*.pxd',
-                        'Cython/Runtime/*.pyx']
-                       for f in glob.glob(pattern) ])]
+        (os.path.dirname(os.path.join(install_base_dir, pattern)),
+         [ f for f in glob.glob(pattern) ])
+        for pattern in patterns
+        ]
 else:
-    setup_args['package_data'] = {'Cython' : ['Includes/*.pxd',
-                                              'Plex/*.pxd',
-                                              'Compiler/*.pxd',
-                                              'Runtime/*.pyx']}
+    setup_args['package_data'] = {
+        'Cython.Plex'     : ['*.pxd'],
+        'Cython.Compiler' : ['*.pxd'],
+        'Cython.Runtime'  : ['*.pyx', '*.pxd'],
+        'Cython'          : [ p[7:] for p in pxd_include_patterns ],
+        }
 
 # This dict is used for passing extra arguments that are setuptools 
 # specific to setup
@@ -77,7 +84,7 @@ else:
     else:
         scripts = ["cython.py"]
 
-def compile_cython_modules():
+def compile_cython_modules(profile=False):
     source_root = os.path.abspath(os.path.dirname(__file__))
     compiled_modules = ["Cython.Plex.Scanners",
                         "Cython.Compiler.Scanning",
@@ -108,6 +115,10 @@ def compile_cython_modules():
                     del sys.modules[module]
                 sys.path.insert(0, os.path.join(source_root, self.build_lib))
 
+                if profile:
+                    from Cython.Compiler.Options import directive_defaults
+                    directive_defaults['profile'] = True
+                    print("Enabled profiling for the Cython binary modules")
                 build_ext_orig.build_extensions(self)
 
         setup_args['ext_modules'] = extensions
@@ -124,6 +135,10 @@ def compile_cython_modules():
                         print("Compilation of '%s' failed" % ext.sources[0])
             from Cython.Compiler.Main import compile
             from Cython import Utils
+            if profile:
+                from Cython.Compiler.Options import directive_defaults
+                directive_defaults['profile'] = True
+                print("Enabled profiling for the Cython binary modules")
             source_root = os.path.dirname(__file__)
             for module in compiled_modules:
                 source_file = os.path.join(source_root, *module.split('.'))
@@ -139,6 +154,12 @@ def compile_cython_modules():
                     result = compile(pyx_source_file)
                     c_source_file = result.c_file
                 if c_source_file:
+                    # Py2 distutils can't handle unicode file paths
+                    if isinstance(c_source_file, unicode):
+                        filename_encoding = sys.getfilesystemencoding()
+                        if filename_encoding is None:
+                            filename_encoding = sys.getdefaultencoding()
+                        c_source_file = c_source_file.encode(filename_encoding)
                     extensions.append(
                         Extension(module, sources = [c_source_file])
                         )
@@ -148,13 +169,24 @@ def compile_cython_modules():
                 setup_args['ext_modules'] = extensions
                 add_command_class("build_ext", build_ext)
         except Exception:
-            print("ERROR: %s" % sys.exc_info()[1])
-            print("Extension module compilation failed, using plain Python implementation")
+            print('''
+ERROR: %s
+
+Extension module compilation failed, looks like Cython cannot run
+properly on this system.  To work around this, pass the option
+"--no-cython-compile".  This will install a pure Python version of
+Cython without compiling its own sources.
+''' % sys.exc_info()[1])
+            raise
+
+cython_profile = '--cython-profile' in sys.argv
+if cython_profile:
+    sys.argv.remove('--cython-profile')
 
 try:
     sys.argv.remove("--no-cython-compile")
 except ValueError:
-    compile_cython_modules()
+    compile_cython_modules(cython_profile)
 
 setup_args.update(setuptools_extra_args)