1
0
Fork 0
mirror of https://gitee.com/fantix/kloop.git synced 2024-05-08 16:12:41 +00:00

Fix setup.py build and clean

This commit is contained in:
Fantix King 2022-06-25 14:44:02 -04:00
parent 665647013b
commit 081a2877b8
No known key found for this signature in database
GPG key ID: 95304B04071CCDB4
4 changed files with 130 additions and 58 deletions

View file

@ -1,15 +1,23 @@
.PHONY: build dev clean .PHONY: dist dev build clean
.DEFAULT_GOAL := dev .DEFAULT_GOAL := dev
build: # Make distribution tarballs
dist:
pip install -U build pip install -U build
python -m build python -m build
# Incrementally build for development
dev: dev:
pip install -Ue . KLOOP_DEBUG=1 python setup.py develop
# Always build for development
build:
KLOOP_FORCE=1 KLOOP_DEBUG=1 python setup.py develop
# Clean up everything including the Rust build cache
clean: clean:
git clean -Xfd -e "!/*.code-workspace" -e "!/*.vscode" -e "!/*.idea" -e "!/*.python-version" python setup.py clean --all

View file

@ -68,5 +68,6 @@ sudo apt install gcc libssl-dev python3-dev python3.10-venv
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
python3 -m venv path/to/env python3 -m venv path/to/env
source path/to/env/bin/activate source path/to/env/bin/activate
pip install -e path/to/kloop pip install cython
KLOOP_DEBUG=1 python setup.py develop # or just run `make`
``` ```

View file

@ -62,5 +62,6 @@ sudo apt install gcc libssl-dev python3-dev python3.10-venv
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
python3 -m venv path/to/env python3 -m venv path/to/env
source path/to/env/bin/activate source path/to/env/bin/activate
pip install -e path/to/kloop pip install cython
KLOOP_DEBUG=1 python setup.py develop # 或者直接执行 `make`
``` ```

166
setup.py
View file

@ -9,74 +9,136 @@
# See the Mulan PSL v2 for more details. # See the Mulan PSL v2 for more details.
import os
import subprocess import subprocess
import sysconfig import sysconfig
from setuptools import setup from setuptools import setup
from Cython.Build import cythonize from Cython.Build import cythonize
from Cython.Distutils import Extension
from Cython.Distutils import build_ext from Cython.Distutils import build_ext
from Cython.Distutils import Extension
from distutils import dir_util
DEBUG = True from distutils import log
RESOLVER_LIB = ( from distutils.command.clean import clean
f"resolver/target/{'debug' if DEBUG else 'release'}/libkloop_resolver.a"
)
class build_ext_with_resolver(build_ext): class build_ext_with_resolver(build_ext):
def run(self): def finalize_options(self):
subprocess.check_call( self.set_undefined_options(
["cargo", "build"] + [] if DEBUG else ["-r"], "build",
cwd="resolver", ("debug", "debug"),
("force", "force"),
) )
if self.debug is None:
self.debug = os.getenv("KLOOP_DEBUG", "0") == "1"
if self.force is None:
self.force = os.getenv("KLOOP_FORCE", "0") == "1"
for ext in self.distribution.ext_modules:
if self.debug:
if "-O0" not in ext.extra_compile_args:
ext.extra_compile_args.append("-O0")
if ext.name == "kloop.loop":
resolver = (
f"resolver/target/{'debug' if self.debug else 'release'}"
f"/libkloop_resolver.a"
)
if resolver not in ext.extra_link_args:
ext.extra_link_args.append(resolver)
if resolver not in ext.depends:
ext.depends.append(resolver)
self.distribution.ext_modules = cythonize(
self.distribution.ext_modules, language_level="3",
)
super().finalize_options()
def run(self):
if self.force:
cmd = ["cargo", "clean", "-p", "resolver"]
if not self.debug:
cmd.append("-r")
self.announce(f"Running: {cmd}", log.INFO)
subprocess.check_call(cmd, cwd="resolver")
cmd = ["cargo", "build"]
if not self.debug:
cmd.append("-r")
self.announce(f"Running: {cmd}", log.INFO)
subprocess.check_call(cmd, cwd="resolver")
super().run() super().run()
class clean_with_resolver(clean):
def run(self):
super().run()
for d in self.distribution.package_dir.values():
self._clean_dir(d)
cmd = ["cargo", "clean"]
if not self.all:
cmd.extend(["-p", "resolver"])
self.announce(f"Running: {cmd}", log.INFO)
if not self.dry_run:
subprocess.check_call(cmd, cwd="resolver")
def _clean_dir(self, path):
for f in os.listdir(path):
name, ext = os.path.splitext(f)
real_f = os.path.join(path, f)
is_dir = os.path.isdir(real_f) and not os.path.islink(real_f)
if name == "__pycache__" or ext in {".egg-info", ".so", ".c"}:
if is_dir:
dir_util.remove_tree(real_f, dry_run=self.dry_run)
else:
self.announce(f"removing {real_f!r}", log.INFO)
if not self.dry_run:
os.remove(real_f)
elif is_dir:
self._clean_dir(real_f)
setup( setup(
cmdclass={ cmdclass={
"build_ext": build_ext_with_resolver, "build_ext": build_ext_with_resolver,
"clean": clean_with_resolver,
}, },
ext_modules=cythonize( ext_modules=[
[ Extension(
Extension( "kloop.loop",
"kloop.loop", ["src/kloop/loop.pyx"],
["src/kloop/loop.pyx"], ),
extra_link_args=[RESOLVER_LIB], Extension(
depends=[RESOLVER_LIB], "kloop.tls",
["src/kloop/tls.pyx"],
libraries=[
lib.strip().removeprefix("-l")
for lib in sysconfig.get_config_var("OPENSSL_LIBS").split()
],
include_dirs=[
d.strip().removeprefix("-I")
for d in sysconfig.get_config_var(
"OPENSSL_INCLUDES"
).split()
],
library_dirs=[
d.strip().removeprefix("-L")
for d in sysconfig.get_config_var(
"OPENSSL_LDFLAGS"
).split()
if d.strip().startswith("-L")
],
extra_link_args=[
d.strip()
for d in sysconfig.get_config_var(
"OPENSSL_LDFLAGS"
).split()
if not d.strip().startswith("-L")
],
runtime_library_dirs=(lambda x: [x] if x else [])(
sysconfig.get_config_var("OPENSSL_RPATH")
), ),
Extension( ),
"kloop.tls", ],
["src/kloop/tls.pyx"],
libraries=[
lib.strip().removeprefix("-l")
for lib in sysconfig.get_config_var("OPENSSL_LIBS").split()
],
include_dirs=[
d.strip().removeprefix("-I")
for d in sysconfig.get_config_var(
"OPENSSL_INCLUDES"
).split()
],
library_dirs=[
d.strip().removeprefix("-L")
for d in sysconfig.get_config_var(
"OPENSSL_LDFLAGS"
).split()
if d.strip().startswith("-L")
],
extra_link_args=[
d.strip()
for d in sysconfig.get_config_var(
"OPENSSL_LDFLAGS"
).split()
if not d.strip().startswith("-L")
],
runtime_library_dirs=(lambda x: [x] if x else [])(
sysconfig.get_config_var("OPENSSL_RPATH")
),
),
],
language_level="3",
),
) )