Blame setup.py

Packit Service 214d95
# Copyright 2015 The Brotli Authors. All rights reserved.
Packit Service 214d95
#
Packit Service 214d95
# Distributed under MIT license.
Packit Service 214d95
# See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
Packit Service 214d95
Packit Service 214d95
import os
Packit Service 214d95
import platform
Packit Service 214d95
import re
Packit Service 214d95
import unittest
Packit Service 214d95
Packit Service 214d95
try:
Packit Service 214d95
    from setuptools import Extension
Packit Service 214d95
    from setuptools import setup
Packit Service 214d95
except:
Packit Service 214d95
    from distutils.core import Extension
Packit Service 214d95
    from distutils.core import setup
Packit Service 214d95
from distutils.command.build_ext import build_ext
Packit Service 214d95
from distutils import errors
Packit Service 214d95
from distutils import dep_util
Packit Service 214d95
from distutils import log
Packit Service 214d95
Packit Service 214d95
Packit Service 214d95
CURR_DIR = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
Packit Service 214d95
Packit Service 214d95
Packit Service 214d95
def get_version():
Packit Service 214d95
    """ Return BROTLI_VERSION string as defined in 'common/version.h' file. """
Packit Service 214d95
    version_file_path = os.path.join(CURR_DIR, 'c', 'common', 'version.h')
Packit Service 214d95
    version = 0
Packit Service 214d95
    with open(version_file_path, 'r') as f:
Packit Service 214d95
        for line in f:
Packit Service 214d95
            m = re.match(r'#define\sBROTLI_VERSION\s+0x([0-9a-fA-F]+)', line)
Packit Service 214d95
            if m:
Packit Service 214d95
                version = int(m.group(1), 16)
Packit Service 214d95
    if version == 0:
Packit Service 214d95
        return ''
Packit Service 214d95
    # Semantic version is calculated as (MAJOR << 24) | (MINOR << 12) | PATCH.
Packit Service 214d95
    major = version >> 24
Packit Service 214d95
    minor = (version >> 12) & 0xFFF
Packit Service 214d95
    patch = version & 0xFFF
Packit Service 214d95
    return '{0}.{1}.{2}'.format(major, minor, patch)
Packit Service 214d95
Packit Service 214d95
Packit Service 214d95
def get_test_suite():
Packit Service 214d95
    test_loader = unittest.TestLoader()
Packit Service 214d95
    test_suite = test_loader.discover('python', pattern='*_test.py')
Packit Service 214d95
    return test_suite
Packit Service 214d95
Packit Service 214d95
Packit Service 214d95
class BuildExt(build_ext):
Packit Service 214d95
Packit Service 214d95
    def get_source_files(self):
Packit Service 214d95
        filenames = build_ext.get_source_files(self)
Packit Service 214d95
        for ext in self.extensions:
Packit Service 214d95
            filenames.extend(ext.depends)
Packit Service 214d95
        return filenames
Packit Service 214d95
Packit Service 214d95
    def build_extension(self, ext):
Packit Service 214d95
        if ext.sources is None or not isinstance(ext.sources, (list, tuple)):
Packit Service 214d95
            raise errors.DistutilsSetupError(
Packit Service 214d95
                "in 'ext_modules' option (extension '%s'), "
Packit Service 214d95
                "'sources' must be present and must be "
Packit Service 214d95
                "a list of source filenames" % ext.name)
Packit Service 214d95
Packit Service 214d95
        ext_path = self.get_ext_fullpath(ext.name)
Packit Service 214d95
        depends = ext.sources + ext.depends
Packit Service 214d95
        if not (self.force or dep_util.newer_group(depends, ext_path, 'newer')):
Packit Service 214d95
            log.debug("skipping '%s' extension (up-to-date)", ext.name)
Packit Service 214d95
            return
Packit Service 214d95
        else:
Packit Service 214d95
            log.info("building '%s' extension", ext.name)
Packit Service 214d95
Packit Service 214d95
        c_sources = []
Packit Service 214d95
        cxx_sources = []
Packit Service 214d95
        for source in ext.sources:
Packit Service 214d95
            if source.endswith('.c'):
Packit Service 214d95
                c_sources.append(source)
Packit Service 214d95
            else:
