File: setup.py

package info (click to toggle)
python-ewah-bool-utils 1.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 448 kB
  • sloc: cpp: 1,709; ansic: 926; python: 249; makefile: 16
file content (94 lines) | stat: -rw-r--r-- 2,719 bytes parent folder | download
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
93
94
import os
import sys
import sysconfig
from distutils.ccompiler import get_default_compiler

import numpy as np
from Cython.Build import cythonize
from setuptools import Extension, setup
from wheel.bdist_wheel import bdist_wheel

from setupext import check_for_openmp

if check_for_openmp():
    omp_args = ["-fopenmp"]
else:
    omp_args = None

cpp11_args = ["-std=c++11" if get_default_compiler() != "msvc" else "/std:c++11"]

if os.name == "nt":
    std_libs = []
else:
    std_libs = ["m"]


# restrict LIMITED_API usage:
# - require an env var EWAH_BOOL_UTILS_LIMITED_API=1
# - compiling with Python 3.10 doesn't work (as of Cython 3.1.1)
# - LIMITED_API is not compatible with free-threading (as of CPython 3.14)
USE_PY_LIMITED_API = (
    os.environ.get("EWAH_BOOL_UTILS_LIMITED_API") == "1"
    and sys.version_info >= (3, 11)
    and not sysconfig.get_config_var("Py_GIL_DISABLED")
)
ABI3_TARGET_VERSION = "".join(str(_) for _ in sys.version_info[:2])
ABI3_TARGET_HEX = hex(sys.hexversion & 0xFFFF00F0)


class bdist_wheel_abi3(bdist_wheel):
    def get_tag(self):
        python, abi, plat = super().get_tag()

        if python.startswith("cp") and USE_PY_LIMITED_API:
            return f"cp{ABI3_TARGET_VERSION}", "abi3", plat

        return python, abi, plat


define_macros = [
    ("NPY_NO_DEPRECATED_API", "NPY_1_7_API_VERSION"),
    # keep in sync with runtime requirements (pyproject.toml)
    ("NPY_TARGET_VERSION", "NPY_1_19_API_VERSION"),
]
if USE_PY_LIMITED_API:
    define_macros.append(("Py_LIMITED_API", ABI3_TARGET_HEX))

extensions = [
    Extension(
        "ewah_bool_utils.ewah_bool_wrap",
        ["ewah_bool_utils/ewah_bool_wrap.pyx"],
        define_macros=define_macros,
        include_dirs=["ewah_bool_utils", "ewah_bool_utils/cpp", np.get_include()],
        language="c++",
        extra_compile_args=cpp11_args,
        py_limited_api=USE_PY_LIMITED_API,
    ),
    Extension(
        "ewah_bool_utils.morton_utils",
        ["ewah_bool_utils/morton_utils.pyx"],
        define_macros=define_macros,
        extra_compile_args=omp_args,
        extra_link_args=omp_args,
        libraries=std_libs,
        include_dirs=[np.get_include()],
        py_limited_api=USE_PY_LIMITED_API,
    ),
    Extension(
        "ewah_bool_utils._testing",
        ["ewah_bool_utils/_testing.pyx"],
        include_dirs=["ewah_bool_utils", "ewah_bool_utils/cpp", np.get_include()],
        define_macros=define_macros,
        extra_compile_args=["-O3"],
        language="c++",
        py_limited_api=USE_PY_LIMITED_API,
    ),
]

setup(
    ext_modules=cythonize(
        extensions,
        compiler_directives={"language_level": 3},
    ),
    cmdclass={"bdist_wheel": bdist_wheel_abi3},
)