diff --git a/build.sh b/build.sh index 31d0a39..4d39807 100755 --- a/build.sh +++ b/build.sh @@ -34,6 +34,9 @@ fi if [[ -n "${BUILD_SH_IN_MANYLINUX:-}" ]]; then export PATH="/opt/python/cp312-cp312/bin:$PATH" + # cached *-src repos may be owned by the host runner user; tell git to trust them + git config --global --add safe.directory '*' + ./setup.sh if [[ -z "${BUILD_SH_REUSE_MANYLINUX_ARTIFACTS:-}" ]]; then diff --git a/nanosvg/build.sh b/nanosvg/build.sh new file mode 100755 index 0000000..5232a94 --- /dev/null +++ b/nanosvg/build.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +set -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +cd "$DIR" + +COMMIT="5cefd9847949af6df13f65027fd43af5a7513633" +INSTALL_DIR="$DIR/nanosvg/install" + +# Clone/update source +if [ ! -d "nanosvg-src/.git" ]; then + rm -rf nanosvg-src + git clone --depth 1 https://github.com/memononen/nanosvg.git nanosvg-src +fi +git -C nanosvg-src fetch --depth 1 origin "$COMMIT" +git -C nanosvg-src checkout --force FETCH_HEAD + +# Copy headers +rm -rf "$INSTALL_DIR" +mkdir -p "$INSTALL_DIR/include" +cp nanosvg-src/src/nanosvg.h "$INSTALL_DIR/include/" +cp nanosvg-src/src/nanosvgrast.h "$INSTALL_DIR/include/" + +echo "Installed nanosvg to $INSTALL_DIR" +du -sh "$INSTALL_DIR" diff --git a/nanosvg/nanosvg/__init__.py b/nanosvg/nanosvg/__init__.py new file mode 100644 index 0000000..6362544 --- /dev/null +++ b/nanosvg/nanosvg/__init__.py @@ -0,0 +1,10 @@ +import os + +DIR = os.path.join(os.path.dirname(__file__), "install") +INCLUDE_DIR = os.path.join(DIR, "include") +LIB_DIR = DIR # header-only; no libraries + + +def smoketest(): + assert os.path.isfile(os.path.join(INCLUDE_DIR, "nanosvg.h")), "nanosvg.h not found" + assert os.path.isfile(os.path.join(INCLUDE_DIR, "nanosvgrast.h")), "nanosvgrast.h not found" diff --git a/nanosvg/pyproject.toml b/nanosvg/pyproject.toml new file mode 100644 index 0000000..cb6e7cd --- /dev/null +++ b/nanosvg/pyproject.toml @@ -0,0 +1,15 @@ +[build-system] +requires = ["setuptools>=64", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "nanosvg" +version = "0.0.1" +description = "NanoSVG: simple SVG parser and rasterizer" +requires-python = ">=3.8" + +[tool.setuptools.packages.find] +include = ["nanosvg*"] + +[tool.setuptools.package-data] +nanosvg = ["install/**/*"] diff --git a/nanosvg/setup.py b/nanosvg/setup.py new file mode 100644 index 0000000..22a0429 --- /dev/null +++ b/nanosvg/setup.py @@ -0,0 +1,58 @@ +import os +import platform +import subprocess + +from setuptools.command.build_py import build_py + +try: + from wheel.bdist_wheel import bdist_wheel +except ImportError: + bdist_wheel = None + + +class BuildNanosvg(build_py): + """Run build.sh to download nanosvg headers before collecting package data.""" + + def run(self): + pkg_dir = os.path.dirname(os.path.abspath(__file__)) + build_script = os.path.join(pkg_dir, "build.sh") + subprocess.check_call(["bash", build_script], cwd=pkg_dir) + + super().run() + + +cmdclass = {"build_py": BuildNanosvg} + +if bdist_wheel is not None: + + class PlatformWheel(bdist_wheel): + """Produce a platform-specific, Python-version-agnostic wheel.""" + + def finalize_options(self): + super().finalize_options() + self.root_is_pure = False + + def get_tag(self): + system = platform.system() + machine = platform.machine() + + if system == "Linux": + plat = f"linux_{machine}" + elif system == "Darwin": + plat = "macosx_11_0_arm64" + else: + plat = f"{system.lower()}_{machine}" + + return "py3", "none", plat + + cmdclass["bdist_wheel"] = PlatformWheel + + +def setup(): + from setuptools import setup as _setup + + _setup(cmdclass=cmdclass) + + +if __name__ == "__main__": + setup() diff --git a/pyproject.toml b/pyproject.toml index f6d20ec..21d3486 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ members = [ "json11", "libjpeg", "libyuv", + "nanosvg", "ncurses", "python3-dev", "raylib",