Packit Service 214d95
                cxx_sources.append(source)
Packit Service 214d95
        extra_args = ext.extra_compile_args or []
Packit Service 214d95
Packit Service 214d95
        objects = []
Packit Service 214d95
        for lang, sources in (('c', c_sources), ('c++', cxx_sources)):
Packit Service 214d95
            if lang == 'c++':
Packit Service 214d95
                if self.compiler.compiler_type == 'msvc':
Packit Service 214d95
                    extra_args.append('/EHsc')
Packit Service 214d95
Packit Service 214d95
            macros = ext.define_macros[:]
Packit Service 214d95
            if platform.system() == 'Darwin':
Packit Service 214d95
                macros.append(('OS_MACOSX', '1'))
Packit Service 214d95
            elif self.compiler.compiler_type == 'mingw32':
Packit Service 214d95
                # On Windows Python 2.7, pyconfig.h defines "hypot" as "_hypot",
Packit Service 214d95
                # This clashes with GCC's cmath, and causes compilation errors when
Packit Service 214d95
                # building under MinGW: http://bugs.python.org/issue11566
Packit Service 214d95
                macros.append(('_hypot', 'hypot'))
Packit Service 214d95
            for undef in ext.undef_macros:
Packit Service 214d95
                macros.append((undef,))
Packit Service 214d95
Packit Service 214d95
            objs = self.compiler.compile(
Packit Service 214d95
                sources,
Packit Service 214d95
                output_dir=self.build_temp,
Packit Service 214d95
                macros=macros,
Packit Service 214d95
                include_dirs=ext.include_dirs,
Packit Service 214d95
                debug=self.debug,
Packit Service 214d95
                extra_postargs=extra_args,
Packit Service 214d95
                depends=ext.depends)
Packit Service 214d95
            objects.extend(objs)
Packit Service 214d95
Packit Service 214d95
        self._built_objects = objects[:]
Packit Service 214d95
        if ext.extra_objects:
Packit Service 214d95
            objects.extend(ext.extra_objects)
Packit Service 214d95
        extra_args = ext.extra_link_args or []
Packit Service 214d95
        # when using GCC on Windows, we statically link libgcc and libstdc++,
Packit Service 214d95
        # so that we don't need to package extra DLLs
Packit Service 214d95
        if self.compiler.compiler_type == 'mingw32':
Packit Service 214d95
            extra_args.extend(['-static-libgcc', '-static-libstdc++'])
Packit Service 214d95
Packit Service 214d95
        ext_path = self.get_ext_fullpath(ext.name)
Packit Service 214d95
        # Detect target language, if not provided
Packit Service 214d95
        language = ext.language or self.compiler.detect_language(sources)
Packit Service 214d95
Packit Service 214d95
        self.compiler.link_shared_object(
Packit Service 214d95
            objects,
Packit Service 214d95
            ext_path,
Packit Service 214d95
            libraries=self.get_libraries(ext),
Packit Service 214d95
            library_dirs=ext.library_dirs,
Packit Service 214d95
            runtime_library_dirs=ext.runtime_library_dirs,
Packit Service 214d95
            extra_postargs=extra_args,
Packit Service 214d95
            export_symbols=self.get_export_symbols(ext),
Packit Service 214d95
            debug=self.debug,
Packit Service 214d95
            build_temp=self.build_temp,
Packit Service 214d95
            target_lang=language)
