1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
#!/usr/bin/env python3
import os
import platform
import sys
from setuptools import Extension, setup
from setuptools.command.build_ext import build_ext
from setuptools.command.egg_info import egg_info
kwargs = {
"include_dirs": ["src/lib/ppmd", "src/lib/buffer"],
"library_dirs": [],
"libraries": [],
"sources": [
"src/lib/ppmd/Ppmd7.c",
"src/lib/ppmd/Ppmd8.c",
"src/lib/ppmd/Ppmd8Dec.c",
"src/lib/ppmd/Ppmd7Enc.c",
"src/lib/ppmd/Ppmd8Enc.c",
"src/lib/ppmd/Ppmd7Dec.c",
"src/lib/buffer/Buffer.c",
"src/lib/buffer/ThreadDecoder.c",
],
"define_macros": [],
}
def has_option(option):
if option in sys.argv:
sys.argv = [s for s in sys.argv if s != option]
return True
else:
return False
if True: # CFFI
# packages
packages = ["pyppmd", "pyppmd.cffi"]
# binary extension
kwargs["module_name"] = "pyppmd.cffi._cffi_ppmd"
sys.path.append("src/ext")
import ffi_build
binary_extension = ffi_build.get_extension(**kwargs)
else: # C implementation
# packages
packages = ["pyppmd", "pyppmd.c"]
# binary extension
kwargs["name"] = "pyppmd.c._ppmd"
kwargs["sources"].append("src/ext/_ppmdmodule.c")
binary_extension = Extension(**kwargs)
WARNING_AS_ERROR = has_option("--warning-as-error")
class build_ext_compiler_check(build_ext):
def build_extensions(self):
for extension in self.extensions:
if self.compiler.compiler_type.lower() in ("unix", "mingw32"):
if WARNING_AS_ERROR:
extension.extra_compile_args.append("-Werror")
elif self.compiler.compiler_type.lower() == "msvc":
# /GF eliminates duplicate strings
# /Gy does function level linking
more_options = ["/GF", "/Gy"]
if WARNING_AS_ERROR:
more_options.append("/WX")
extension.extra_compile_args.extend(more_options)
super().build_extensions()
# Work around pypa/setuptools#436.
class my_egg_info(egg_info):
def run(self):
try:
os.remove(os.path.join(self.egg_info, "SOURCES.txt"))
except FileNotFoundError:
pass
super().run()
setup(
ext_modules=[binary_extension],
package_dir={"": "src"},
packages=packages,
cmdclass={"build_ext": build_ext_compiler_check, "egg_info": my_egg_info},
)
|