from os import path from sysconfig import get_config_var from setuptools import Extension, find_packages, setup from setuptools.command.build import build from setuptools.command.build_ext import build_ext from setuptools.command.egg_info import egg_info from wheel.bdist_wheel import bdist_wheel class Build(build): def run(self): if path.isdir("queries"): dest = path.join(self.build_lib, "tree_sitter_oat_v1", "queries") self.copy_tree("queries", dest) super().run() class BuildExt(build_ext): def build_extension(self, ext: Extension): if self.compiler.compiler_type != "msvc": ext.extra_compile_args = ["-std=c11", "-fvisibility=hidden"] else: ext.extra_compile_args = ["/std:c11", "/utf-8"] if path.exists("src/scanner.c"): ext.sources.append("src/scanner.c") if ext.py_limited_api: ext.define_macros.append(("Py_LIMITED_API", "0x030A0000")) super().build_extension(ext) class BdistWheel(bdist_wheel): def get_tag(self): python, abi, platform = super().get_tag() if python.startswith("cp"): python, abi = "cp310", "abi3" return python, abi, platform class EggInfo(egg_info): def find_sources(self): super().find_sources() self.filelist.recursive_include("queries", "*.scm") self.filelist.include("src/tree_sitter/*.h") setup( packages=find_packages("bindings/python"), package_dir={"": "bindings/python"}, package_data={ "tree_sitter_oat_v1": ["*.pyi", "py.typed"], "tree_sitter_oat_v1.queries": ["*.scm"], }, ext_package="tree_sitter_oat_v1", ext_modules=[ Extension( name="_binding", sources=[ "bindings/python/tree_sitter_oat_v1/binding.c", "src/parser.c", ], define_macros=[ ("PY_SSIZE_T_CLEAN", None), ("TREE_SITTER_HIDE_SYMBOLS", None), ], include_dirs=["src"], py_limited_api=not get_config_var("Py_GIL_DISABLED"), ) ], cmdclass={ "build": Build, "build_ext": BuildExt, "bdist_wheel": BdistWheel, "egg_info": EggInfo, }, zip_safe=False )