setup_zstd.py
218 lines
| 6.2 KiB
| text/x-python
|
PythonLexer
Gregory Szorc
|
r30435 | # Copyright (c) 2016-present, Gregory Szorc | ||
# All rights reserved. | ||||
# | ||||
# This software may be modified and distributed under the terms | ||||
# of the BSD license. See the LICENSE file for details. | ||||
Gregory Szorc
|
r37513 | import distutils.ccompiler | ||
Gregory Szorc
|
r30435 | import os | ||
Gregory Szorc
|
r37513 | |||
Gregory Szorc
|
r30435 | from distutils.extension import Extension | ||
Gregory Szorc
|
r44446 | zstd_sources = [ | ||
"zstd/%s" % p | ||||
for p in ( | ||||
"common/debug.c", | ||||
"common/entropy_common.c", | ||||
"common/error_private.c", | ||||
"common/fse_decompress.c", | ||||
"common/pool.c", | ||||
"common/threading.c", | ||||
"common/xxhash.c", | ||||
"common/zstd_common.c", | ||||
"compress/fse_compress.c", | ||||
"compress/hist.c", | ||||
"compress/huf_compress.c", | ||||
"compress/zstd_compress_literals.c", | ||||
"compress/zstd_compress_sequences.c", | ||||
"compress/zstd_compress.c", | ||||
"compress/zstd_double_fast.c", | ||||
"compress/zstd_fast.c", | ||||
"compress/zstd_lazy.c", | ||||
"compress/zstd_ldm.c", | ||||
"compress/zstd_opt.c", | ||||
"compress/zstdmt_compress.c", | ||||
"decompress/huf_decompress.c", | ||||
"decompress/zstd_ddict.c", | ||||
"decompress/zstd_decompress.c", | ||||
"decompress/zstd_decompress_block.c", | ||||
"dictBuilder/cover.c", | ||||
"dictBuilder/divsufsort.c", | ||||
"dictBuilder/fastcover.c", | ||||
"dictBuilder/zdict.c", | ||||
) | ||||
] | ||||
Gregory Szorc
|
r30435 | |||
Gregory Szorc
|
r44446 | zstd_sources_legacy = [ | ||
"zstd/%s" % p | ||||
for p in ( | ||||
"deprecated/zbuff_common.c", | ||||
"deprecated/zbuff_compress.c", | ||||
"deprecated/zbuff_decompress.c", | ||||
"legacy/zstd_v01.c", | ||||
"legacy/zstd_v02.c", | ||||
"legacy/zstd_v03.c", | ||||
"legacy/zstd_v04.c", | ||||
"legacy/zstd_v05.c", | ||||
"legacy/zstd_v06.c", | ||||
"legacy/zstd_v07.c", | ||||
) | ||||
] | ||||
Gregory Szorc
|
r30435 | |||
zstd_includes = [ | ||||
Gregory Szorc
|
r44446 | "zstd", | ||
"zstd/common", | ||||
"zstd/compress", | ||||
"zstd/decompress", | ||||
"zstd/dictBuilder", | ||||
Gregory Szorc
|
r30435 | ] | ||
Gregory Szorc
|
r30822 | zstd_includes_legacy = [ | ||
Gregory Szorc
|
r44446 | "zstd/deprecated", | ||
"zstd/legacy", | ||||
Gregory Szorc
|
r30822 | ] | ||
Gregory Szorc
|
r37513 | ext_includes = [ | ||
Gregory Szorc
|
r44446 | "c-ext", | ||
"zstd/common", | ||||
Gregory Szorc
|
r37513 | ] | ||
Gregory Szorc
|
r30435 | ext_sources = [ | ||
Gregory Szorc
|
r44446 | "zstd/common/error_private.c", | ||
"zstd/common/pool.c", | ||||
"zstd/common/threading.c", | ||||
"zstd/common/zstd_common.c", | ||||
"zstd.c", | ||||
"c-ext/bufferutil.c", | ||||
"c-ext/compressiondict.c", | ||||
"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", | ||||
"c-ext/constants.c", | ||||
"c-ext/decompressobj.c", | ||||
"c-ext/decompressor.c", | ||||
"c-ext/decompressoriterator.c", | ||||
"c-ext/decompressionreader.c", | ||||
"c-ext/decompressionwriter.c", | ||||
"c-ext/frameparams.c", | ||||
Gregory Szorc
|
r30435 | ] | ||
Gregory Szorc
|
r30822 | zstd_depends = [ | ||
Gregory Szorc
|
r44446 | "c-ext/python-zstandard.h", | ||
Gregory Szorc
|
r30822 | ] | ||
Gregory Szorc
|
r30435 | |||
Gregory Szorc
|
r30822 | |||
Gregory Szorc
|
r44446 | def get_c_extension( | ||
support_legacy=False, | ||||
system_zstd=False, | ||||
name="zstd", | ||||
warnings_as_errors=False, | ||||
root=None, | ||||
): | ||||
Gregory Szorc
|
r40157 | """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. | ||||
Gregory Szorc
|
r30435 | |||
Gregory Szorc
|
r40157 | ``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]) | ||||
Gregory Szorc
|
r37513 | if not system_zstd: | ||
Gregory Szorc
|
r40157 | sources.update([os.path.join(actual_root, p) for p in zstd_sources]) | ||
Gregory Szorc
|
r37513 | if support_legacy: | ||
Gregory Szorc
|
r44605 | sources.update( | ||
[os.path.join(actual_root, p) for p in zstd_sources_legacy] | ||||
) | ||||
Gregory Szorc
|
r37513 | sources = list(sources) | ||
Gregory Szorc
|
r30822 | |||
Gregory Szorc
|
r40157 | include_dirs = set([os.path.join(actual_root, d) for d in ext_includes]) | ||
Gregory Szorc
|
r37513 | if not system_zstd: | ||
Joerg Sonnenberger
|
r51424 | from distutils import sysconfig | ||
from shlex import quote | ||||
includes = [] | ||||
for incdir in [os.path.join(actual_root, d) for d in zstd_includes]: | ||||
includes.append('-I' + quote(incdir)) | ||||
include_dirs.add(incdir) | ||||
config_vars = sysconfig.get_config_vars() | ||||
config_vars['CFLAGS'] = ' '.join( | ||||
includes + [config_vars.get('CFLAGS', '')] | ||||
Gregory Szorc
|
r44605 | ) | ||
Gregory Szorc
|
r37513 | if support_legacy: | ||
Gregory Szorc
|
r44446 | include_dirs.update( | ||
[os.path.join(actual_root, d) for d in zstd_includes_legacy] | ||||
) | ||||
Gregory Szorc
|
r37513 | include_dirs = list(include_dirs) | ||
Gregory Szorc
|
r30822 | |||
Gregory Szorc
|
r40157 | depends = [os.path.join(actual_root, p) for p in zstd_depends] | ||
Gregory Szorc
|
r30435 | |||
Gregory Szorc
|
r37513 | compiler = distutils.ccompiler.new_compiler() | ||
# Needed for MSVC. | ||||
Gregory Szorc
|
r44446 | if hasattr(compiler, "initialize"): | ||
Gregory Szorc
|
r37513 | compiler.initialize() | ||
Gregory Szorc
|
r44446 | if compiler.compiler_type == "unix": | ||
compiler_type = "unix" | ||||
elif compiler.compiler_type == "msvc": | ||||
compiler_type = "msvc" | ||||
elif compiler.compiler_type == "mingw32": | ||||
compiler_type = "mingw32" | ||||
Gregory Szorc
|
r37513 | else: | ||
Gregory Szorc
|
r44446 | raise Exception("unhandled compiler type: %s" % compiler.compiler_type) | ||
Gregory Szorc
|
r37513 | |||
Gregory Szorc
|
r44446 | extra_args = ["-DZSTD_MULTITHREAD"] | ||
Gregory Szorc
|
r31796 | |||
Gregory Szorc
|
r37513 | if not system_zstd: | ||
Gregory Szorc
|
r44446 | extra_args.append("-DZSTDLIB_VISIBILITY=") | ||
extra_args.append("-DZDICTLIB_VISIBILITY=") | ||||
extra_args.append("-DZSTDERRORLIB_VISIBILITY=") | ||||
Gregory Szorc
|
r37513 | |||
Gregory Szorc
|
r44446 | if compiler_type == "unix": | ||
extra_args.append("-fvisibility=hidden") | ||||
Gregory Szorc
|
r37513 | |||
if not system_zstd and support_legacy: | ||||
Gregory Szorc
|
r44446 | extra_args.append("-DZSTD_LEGACY_SUPPORT=1") | ||
Gregory Szorc
|
r31796 | |||
Gregory Szorc
|
r37513 | if warnings_as_errors: | ||
Gregory Szorc
|
r44446 | if compiler_type in ("unix", "mingw32"): | ||
extra_args.append("-Werror") | ||||
elif compiler_type == "msvc": | ||||
extra_args.append("/WX") | ||||
Gregory Szorc
|
r37513 | else: | ||
assert False | ||||
Gregory Szorc
|
r44446 | libraries = ["zstd"] if system_zstd else [] | ||
Gregory Szorc
|
r37513 | |||
Gregory Szorc
|
r40157 | # 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] | ||||
Gregory Szorc
|
r30435 | # TODO compile with optimizations. | ||
Gregory Szorc
|
r44446 | return Extension( | ||
name, | ||||
sources, | ||||
include_dirs=include_dirs, | ||||
depends=depends, | ||||
extra_compile_args=extra_args, | ||||
libraries=libraries, | ||||
) | ||||