From f67ffb5c9408ddc9a0dd01b9e6b2b91cee32ea98 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 22 Feb 2026 19:45:10 -0800 Subject: [PATCH] add zeromq package (#7) Static build of libzmq 4.3.5 providing headers and library for C/C++ projects that link against zmq. Co-authored-by: Claude Opus 4.6 --- zeromq/build.sh | 59 +++++++++++++++++++++++++++++++++++++ zeromq/pyproject.toml | 15 ++++++++++ zeromq/setup.py | 61 +++++++++++++++++++++++++++++++++++++++ zeromq/zeromq/__init__.py | 10 +++++++ 4 files changed, 145 insertions(+) create mode 100755 zeromq/build.sh create mode 100644 zeromq/pyproject.toml create mode 100644 zeromq/setup.py create mode 100644 zeromq/zeromq/__init__.py diff --git a/zeromq/build.sh b/zeromq/build.sh new file mode 100755 index 0000000..3bd64bd --- /dev/null +++ b/zeromq/build.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +set -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +cd "$DIR" + +VERSION="4.3.5" +INSTALL_DIR="$DIR/zeromq/install" + +# Idempotent: skip if already built +if [ -f "$INSTALL_DIR/lib/libzmq.a" ]; then + echo "zeromq already present, skipping build." + exit 0 +fi + +NJOBS="$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 2)" + +# Clone +if [ ! -d "libzmq-src" ]; then + git clone --depth 1 --branch "v${VERSION}" https://github.com/zeromq/libzmq.git libzmq-src +fi + +# Build +PREFIX="$DIR/build/prefix" +mkdir -p "$DIR/build" + +cmake -S libzmq-src -B "$DIR/build" \ + -DCMAKE_BUILD_TYPE=MinSizeRel \ + -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=ON \ + -DCMAKE_INSTALL_PREFIX="$PREFIX" \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \ + -DWITH_LIBSODIUM=OFF \ + -DWITH_TLS=OFF \ + -DWITH_DOCS=OFF \ + -DBUILD_TESTS=OFF \ + -DBUILD_SHARED=OFF \ + -DBUILD_STATIC=ON \ + -DENABLE_DRAFTS=OFF + +cmake --build "$DIR/build" -j"$NJOBS" +cmake --install "$DIR/build" + +# Copy to package install dir +rm -rf "$INSTALL_DIR" +mkdir -p "$INSTALL_DIR"/{lib,include} + +# Library +cp "$PREFIX/lib/libzmq.a" "$INSTALL_DIR/lib/" + +# Headers +cp "$PREFIX/include/zmq.h" "$INSTALL_DIR/include/" +cp "$PREFIX/include/zmq_utils.h" "$INSTALL_DIR/include/" + +# Clean up +rm -rf libzmq-src "$DIR/build" + +echo "Installed zeromq to $INSTALL_DIR" +du -sh "$INSTALL_DIR" diff --git a/zeromq/pyproject.toml b/zeromq/pyproject.toml new file mode 100644 index 0000000..ecbda65 --- /dev/null +++ b/zeromq/pyproject.toml @@ -0,0 +1,15 @@ +[build-system] +requires = ["setuptools>=64", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "zeromq" +version = "4.3.5" +description = "ZeroMQ messaging library (static build)" +requires-python = ">=3.8" + +[tool.setuptools.packages.find] +include = ["zeromq*"] + +[tool.setuptools.package-data] +zeromq = ["install/**/*"] diff --git a/zeromq/setup.py b/zeromq/setup.py new file mode 100644 index 0000000..5f1d786 --- /dev/null +++ b/zeromq/setup.py @@ -0,0 +1,61 @@ +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 BuildZeromq(build_py): + """Run build.sh to compile zeromq before collecting package data.""" + + def run(self): + pkg_dir = os.path.dirname(os.path.abspath(__file__)) + marker = os.path.join(pkg_dir, "zeromq", "install", "lib", "libzmq.a") + + if not os.path.exists(marker): + build_script = os.path.join(pkg_dir, "build.sh") + subprocess.check_call(["bash", build_script], cwd=pkg_dir) + + super().run() + + +cmdclass = {"build_py": BuildZeromq} + +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/zeromq/zeromq/__init__.py b/zeromq/zeromq/__init__.py new file mode 100644 index 0000000..30429bb --- /dev/null +++ b/zeromq/zeromq/__init__.py @@ -0,0 +1,10 @@ +import os + +DIR = os.path.join(os.path.dirname(__file__), "install") +LIB_DIR = os.path.join(DIR, "lib") +INCLUDE_DIR = os.path.join(DIR, "include") + + +def smoketest(): + assert os.path.isfile(os.path.join(LIB_DIR, "libzmq.a")), "libzmq.a not found" + assert os.path.isfile(os.path.join(INCLUDE_DIR, "zmq.h")), "zmq.h not found"