Packit Service 214d95
Packit Service 214d95
Packit Service 214d95
NAME = 'Brotli'
Packit Service 214d95
Packit Service 214d95
VERSION = get_version()
Packit Service 214d95
Packit Service 214d95
URL = 'https://github.com/google/brotli'
Packit Service 214d95
Packit Service 214d95
DESCRIPTION = 'Python bindings for the Brotli compression library'
Packit Service 214d95
Packit Service 214d95
AUTHOR = 'The Brotli Authors'
Packit Service 214d95
Packit Service 214d95
LICENSE = 'Apache 2.0'
Packit Service 214d95
Packit Service 214d95
PLATFORMS = ['Posix', 'MacOS X', 'Windows']
Packit Service 214d95
Packit Service 214d95
CLASSIFIERS = [
Packit Service 214d95
    'Development Status :: 4 - Beta',
Packit Service 214d95
    'Environment :: Console',
Packit Service 214d95
    'Intended Audience :: Developers',
Packit Service 214d95
    'License :: OSI Approved :: Apache Software License',
Packit Service 214d95
    'Operating System :: MacOS :: MacOS X',
Packit Service 214d95
    'Operating System :: Microsoft :: Windows',
Packit Service 214d95
    'Operating System :: POSIX :: Linux',
Packit Service 214d95
    'Programming Language :: C',
Packit Service 214d95
    'Programming Language :: C++',
Packit Service 214d95
    'Programming Language :: Python',
Packit Service 214d95
    'Programming Language :: Python :: 2',
Packit Service 214d95
    'Programming Language :: Python :: 2.7',
Packit Service 214d95
    'Programming Language :: Python :: 3',
Packit Service 214d95
    'Programming Language :: Python :: 3.3',
Packit Service 214d95
    'Programming Language :: Python :: 3.4',
Packit Service 214d95
    'Programming Language :: Python :: 3.5',
Packit Service 214d95
    'Programming Language :: Unix Shell',
Packit Service 214d95
    'Topic :: Software Development :: Libraries',
Packit Service 214d95
    'Topic :: Software Development :: Libraries :: Python Modules',
Packit Service 214d95
    'Topic :: System :: Archiving',
Packit Service 214d95
    'Topic :: System :: Archiving :: Compression',
Packit Service 214d95
    'Topic :: Text Processing :: Fonts',
Packit Service 214d95
    'Topic :: Utilities',
Packit Service 214d95
]
Packit Service 214d95
Packit Service 214d95
PACKAGE_DIR = {'': 'python'}
Packit Service 214d95
Packit Service 214d95
PY_MODULES = ['brotli']
Packit Service 214d95
Packit Service 214d95
EXT_MODULES = [
Packit Service 214d95
    Extension(
Packit Service 214d95
        '_brotli',
Packit Service 214d95
        sources=[
Packit Service 214d95
            'python/_brotli.cc',
rpm-build beeab0
            'c/common/constants.c',
Packit Service 214d95
            'c/common/dictionary.c',
Packit Service 214d95
            'c/common/transform.c',
Packit Service 214d95
            'c/dec/bit_reader.c',
Packit Service 214d95
            'c/dec/decode.c',
Packit Service 214d95
            'c/dec/huffman.c',
Packit Service 214d95
            'c/dec/state.c',
Packit Service 214d95
            'c/enc/backward_references.c',
Packit Service 214d95
            'c/enc/backward_references_hq.c',
Packit Service 214d95
            'c/enc/bit_cost.c',
Packit Service 214d95
            'c/enc/block_splitter.c',
Packit Service 214d95
            'c/enc/brotli_bit_stream.c',
Packit Service 214d95
            'c/enc/cluster.c',
Packit Service 214d95
            'c/enc/compress_fragment.c',
Packit Service 214d95
            'c/enc/compress_fragment_two_pass.c',
Packit Service 214d95
            'c/enc/dictionary_hash.c',
Packit Service 214d95
            'c/enc/encode.c',
Packit Service 214d95
            'c/enc/encoder_dict.c',
Packit Service 214d95
            'c/enc/entropy_encode.c',
Packit Service 214d95
            'c/enc/histogram.c',
Packit Service 214d95
            'c/enc/literal_cost.c',
Packit Service 214d95
            'c/enc/memory.c',
Packit Service 214d95
            'c/enc/metablock.c',
Packit Service 214d95
            'c/enc/static_dict.c',
Packit Service 214d95
            'c/enc/utf8_util.c',
Packit Service 214d95
        ],
Packit Service 214d95
        depends=[
Packit Service 214d95
            'c/common/constants.h',
Packit Service 214d95
            'c/common/context.h',
Packit Service 214d95
            'c/common/dictionary.h',
Packit Service 214d95
            'c/common/platform.h',
Packit Service 214d95
            'c/common/transform.h',
Packit Service 214d95
            'c/common/version.h',
Packit Service 214d95
            'c/dec/bit_reader.h',
Packit Service 214d95
            'c/dec/huffman.h',
Packit Service 214d95
            'c/dec/prefix.h',
Packit Service 214d95
            'c/dec/state.h',
Packit Service 214d95
            'c/enc/backward_references.h',
Packit Service 214d95
            'c/enc/backward_references_hq.h',
Packit Service 214d95
            'c/enc/backward_references_inc.h',
Packit Service 214d95
            'c/enc/bit_cost.h',
Packit Service 214d95
            'c/enc/bit_cost_inc.h',
Packit Service 214d95
            'c/enc/block_encoder_inc.h',
Packit Service 214d95
            'c/enc/block_splitter.h',
Packit Service 214d95
            'c/enc/block_splitter_inc.h',
Packit Service 214d95
            'c/enc/brotli_bit_stream.h',
Packit Service 214d95
            'c/enc/cluster.h',
Packit Service 214d95
            'c/enc/cluster_inc.h',
Packit Service 214d95
            'c/enc/command.h',
Packit Service 214d95
            'c/enc/compress_fragment.h',
Packit Service 214d95
            'c/enc/compress_fragment_two_pass.h',
Packit Service 214d95
            'c/enc/dictionary_hash.h',
Packit Service 214d95
            'c/enc/encoder_dict.h',
Packit Service 214d95
            'c/enc/entropy_encode.h',
Packit Service 214d95
            'c/enc/entropy_encode_static.h',
Packit Service 214d95
            'c/enc/fast_log.h',
Packit Service 214d95
            'c/enc/find_match_length.h',
Packit Service 214d95
            'c/enc/hash.h',
Packit Service 214d95
            'c/enc/hash_composite_inc.h',
Packit Service 214d95
            'c/enc/hash_forgetful_chain_inc.h',
Packit Service 214d95
            'c/enc/hash_longest_match64_inc.h',
Packit Service 214d95
            'c/enc/hash_longest_match_inc.h',
Packit Service 214d95
            'c/enc/hash_longest_match_quickly_inc.h',
Packit Service 214d95
            'c/enc/hash_rolling_inc.h',
Packit Service 214d95
            'c/enc/hash_to_binary_tree_inc.h',
Packit Service 214d95
            'c/enc/histogram.h',
Packit Service 214d95
            'c/enc/histogram_inc.h',
Packit Service 214d95
            'c/enc/literal_cost.h',
Packit Service 214d95
            'c/enc/memory.h',
Packit Service 214d95
            'c/enc/metablock.h',
Packit Service 214d95
            'c/enc/metablock_inc.h',
Packit Service 214d95
            'c/enc/params.h',
Packit Service 214d95
            'c/enc/prefix.h',
Packit Service 214d95
            'c/enc/quality.h',
Packit Service 214d95
            'c/enc/ringbuffer.h',
Packit Service 214d95
            'c/enc/static_dict.h',
Packit Service 214d95
            'c/enc/static_dict_lut.h',
Packit Service 214d95
            'c/enc/utf8_util.h',
Packit Service 214d95
            'c/enc/write_bits.h',
Packit Service 214d95
        ],
Packit Service 214d95
        include_dirs=[
Packit Service 214d95
            'c/include',
Packit Service 214d95
        ],
Packit Service 214d95
        language='c++'),
Packit Service 214d95
]
Packit Service 214d95
Packit Service 214d95
TEST_SUITE = 'setup.get_test_suite'
Packit Service 214d95
Packit Service 214d95
CMD_CLASS = {
Packit Service 214d95
    'build_ext': BuildExt,
Packit Service 214d95
}
Packit Service 214d95
Packit Service 214d95
setup(
Packit Service 214d95
    name=NAME,
Packit Service 214d95
    description=DESCRIPTION,
Packit Service 214d95
    version=VERSION,
Packit Service 214d95
    url=URL,
Packit Service 214d95
    author=AUTHOR,
Packit Service 214d95
    license=LICENSE,
Packit Service 214d95
    platforms=PLATFORMS,
Packit Service 214d95
    classifiers=CLASSIFIERS,
Packit Service 214d95
    package_dir=PACKAGE_DIR,
Packit Service 214d95
    py_modules=PY_MODULES,
Packit Service 214d95
    ext_modules=EXT_MODULES,
Packit Service 214d95
    test_suite=TEST_SUITE,
Packit Service 214d95
    cmdclass=CMD_CLASS)