contrib/python-zstandard/setup_zstd.py
changeset 37495 b1fb341d8a61
parent 31796 e0dc40530c5a
child 38186 c0081d3e1598
equal deleted inserted replaced
37494:1ce7a55b09d1 37495:b1fb341d8a61
     2 # All rights reserved.
     2 # All rights reserved.
     3 #
     3 #
     4 # This software may be modified and distributed under the terms
     4 # This software may be modified and distributed under the terms
     5 # of the BSD license. See the LICENSE file for details.
     5 # of the BSD license. See the LICENSE file for details.
     6 
     6 
       
     7 import distutils.ccompiler
     7 import os
     8 import os
       
     9 import sys
       
    10 
     8 from distutils.extension import Extension
    11 from distutils.extension import Extension
     9 
    12 
    10 
    13 
    11 zstd_sources = ['zstd/%s' % p for p in (
    14 zstd_sources = ['zstd/%s' % p for p in (
    12     'common/entropy_common.c',
    15     'common/entropy_common.c',
    17     'common/xxhash.c',
    20     'common/xxhash.c',
    18     'common/zstd_common.c',
    21     'common/zstd_common.c',
    19     'compress/fse_compress.c',
    22     'compress/fse_compress.c',
    20     'compress/huf_compress.c',
    23     'compress/huf_compress.c',
    21     'compress/zstd_compress.c',
    24     'compress/zstd_compress.c',
       
    25     'compress/zstd_double_fast.c',
       
    26     'compress/zstd_fast.c',
       
    27     'compress/zstd_lazy.c',
       
    28     'compress/zstd_ldm.c',
       
    29     'compress/zstd_opt.c',
    22     'compress/zstdmt_compress.c',
    30     'compress/zstdmt_compress.c',
    23     'decompress/huf_decompress.c',
    31     'decompress/huf_decompress.c',
    24     'decompress/zstd_decompress.c',
    32     'decompress/zstd_decompress.c',
    25     'dictBuilder/cover.c',
    33     'dictBuilder/cover.c',
    26     'dictBuilder/divsufsort.c',
    34     'dictBuilder/divsufsort.c',
    39     'legacy/zstd_v06.c',
    47     'legacy/zstd_v06.c',
    40     'legacy/zstd_v07.c'
    48     'legacy/zstd_v07.c'
    41 )]
    49 )]
    42 
    50 
    43 zstd_includes = [
    51 zstd_includes = [
    44     'c-ext',
       
    45     'zstd',
    52     'zstd',
    46     'zstd/common',
    53     'zstd/common',
    47     'zstd/compress',
    54     'zstd/compress',
    48     'zstd/decompress',
    55     'zstd/decompress',
    49     'zstd/dictBuilder',
    56     'zstd/dictBuilder',
    52 zstd_includes_legacy = [
    59 zstd_includes_legacy = [
    53     'zstd/deprecated',
    60     'zstd/deprecated',
    54     'zstd/legacy',
    61     'zstd/legacy',
    55 ]
    62 ]
    56 
    63 
       
    64 ext_includes = [
       
    65     'c-ext',
       
    66     'zstd/common',
       
    67 ]
       
    68 
    57 ext_sources = [
    69 ext_sources = [
       
    70     'zstd/common/pool.c',
       
    71     'zstd/common/threading.c',
    58     'zstd.c',
    72     'zstd.c',
    59     'c-ext/bufferutil.c',
    73     'c-ext/bufferutil.c',
    60     'c-ext/compressiondict.c',
    74     'c-ext/compressiondict.c',
    61     'c-ext/compressobj.c',
    75     'c-ext/compressobj.c',
    62     'c-ext/compressor.c',
    76     'c-ext/compressor.c',
    63     'c-ext/compressoriterator.c',
    77     'c-ext/compressoriterator.c',
    64     'c-ext/compressionparams.c',
    78     'c-ext/compressionparams.c',
       
    79     'c-ext/compressionreader.c',
    65     'c-ext/compressionwriter.c',
    80     'c-ext/compressionwriter.c',
    66     'c-ext/constants.c',
    81     'c-ext/constants.c',
    67     'c-ext/decompressobj.c',
    82     'c-ext/decompressobj.c',
    68     'c-ext/decompressor.c',
    83     'c-ext/decompressor.c',
    69     'c-ext/decompressoriterator.c',
    84     'c-ext/decompressoriterator.c',
       
    85     'c-ext/decompressionreader.c',
    70     'c-ext/decompressionwriter.c',
    86     'c-ext/decompressionwriter.c',
    71     'c-ext/frameparams.c',
    87     'c-ext/frameparams.c',
    72 ]
    88 ]
    73 
    89 
    74 zstd_depends = [
    90 zstd_depends = [
    75     'c-ext/python-zstandard.h',
    91     'c-ext/python-zstandard.h',
    76 ]
    92 ]
    77 
    93 
    78 
    94 
    79 def get_c_extension(support_legacy=False, name='zstd'):
    95 def get_c_extension(support_legacy=False, system_zstd=False, name='zstd',
       
    96                     warnings_as_errors=False):
    80     """Obtain a distutils.extension.Extension for the C extension."""
    97     """Obtain a distutils.extension.Extension for the C extension."""
    81     root = os.path.abspath(os.path.dirname(__file__))
    98     root = os.path.abspath(os.path.dirname(__file__))
    82 
    99 
    83     sources = [os.path.join(root, p) for p in zstd_sources + ext_sources]
   100     sources = set([os.path.join(root, p) for p in ext_sources])
    84     if support_legacy:
   101     if not system_zstd:
    85         sources.extend([os.path.join(root, p) for p in zstd_sources_legacy])
   102         sources.update([os.path.join(root, p) for p in zstd_sources])
       
   103         if support_legacy:
       
   104             sources.update([os.path.join(root, p) for p in zstd_sources_legacy])
       
   105     sources = list(sources)
    86 
   106 
    87     include_dirs = [os.path.join(root, d) for d in zstd_includes]
   107     include_dirs = set([os.path.join(root, d) for d in ext_includes])
    88     if support_legacy:
   108     if not system_zstd:
    89         include_dirs.extend([os.path.join(root, d) for d in zstd_includes_legacy])
   109         include_dirs.update([os.path.join(root, d) for d in zstd_includes])
       
   110         if support_legacy:
       
   111             include_dirs.update([os.path.join(root, d) for d in zstd_includes_legacy])
       
   112     include_dirs = list(include_dirs)
    90 
   113 
    91     depends = [os.path.join(root, p) for p in zstd_depends]
   114     depends = [os.path.join(root, p) for p in zstd_depends]
    92 
   115 
       
   116     compiler = distutils.ccompiler.new_compiler()
       
   117 
       
   118     # Needed for MSVC.
       
   119     if hasattr(compiler, 'initialize'):
       
   120         compiler.initialize()
       
   121 
       
   122     if compiler.compiler_type == 'unix':
       
   123         compiler_type = 'unix'
       
   124     elif compiler.compiler_type == 'msvc':
       
   125         compiler_type = 'msvc'
       
   126     else:
       
   127         raise Exception('unhandled compiler type: %s' %
       
   128                         compiler.compiler_type)
       
   129 
    93     extra_args = ['-DZSTD_MULTITHREAD']
   130     extra_args = ['-DZSTD_MULTITHREAD']
    94 
   131 
    95     if support_legacy:
   132     if not system_zstd:
       
   133         extra_args.append('-DZSTDLIB_VISIBILITY=')
       
   134         extra_args.append('-DZDICTLIB_VISIBILITY=')
       
   135         extra_args.append('-DZSTDERRORLIB_VISIBILITY=')
       
   136 
       
   137         if compiler_type == 'unix':
       
   138             extra_args.append('-fvisibility=hidden')
       
   139 
       
   140     if not system_zstd and support_legacy:
    96         extra_args.append('-DZSTD_LEGACY_SUPPORT=1')
   141         extra_args.append('-DZSTD_LEGACY_SUPPORT=1')
       
   142 
       
   143     if warnings_as_errors:
       
   144         if compiler_type == 'unix':
       
   145             extra_args.append('-Werror')
       
   146         elif compiler_type == 'msvc':
       
   147             extra_args.append('/WX')
       
   148         else:
       
   149             assert False
       
   150 
       
   151     libraries = ['zstd'] if system_zstd else []
    97 
   152 
    98     # TODO compile with optimizations.
   153     # TODO compile with optimizations.
    99     return Extension(name, sources,
   154     return Extension(name, sources,
   100                      include_dirs=include_dirs,
   155                      include_dirs=include_dirs,
   101                      depends=depends,
   156                      depends=depends,
   102                      extra_compile_args=extra_args)
   157                      extra_compile_args=extra_args,
       
   158                      libraries=libraries)