--- a/contrib/python-zstandard/setup_zstd.py Tue Sep 25 20:55:03 2018 +0900
+++ b/contrib/python-zstandard/setup_zstd.py Mon Oct 08 16:27:40 2018 -0700
@@ -6,12 +6,12 @@
import distutils.ccompiler
import os
-import sys
from distutils.extension import Extension
zstd_sources = ['zstd/%s' % p for p in (
+ 'common/debug.c',
'common/entropy_common.c',
'common/error_private.c',
'common/fse_decompress.c',
@@ -20,6 +20,7 @@
'common/xxhash.c',
'common/zstd_common.c',
'compress/fse_compress.c',
+ 'compress/hist.c',
'compress/huf_compress.c',
'compress/zstd_compress.c',
'compress/zstd_double_fast.c',
@@ -32,6 +33,7 @@
'decompress/zstd_decompress.c',
'dictBuilder/cover.c',
'dictBuilder/divsufsort.c',
+ 'dictBuilder/fastcover.c',
'dictBuilder/zdict.c',
)]
@@ -75,6 +77,7 @@
'c-ext/compressobj.c',
'c-ext/compressor.c',
'c-ext/compressoriterator.c',
+ 'c-ext/compressionchunker.c',
'c-ext/compressionparams.c',
'c-ext/compressionreader.c',
'c-ext/compressionwriter.c',
@@ -93,25 +96,45 @@
def get_c_extension(support_legacy=False, system_zstd=False, name='zstd',
- warnings_as_errors=False):
- """Obtain a distutils.extension.Extension for the C extension."""
- root = os.path.abspath(os.path.dirname(__file__))
+ warnings_as_errors=False, root=None):
+ """Obtain a distutils.extension.Extension for the C extension.
+
+ ``support_legacy`` controls whether to compile in legacy zstd format support.
+
+ ``system_zstd`` controls whether to compile against the system zstd library.
+ For this to work, the system zstd library and headers must match what
+ python-zstandard is coded against exactly.
+
+ ``name`` is the module name of the C extension to produce.
+
+ ``warnings_as_errors`` controls whether compiler warnings are turned into
+ compiler errors.
- sources = set([os.path.join(root, p) for p in ext_sources])
+ ``root`` defines a root path that source should be computed as relative
+ to. This should be the directory with the main ``setup.py`` that is
+ being invoked. If not defined, paths will be relative to this file.
+ """
+ actual_root = os.path.abspath(os.path.dirname(__file__))
+ root = root or actual_root
+
+ sources = set([os.path.join(actual_root, p) for p in ext_sources])
if not system_zstd:
- sources.update([os.path.join(root, p) for p in zstd_sources])
+ sources.update([os.path.join(actual_root, p) for p in zstd_sources])
if support_legacy:
- sources.update([os.path.join(root, p) for p in zstd_sources_legacy])
+ sources.update([os.path.join(actual_root, p)
+ for p in zstd_sources_legacy])
sources = list(sources)
- include_dirs = set([os.path.join(root, d) for d in ext_includes])
+ include_dirs = set([os.path.join(actual_root, d) for d in ext_includes])
if not system_zstd:
- include_dirs.update([os.path.join(root, d) for d in zstd_includes])
+ include_dirs.update([os.path.join(actual_root, d)
+ for d in zstd_includes])
if support_legacy:
- include_dirs.update([os.path.join(root, d) for d in zstd_includes_legacy])
+ include_dirs.update([os.path.join(actual_root, d)
+ for d in zstd_includes_legacy])
include_dirs = list(include_dirs)
- depends = [os.path.join(root, p) for p in zstd_depends]
+ depends = [os.path.join(actual_root, p) for p in zstd_depends]
compiler = distutils.ccompiler.new_compiler()
@@ -152,6 +175,11 @@
libraries = ['zstd'] if system_zstd else []
+ # Python 3.7 doesn't like absolute paths. So normalize to relative.
+ sources = [os.path.relpath(p, root) for p in sources]
+ include_dirs = [os.path.relpath(p, root) for p in include_dirs]
+ depends = [os.path.relpath(p, root) for p in depends]
+
# TODO compile with optimizations.
return Extension(name, sources,
include_dirs=include_dirs,