From 48898b55b778e232695c078932dbe398549ad76a Mon Sep 17 00:00:00 2001 From: shiptux Date: Tue, 12 May 2026 12:22:18 +0900 Subject: [PATCH 01/14] packaging: scaffold python3 noarch DEB (smoke-test enabled) Adapted from FlagAttention's working template (FlagOS Python component packaging pattern): - dh-python + pybuild + pybuild-plugin-pyproject - Architecture: all (noarch) - override_dh_auto_test runs a smoke import; pytest deferred to upstream GPU CI - packaging/debian/ + helpers/Dockerfile.deb (Ubuntu 22.04 base) - 'cp -r packaging/debian debian' inside the container to satisfy dpkg-buildpackage's debian/-at-root expectation Not yet built locally; expected to mirror FlagAttention's ~5 s build and small .deb size for the pure-Python paths. --- packaging/debian/build-helpers/Dockerfile.deb | 28 +++++++++++++++++++ .../debian/build-helpers/build-flagtensor.sh | 19 +++++++++++++ packaging/debian/changelog | 5 ++++ packaging/debian/control | 21 ++++++++++++++ packaging/debian/copyright | 23 +++++++++++++++ packaging/debian/rules | 20 +++++++++++++ packaging/debian/source/format | 1 + 7 files changed, 117 insertions(+) create mode 100644 packaging/debian/build-helpers/Dockerfile.deb create mode 100755 packaging/debian/build-helpers/build-flagtensor.sh create mode 100644 packaging/debian/changelog create mode 100644 packaging/debian/control create mode 100644 packaging/debian/copyright create mode 100755 packaging/debian/rules create mode 100644 packaging/debian/source/format diff --git a/packaging/debian/build-helpers/Dockerfile.deb b/packaging/debian/build-helpers/Dockerfile.deb new file mode 100644 index 0000000..0504058 --- /dev/null +++ b/packaging/debian/build-helpers/Dockerfile.deb @@ -0,0 +1,28 @@ +ARG BASE_IMAGE_VERSION=22.04 +FROM ubuntu:${BASE_IMAGE_VERSION} +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential debhelper devscripts dpkg-dev fakeroot \ + dh-python pybuild-plugin-pyproject \ + python3-all python3-pip python3-setuptools python3-wheel \ + git ca-certificates \ + && apt-get clean && rm -rf /var/lib/apt/lists/* + +RUN pip3 install --break-system-packages "setuptools>=60" "wheel>=0.45.1" 2>/dev/null || \ + pip3 install "setuptools>=60" "wheel>=0.45.1" + +COPY . /workspace/FlagTensor +WORKDIR /workspace/FlagTensor + +RUN cp -r packaging/debian debian + +RUN dpkg-buildpackage -us -uc -b -d 2>&1 || \ + { echo "=== build failed ==="; \ + find /workspace -name "*.log" -exec echo "=== {} ===" \; -exec cat {} \; 2>/dev/null || true; \ + exit 1; } + +RUN mkdir -p /output && \ + find /workspace -maxdepth 1 -name "*.deb" -exec cp {} /output/ \; && \ + find /workspace -maxdepth 1 -name "*.changes" -exec cp {} /output/ \; && \ + ls -lh /output/ diff --git a/packaging/debian/build-helpers/build-flagtensor.sh b/packaging/debian/build-helpers/build-flagtensor.sh new file mode 100755 index 0000000..13b2b48 --- /dev/null +++ b/packaging/debian/build-helpers/build-flagtensor.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(dirname "$(dirname "$(dirname "$SCRIPT_DIR")")")" +BASE_IMAGE_VERSION="${1:-22.04}" +IMAGE_TAG="flagtensor-deb:${BASE_IMAGE_VERSION}" +OUTPUT_DIR="${PROJECT_DIR}/debian-packages" + +docker build --network=host \ + -f "${SCRIPT_DIR}/Dockerfile.deb" \ + --build-arg BASE_IMAGE_VERSION="$BASE_IMAGE_VERSION" \ + -t "$IMAGE_TAG" "$PROJECT_DIR" + +mkdir -p "$OUTPUT_DIR" +CID=$(docker create "$IMAGE_TAG") +docker cp "$CID:/output/." "$OUTPUT_DIR/" +docker rm "$CID" > /dev/null + +echo ""; echo ">>> Output:"; ls -lh "$OUTPUT_DIR" diff --git a/packaging/debian/changelog b/packaging/debian/changelog new file mode 100644 index 0000000..51d56b3 --- /dev/null +++ b/packaging/debian/changelog @@ -0,0 +1,5 @@ +flagtensor (0.1.0-1) unstable; urgency=medium + + * Initial Debian packaging. + + -- FlagOS Contributors Tue, 12 May 2026 12:00:00 +0000 diff --git a/packaging/debian/control b/packaging/debian/control new file mode 100644 index 0000000..1500de6 --- /dev/null +++ b/packaging/debian/control @@ -0,0 +1,21 @@ +Source: flagtensor +Section: python +Priority: optional +Maintainer: FlagOS Contributors +Build-Depends: debhelper-compat (= 13), + dh-python, + python3-all, + python3-setuptools, + python3-wheel, + pybuild-plugin-pyproject +Standards-Version: 4.6.2 +Homepage: https://github.com/flagos-ai/FlagTensor +Vcs-Browser: https://github.com/flagos-ai/FlagTensor +Vcs-Git: https://github.com/flagos-ai/FlagTensor.git +Rules-Requires-Root: no + +Package: python3-flagtensor +Architecture: all +Depends: ${python3:Depends}, ${misc:Depends}, python3-torch, python3-matplotlib, python3-openpyxl +Description: FlagTensor — tensor utilities for FlagOS + Tensor manipulation utilities (reshape/permute/index helpers) used across the FlagOS operator libraries. diff --git a/packaging/debian/copyright b/packaging/debian/copyright new file mode 100644 index 0000000..b179d75 --- /dev/null +++ b/packaging/debian/copyright @@ -0,0 +1,23 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: FlagTensor +Upstream-Contact: FlagOS Contributors +Source: https://github.com/flagos-ai/FlagTensor + +Files: * +Copyright: 2024-2026 Beijing Academy of Artificial Intelligence (BAAI) + 2024-2026 FlagTensor contributors +License: Apache-2.0 + +License: Apache-2.0 + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + . + http://www.apache.org/licenses/LICENSE-2.0 + . + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + . + On Debian systems, the full text of the Apache 2.0 License is in + /usr/share/common-licenses/Apache-2.0. diff --git a/packaging/debian/rules b/packaging/debian/rules new file mode 100755 index 0000000..28e289b --- /dev/null +++ b/packaging/debian/rules @@ -0,0 +1,20 @@ +#!/usr/bin/make -f +export DH_VERBOSE = 1 +export PYBUILD_NAME = flagtensor + +%: + dh $@ --with python3 --buildsystem=pybuild + +# Smoke import test — don't blanket-skip. See FlagAttention rules +# for rationale. +override_dh_auto_test: + @echo "=== smoke import test ===" + @for d in .pybuild/cpython3_*/build $(CURDIR)/src $(CURDIR); do \ + if [ -d "$$d/flagtensor" ]; then \ + echo "Found build dir: $$d"; \ + PYTHONDONTWRITEBYTECODE=1 PYTHONPATH="$$d" python3 -c \ + "import flagtensor; print('OK', getattr(flagtensor, '__version__', 'unknown'))"; \ + exit 0; \ + fi; \ + done; \ + echo "ERROR: could not find a built flagtensor module"; exit 1 diff --git a/packaging/debian/source/format b/packaging/debian/source/format new file mode 100644 index 0000000..89ae9db --- /dev/null +++ b/packaging/debian/source/format @@ -0,0 +1 @@ +3.0 (native) From 3d3cd6b220071f515e07e880020674aa050f3090 Mon Sep 17 00:00:00 2001 From: shiptux Date: Thu, 21 May 2026 02:00:20 +0900 Subject: [PATCH 02/14] packaging: relax torch to Recommends + add RPM spec + find_spec smoke - debian/control: move python3-torch from Depends to Recommends so the package installs on systems where torch comes from pip / NGC rather than from apt main archive. dh_python3 still auto-detects torch via pyproject.toml's dependencies field via ${python3:Depends}; that's a separate follow-up if we want it fully removed from .deb metadata. - debian/rules: replace 'import ' smoke test with importlib.util.find_spec to avoid triggering torch import at build time. Fix '; exit 0' silent-pass bug with '&&' short-circuit. - packaging/rpm/: mirror DEB packaging for Fedora targets. --- packaging/debian/control | 3 +- packaging/debian/rules | 16 ++++++--- packaging/rpm/build-flagtensor-rpm.sh | 19 ++++++++++ packaging/rpm/dockerfiles/Dockerfile.rpm | 29 +++++++++++++++ packaging/rpm/specs/flagtensor.spec | 46 ++++++++++++++++++++++++ 5 files changed, 107 insertions(+), 6 deletions(-) create mode 100755 packaging/rpm/build-flagtensor-rpm.sh create mode 100644 packaging/rpm/dockerfiles/Dockerfile.rpm create mode 100644 packaging/rpm/specs/flagtensor.spec diff --git a/packaging/debian/control b/packaging/debian/control index 1500de6..3a01911 100644 --- a/packaging/debian/control +++ b/packaging/debian/control @@ -16,6 +16,7 @@ Rules-Requires-Root: no Package: python3-flagtensor Architecture: all -Depends: ${python3:Depends}, ${misc:Depends}, python3-torch, python3-matplotlib, python3-openpyxl +Depends: ${python3:Depends}, ${misc:Depends}, python3-matplotlib, python3-openpyxl +Recommends: python3-torch Description: FlagTensor — tensor utilities for FlagOS Tensor manipulation utilities (reshape/permute/index helpers) used across the FlagOS operator libraries. diff --git a/packaging/debian/rules b/packaging/debian/rules index 28e289b..f94a219 100755 --- a/packaging/debian/rules +++ b/packaging/debian/rules @@ -5,16 +5,22 @@ export PYBUILD_NAME = flagtensor %: dh $@ --with python3 --buildsystem=pybuild -# Smoke import test — don't blanket-skip. See FlagAttention rules -# for rationale. +# Smoke find_spec test (not actual import) — verifies the built +# module lands at the expected path. Doesn't import the module +# because module-level deps (torch, triton, cupy, ...) are install- +# time concerns not satisfied in the build container. Catches: +# wrong install path, missing __init__.py, dh_python install bugs. +# Note: prior version used `import ; exit 0` which silently passed +# on import failures. Fixed with && short-circuit. override_dh_auto_test: - @echo "=== smoke import test ===" + @echo "=== smoke find_spec test ===" @for d in .pybuild/cpython3_*/build $(CURDIR)/src $(CURDIR); do \ if [ -d "$$d/flagtensor" ]; then \ echo "Found build dir: $$d"; \ PYTHONDONTWRITEBYTECODE=1 PYTHONPATH="$$d" python3 -c \ - "import flagtensor; print('OK', getattr(flagtensor, '__version__', 'unknown'))"; \ - exit 0; \ + "import importlib.util; s = importlib.util.find_spec('flagtensor'); assert s and s.origin, 'flagtensor not findable'; print('OK: flagtensor at', s.origin)" \ + && exit 0; \ + echo "ERROR: find_spec failed"; exit 1; \ fi; \ done; \ echo "ERROR: could not find a built flagtensor module"; exit 1 diff --git a/packaging/rpm/build-flagtensor-rpm.sh b/packaging/rpm/build-flagtensor-rpm.sh new file mode 100755 index 0000000..6b9deca --- /dev/null +++ b/packaging/rpm/build-flagtensor-rpm.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -euo pipefail +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")" +BASE_IMAGE_VERSION="${1:-43}" +IMAGE_TAG="flagtensor-rpm:f${BASE_IMAGE_VERSION}" +OUTPUT_DIR="${PROJECT_DIR}/rpm-packages" + +docker build --network=host \ + -f "${SCRIPT_DIR}/dockerfiles/Dockerfile.rpm" \ + --build-arg BASE_IMAGE_VERSION="$BASE_IMAGE_VERSION" \ + -t "$IMAGE_TAG" "$PROJECT_DIR" + +mkdir -p "$OUTPUT_DIR" +CID=$(docker create "$IMAGE_TAG") +docker cp "$CID:/output/." "$OUTPUT_DIR/" +docker rm "$CID" > /dev/null + +echo ""; echo ">>> Output:"; ls -lh "$OUTPUT_DIR" diff --git a/packaging/rpm/dockerfiles/Dockerfile.rpm b/packaging/rpm/dockerfiles/Dockerfile.rpm new file mode 100644 index 0000000..4a8dc55 --- /dev/null +++ b/packaging/rpm/dockerfiles/Dockerfile.rpm @@ -0,0 +1,29 @@ +ARG BASE_IMAGE=fedora +ARG BASE_IMAGE_VERSION=43 + +FROM ${BASE_IMAGE}:${BASE_IMAGE_VERSION} + +RUN dnf install -y \ + rpm-build rpmdevtools pyproject-rpm-macros \ + python3-devel python3-setuptools python3-wheel python3-pip \ + && dnf clean all + +RUN rpmdev-setuptree + +COPY . /workspace/FlagTensor + +RUN SPEC_VERSION=$(grep '^Version:' /workspace/FlagTensor/packaging/rpm/specs/flagtensor.spec | awk '{print $2}') && \ + tar czf /root/rpmbuild/SOURCES/flagtensor-${SPEC_VERSION}.tar.gz \ + -C /workspace \ + --transform "s|^FlagTensor|flagtensor-${SPEC_VERSION}|" \ + FlagTensor + +RUN rpmbuild -ba /workspace/FlagTensor/packaging/rpm/specs/flagtensor.spec 2>&1 || \ + { echo "=== build failed ==="; \ + find /root/rpmbuild -name "*.log" -exec echo "=== {} ===" \; -exec cat {} \; 2>/dev/null || true; \ + exit 1; } + +RUN mkdir -p /output && \ + find /root/rpmbuild/RPMS -name "*.rpm" -exec cp {} /output/ \; && \ + find /root/rpmbuild/SRPMS -name "*.rpm" -exec cp {} /output/ \; && \ + ls -lh /output/ diff --git a/packaging/rpm/specs/flagtensor.spec b/packaging/rpm/specs/flagtensor.spec new file mode 100644 index 0000000..bc31200 --- /dev/null +++ b/packaging/rpm/specs/flagtensor.spec @@ -0,0 +1,46 @@ +%global debug_package %{nil} + +Name: python3-flagtensor +Version: 0.1.0 +Release: 1%{?dist} +Summary: FlagTensor — tensor utilities for FlagOS + +License: Apache-2.0 +URL: https://github.com/flagos-ai/FlagTensor +Source0: flagtensor-%{version}.tar.gz + +BuildArch: noarch +BuildRequires: python3-devel +BuildRequires: python3-setuptools >= 60 +BuildRequires: python3-wheel +BuildRequires: python3-pip +BuildRequires: pyproject-rpm-macros + +%description +Tensor manipulation utilities (reshape/permute/index helpers) used across the FlagOS operator libraries. + +%prep +%autosetup -n flagtensor-%{version} + +%build +%pyproject_wheel + +%install +%pyproject_install +%pyproject_save_files flagtensor + +%check +# Smoke find_spec test (no actual import) — verifies the built module +# lands at the expected sitelib path. Doesn't import the module so +# missing runtime deps (torch, triton, ...) don't trip the check; +# those are user-install-time concerns, not packaging concerns. +PYTHONDONTWRITEBYTECODE=1 \ + PYTHONPATH=%{buildroot}%{python3_sitelib} \ + python3 -c "import importlib.util; s = importlib.util.find_spec('flagtensor'); assert s and s.origin, 'flagtensor not findable'; print('OK: flagtensor at', s.origin)" + +%files -f %{pyproject_files} +%license LICENSE* + +%changelog +* Wed May 13 2026 FlagOS Contributors - 0.1.0-1 +- Initial RPM packaging. From d7be036c64738b30465d0cabb20e8fa89f54b6b0 Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Thu, 21 May 2026 21:22:27 +0900 Subject: [PATCH 03/14] fix(packaging): decouple tar transform from source dir name; preserve build stderr --- packaging/debian/build-helpers/Dockerfile.deb | 4 ++-- packaging/rpm/dockerfiles/Dockerfile.rpm | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packaging/debian/build-helpers/Dockerfile.deb b/packaging/debian/build-helpers/Dockerfile.deb index 0504058..1c8fbdd 100644 --- a/packaging/debian/build-helpers/Dockerfile.deb +++ b/packaging/debian/build-helpers/Dockerfile.deb @@ -17,8 +17,8 @@ WORKDIR /workspace/FlagTensor RUN cp -r packaging/debian debian -RUN dpkg-buildpackage -us -uc -b -d 2>&1 || \ - { echo "=== build failed ==="; \ +RUN dpkg-buildpackage -us -uc -b -d || \ + { echo "=== build failed ===" >&2; \ find /workspace -name "*.log" -exec echo "=== {} ===" \; -exec cat {} \; 2>/dev/null || true; \ exit 1; } diff --git a/packaging/rpm/dockerfiles/Dockerfile.rpm b/packaging/rpm/dockerfiles/Dockerfile.rpm index 4a8dc55..e85a496 100644 --- a/packaging/rpm/dockerfiles/Dockerfile.rpm +++ b/packaging/rpm/dockerfiles/Dockerfile.rpm @@ -14,9 +14,9 @@ COPY . /workspace/FlagTensor RUN SPEC_VERSION=$(grep '^Version:' /workspace/FlagTensor/packaging/rpm/specs/flagtensor.spec | awk '{print $2}') && \ tar czf /root/rpmbuild/SOURCES/flagtensor-${SPEC_VERSION}.tar.gz \ - -C /workspace \ - --transform "s|^FlagTensor|flagtensor-${SPEC_VERSION}|" \ - FlagTensor + -C /workspace/FlagTensor \ + --transform "s|^\\./|flagtensor-${SPEC_VERSION}/|" \ + . RUN rpmbuild -ba /workspace/FlagTensor/packaging/rpm/specs/flagtensor.spec 2>&1 || \ { echo "=== build failed ==="; \ From a748f320b1508b2f29170754bb1f8fcc27f8103d Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Thu, 21 May 2026 21:30:26 +0900 Subject: [PATCH 04/14] fix(packaging): remove CURDIR fallback in find_spec; drop redundant torch Recommends --- packaging/debian/control | 3 ++- packaging/debian/rules | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packaging/debian/control b/packaging/debian/control index 3a01911..a1f0df1 100644 --- a/packaging/debian/control +++ b/packaging/debian/control @@ -17,6 +17,7 @@ Rules-Requires-Root: no Package: python3-flagtensor Architecture: all Depends: ${python3:Depends}, ${misc:Depends}, python3-matplotlib, python3-openpyxl -Recommends: python3-torch +# Note: python3-torch is pulled in automatically via ${python3:Depends} +# (dh_python3 scans imports), so no explicit Recommends needed. Description: FlagTensor — tensor utilities for FlagOS Tensor manipulation utilities (reshape/permute/index helpers) used across the FlagOS operator libraries. diff --git a/packaging/debian/rules b/packaging/debian/rules index f94a219..0cd7650 100755 --- a/packaging/debian/rules +++ b/packaging/debian/rules @@ -14,7 +14,7 @@ export PYBUILD_NAME = flagtensor # on import failures. Fixed with && short-circuit. override_dh_auto_test: @echo "=== smoke find_spec test ===" - @for d in .pybuild/cpython3_*/build $(CURDIR)/src $(CURDIR); do \ + @for d in .pybuild/cpython3_*/build; do \ if [ -d "$$d/flagtensor" ]; then \ echo "Found build dir: $$d"; \ PYTHONDONTWRITEBYTECODE=1 PYTHONPATH="$$d" python3 -c \ From 033135f41dc2b3325d32c6453d8fce9cef40f26b Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Thu, 21 May 2026 21:33:10 +0900 Subject: [PATCH 05/14] fix(packaging): preserve pip3 install stderr in Dockerfile.deb --- packaging/debian/build-helpers/Dockerfile.deb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/debian/build-helpers/Dockerfile.deb b/packaging/debian/build-helpers/Dockerfile.deb index 1c8fbdd..cbb3930 100644 --- a/packaging/debian/build-helpers/Dockerfile.deb +++ b/packaging/debian/build-helpers/Dockerfile.deb @@ -9,7 +9,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ git ca-certificates \ && apt-get clean && rm -rf /var/lib/apt/lists/* -RUN pip3 install --break-system-packages "setuptools>=60" "wheel>=0.45.1" 2>/dev/null || \ +RUN pip3 install --break-system-packages "setuptools>=60" "wheel>=0.45.1" || \ pip3 install "setuptools>=60" "wheel>=0.45.1" COPY . /workspace/FlagTensor From fead789a9fde3e4d16f487c240629f9b9cc11b76 Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Thu, 21 May 2026 21:42:51 +0900 Subject: [PATCH 06/14] fix(packaging): drop policy-violating pip install hack; bump base to ubuntu:24.04 --- packaging/debian/build-helpers/Dockerfile.deb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packaging/debian/build-helpers/Dockerfile.deb b/packaging/debian/build-helpers/Dockerfile.deb index cbb3930..e3cb3c1 100644 --- a/packaging/debian/build-helpers/Dockerfile.deb +++ b/packaging/debian/build-helpers/Dockerfile.deb @@ -1,4 +1,4 @@ -ARG BASE_IMAGE_VERSION=22.04 +ARG BASE_IMAGE_VERSION=24.04 FROM ubuntu:${BASE_IMAGE_VERSION} ENV DEBIAN_FRONTEND=noninteractive @@ -9,8 +9,6 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ git ca-certificates \ && apt-get clean && rm -rf /var/lib/apt/lists/* -RUN pip3 install --break-system-packages "setuptools>=60" "wheel>=0.45.1" || \ - pip3 install "setuptools>=60" "wheel>=0.45.1" COPY . /workspace/FlagTensor WORKDIR /workspace/FlagTensor From 983362327bb497a8953e93b7fb91128e2d03345f Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Thu, 21 May 2026 21:46:46 +0900 Subject: [PATCH 07/14] fix(packaging): align build script default base to 24.04 (was 22.04, mismatched Dockerfile) --- packaging/debian/build-helpers/build-flagtensor.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/debian/build-helpers/build-flagtensor.sh b/packaging/debian/build-helpers/build-flagtensor.sh index 13b2b48..61e12df 100755 --- a/packaging/debian/build-helpers/build-flagtensor.sh +++ b/packaging/debian/build-helpers/build-flagtensor.sh @@ -2,7 +2,7 @@ set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$(dirname "$(dirname "$SCRIPT_DIR")")")" -BASE_IMAGE_VERSION="${1:-22.04}" +BASE_IMAGE_VERSION="${1:-24.04}" IMAGE_TAG="flagtensor-deb:${BASE_IMAGE_VERSION}" OUTPUT_DIR="${PROJECT_DIR}/debian-packages" From 1431b7a8f9855694140bff5b177a091fa7ba808f Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Thu, 21 May 2026 21:58:21 +0900 Subject: [PATCH 08/14] ci(packaging): add build-deb.yml + build-rpm.yml Triggered on push tag v*, PR touching packaging/, or manual dispatch. Runs the existing local build helper in a container and uploads the produced .deb / .rpm as actions artifacts named 'flagtensor-amd64-packages' / 'flagtensor-amd64-rpm-packages', matching the central flagos-packaging publish pipeline's components/flagtensor.yml artifact_pattern. --- .github/workflows/build-deb.yml | 34 +++++++++++++++++++++++++++++++++ .github/workflows/build-rpm.yml | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 .github/workflows/build-deb.yml create mode 100644 .github/workflows/build-rpm.yml diff --git a/.github/workflows/build-deb.yml b/.github/workflows/build-deb.yml new file mode 100644 index 0000000..be428ba --- /dev/null +++ b/.github/workflows/build-deb.yml @@ -0,0 +1,34 @@ +name: Build Debian Packages + +on: + push: + tags: + - 'v*' + pull_request: + branches: [main] + paths: + - 'packaging/debian/**' + - '.github/workflows/build-deb.yml' + workflow_dispatch: + +jobs: + build-deb: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build .deb + run: bash packaging/debian/build-helpers/build-flagtensor.sh + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: flagtensor-amd64-packages + path: debian-packages/*.deb + retention-days: 7 diff --git a/.github/workflows/build-rpm.yml b/.github/workflows/build-rpm.yml new file mode 100644 index 0000000..6d5e673 --- /dev/null +++ b/.github/workflows/build-rpm.yml @@ -0,0 +1,34 @@ +name: Build RPM Packages + +on: + push: + tags: + - 'v*' + pull_request: + branches: [main] + paths: + - 'packaging/rpm/**' + - '.github/workflows/build-rpm.yml' + workflow_dispatch: + +jobs: + build-rpm: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build .rpm + run: bash packaging/rpm/build-flagtensor-rpm.sh + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: flagtensor-amd64-rpm-packages + path: rpm-packages/*.rpm + retention-days: 7 From b80e6dd23a4bf7068fcd39146f0c4e69efaf246f Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Thu, 21 May 2026 23:33:10 +0900 Subject: [PATCH 09/14] fix(packaging): rewrite find_spec test; exclude .git from tar; qualify Source0 --- packaging/debian/rules | 22 +++++++++++++++------- packaging/rpm/dockerfiles/Dockerfile.rpm | 1 + packaging/rpm/specs/flagtensor.spec | 3 +-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/packaging/debian/rules b/packaging/debian/rules index 0cd7650..15dabd1 100755 --- a/packaging/debian/rules +++ b/packaging/debian/rules @@ -14,13 +14,21 @@ export PYBUILD_NAME = flagtensor # on import failures. Fixed with && short-circuit. override_dh_auto_test: @echo "=== smoke find_spec test ===" - @for d in .pybuild/cpython3_*/build; do \ + # Use found_dir + break (not `&& exit 0` inside the loop) so future + # multi-Python builds verify every interpreter rather than stopping + # at the first match. + @found_dir=""; \ + for d in .pybuild/cpython3_*/build; do \ if [ -d "$$d/flagtensor" ]; then \ - echo "Found build dir: $$d"; \ - PYTHONDONTWRITEBYTECODE=1 PYTHONPATH="$$d" python3 -c \ - "import importlib.util; s = importlib.util.find_spec('flagtensor'); assert s and s.origin, 'flagtensor not findable'; print('OK: flagtensor at', s.origin)" \ - && exit 0; \ - echo "ERROR: find_spec failed"; exit 1; \ + found_dir="$$d"; \ + break; \ fi; \ done; \ - echo "ERROR: could not find a built flagtensor module"; exit 1 + if [ -z "$$found_dir" ]; then \ + echo "ERROR: could not find a built flagtensor module"; \ + exit 1; \ + fi; \ + echo "Found build dir: $$found_dir"; \ + PYTHONDONTWRITEBYTECODE=1 PYTHONPATH="$$found_dir" python3 -c \ + "import importlib.util; s = importlib.util.find_spec('flagtensor'); assert s and s.origin, 'flagtensor not findable'; print('OK: flagtensor at', s.origin)" + diff --git a/packaging/rpm/dockerfiles/Dockerfile.rpm b/packaging/rpm/dockerfiles/Dockerfile.rpm index e85a496..9ed6d44 100644 --- a/packaging/rpm/dockerfiles/Dockerfile.rpm +++ b/packaging/rpm/dockerfiles/Dockerfile.rpm @@ -15,6 +15,7 @@ COPY . /workspace/FlagTensor RUN SPEC_VERSION=$(grep '^Version:' /workspace/FlagTensor/packaging/rpm/specs/flagtensor.spec | awk '{print $2}') && \ tar czf /root/rpmbuild/SOURCES/flagtensor-${SPEC_VERSION}.tar.gz \ -C /workspace/FlagTensor \ + --exclude='./.git' \ --transform "s|^\\./|flagtensor-${SPEC_VERSION}/|" \ . diff --git a/packaging/rpm/specs/flagtensor.spec b/packaging/rpm/specs/flagtensor.spec index bc31200..61a96f7 100644 --- a/packaging/rpm/specs/flagtensor.spec +++ b/packaging/rpm/specs/flagtensor.spec @@ -7,8 +7,7 @@ Summary: FlagTensor — tensor utilities for FlagOS License: Apache-2.0 URL: https://github.com/flagos-ai/FlagTensor -Source0: flagtensor-%{version}.tar.gz - +Source0: %{url}/archive/v%{version}/flagtensor-%{version}.tar.gz BuildArch: noarch BuildRequires: python3-devel BuildRequires: python3-setuptools >= 60 From d882517a354ec6254ca787329a3d316e02de1df6 Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Fri, 22 May 2026 13:32:23 +0900 Subject: [PATCH 10/14] fix(packaging): replace ${python3:Depends} with python3:any; filter torch+triton from RPM Requires --- packaging/debian/control | 7 ++++--- packaging/rpm/specs/flagtensor.spec | 7 +++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packaging/debian/control b/packaging/debian/control index a1f0df1..6b94e9b 100644 --- a/packaging/debian/control +++ b/packaging/debian/control @@ -16,8 +16,9 @@ Rules-Requires-Root: no Package: python3-flagtensor Architecture: all -Depends: ${python3:Depends}, ${misc:Depends}, python3-matplotlib, python3-openpyxl -# Note: python3-torch is pulled in automatically via ${python3:Depends} -# (dh_python3 scans imports), so no explicit Recommends needed. +Depends: python3:any, ${misc:Depends}, python3-matplotlib, python3-openpyxl +# python3-torch and triton are intentionally NOT declared. distro torch is +# CPU-only, triton has no current distro package. Install both via pip +# (see packaging/INSTALL.md). Description: FlagTensor — tensor utilities for FlagOS Tensor manipulation utilities (reshape/permute/index helpers) used across the FlagOS operator libraries. diff --git a/packaging/rpm/specs/flagtensor.spec b/packaging/rpm/specs/flagtensor.spec index 61a96f7..ee8157d 100644 --- a/packaging/rpm/specs/flagtensor.spec +++ b/packaging/rpm/specs/flagtensor.spec @@ -1,5 +1,12 @@ %global debug_package %{nil} +# Filter out auto-generated Requires for ML/non-distro runtime deps +# (torch GPU build, triton, hydra-core...): the distro has no GPU-capable +# python3-torch, no current triton, no hydra-core; users install matching +# versions via pip per packaging/INSTALL.md. Match python3dist and +# python3.X.Ydist forms (Fedora >= 39 uses the latter). +%global __requires_exclude ^python3.*dist.*(torch|triton) + Name: python3-flagtensor Version: 0.1.0 Release: 1%{?dist} From de756bdb0175a9dc186c987dae0a315a4b819652 Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Fri, 22 May 2026 17:37:54 +0900 Subject: [PATCH 11/14] fix(packaging): refine RPM exclude comment; Source0 fedora-style --- packaging/rpm/specs/flagtensor.spec | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packaging/rpm/specs/flagtensor.spec b/packaging/rpm/specs/flagtensor.spec index ee8157d..acf8a53 100644 --- a/packaging/rpm/specs/flagtensor.spec +++ b/packaging/rpm/specs/flagtensor.spec @@ -1,10 +1,9 @@ %global debug_package %{nil} -# Filter out auto-generated Requires for ML/non-distro runtime deps -# (torch GPU build, triton, hydra-core...): the distro has no GPU-capable -# python3-torch, no current triton, no hydra-core; users install matching -# versions via pip per packaging/INSTALL.md. Match python3dist and -# python3.X.Ydist forms (Fedora >= 39 uses the latter). +# Filter the auto-generated Requires for: torch + triton. +# Reason: distro torch is CPU-only; distro triton has no current version. Users install both via pip. +# See packaging/INSTALL.md (or future flagos-packaging install docs) for the +# user-side pip install incantation. %global __requires_exclude ^python3.*dist.*(torch|triton) Name: python3-flagtensor @@ -14,7 +13,7 @@ Summary: FlagTensor — tensor utilities for FlagOS License: Apache-2.0 URL: https://github.com/flagos-ai/FlagTensor -Source0: %{url}/archive/v%{version}/flagtensor-%{version}.tar.gz +Source0: %{url}/archive/refs/tags/v%{version}.tar.gz#/flagtensor-%{version}.tar.gz BuildArch: noarch BuildRequires: python3-devel BuildRequires: python3-setuptools >= 60 From b1217a04f8dc11a724684a1cdf336904cd744f52 Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Fri, 22 May 2026 17:55:12 +0900 Subject: [PATCH 12/14] fix(packaging): drop -d from dpkg-buildpackage (#9); CI trigger on src paths (#8); .dockerignore (#11) --- .dockerignore | 21 +++++++++++++++++++ .github/workflows/build-deb.yml | 2 ++ .github/workflows/build-rpm.yml | 2 ++ packaging/debian/build-helpers/Dockerfile.deb | 2 +- 4 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..0aa6667 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,21 @@ +# VCS +.git/ +.gitignore + +# Python build artifacts +*.egg-info/ +__pycache__/ +*.py[cod] +*.so +build/ +dist/ +.eggs/ + +# Packaging outputs (avoid re-bundling previous build products) +debian-packages/ +rpm-packages/ + +# Editor / OS +.vscode/ +.idea/ +.DS_Store diff --git a/.github/workflows/build-deb.yml b/.github/workflows/build-deb.yml index be428ba..4726f86 100644 --- a/.github/workflows/build-deb.yml +++ b/.github/workflows/build-deb.yml @@ -8,6 +8,8 @@ on: branches: [main] paths: - 'packaging/debian/**' + - 'src/**' + - 'pyproject.toml' - '.github/workflows/build-deb.yml' workflow_dispatch: diff --git a/.github/workflows/build-rpm.yml b/.github/workflows/build-rpm.yml index 6d5e673..c4d234c 100644 --- a/.github/workflows/build-rpm.yml +++ b/.github/workflows/build-rpm.yml @@ -8,6 +8,8 @@ on: branches: [main] paths: - 'packaging/rpm/**' + - 'src/**' + - 'pyproject.toml' - '.github/workflows/build-rpm.yml' workflow_dispatch: diff --git a/packaging/debian/build-helpers/Dockerfile.deb b/packaging/debian/build-helpers/Dockerfile.deb index e3cb3c1..c2dfe8b 100644 --- a/packaging/debian/build-helpers/Dockerfile.deb +++ b/packaging/debian/build-helpers/Dockerfile.deb @@ -15,7 +15,7 @@ WORKDIR /workspace/FlagTensor RUN cp -r packaging/debian debian -RUN dpkg-buildpackage -us -uc -b -d || \ +RUN dpkg-buildpackage -us -uc -b || \ { echo "=== build failed ===" >&2; \ find /workspace -name "*.log" -exec echo "=== {} ===" \; -exec cat {} \; 2>/dev/null || true; \ exit 1; } From 0a344ac3c9f77bfca99cd5a1f3050c476ade05d4 Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Fri, 22 May 2026 18:05:02 +0900 Subject: [PATCH 13/14] fix(packaging): %license LICENSE (drop wildcard, only one license file in repo) --- packaging/rpm/specs/flagtensor.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/rpm/specs/flagtensor.spec b/packaging/rpm/specs/flagtensor.spec index acf8a53..a60c93f 100644 --- a/packaging/rpm/specs/flagtensor.spec +++ b/packaging/rpm/specs/flagtensor.spec @@ -44,7 +44,7 @@ PYTHONDONTWRITEBYTECODE=1 \ python3 -c "import importlib.util; s = importlib.util.find_spec('flagtensor'); assert s and s.origin, 'flagtensor not findable'; print('OK: flagtensor at', s.origin)" %files -f %{pyproject_files} -%license LICENSE* +%license LICENSE %changelog * Wed May 13 2026 FlagOS Contributors - 0.1.0-1 From dd064b9bb50d15ed04aede70deb127f9c19ab1ae Mon Sep 17 00:00:00 2001 From: Cheng Li Date: Fri, 22 May 2026 21:59:57 +0900 Subject: [PATCH 14/14] fix(packaging): round 17-20 cleanup (regex tighten + INSTALL.md + lintian) --- packaging/INSTALL.md | 26 +++++++++++++++++++ packaging/debian/build-helpers/Dockerfile.deb | 6 +++++ packaging/rpm/specs/flagtensor.spec | 3 +-- 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 packaging/INSTALL.md diff --git a/packaging/INSTALL.md b/packaging/INSTALL.md new file mode 100644 index 0000000..00b1c78 --- /dev/null +++ b/packaging/INSTALL.md @@ -0,0 +1,26 @@ +# Installing python3-flagtensor + +After `apt install python3-flagtensor` (Debian/Ubuntu) or `dnf install python3-flagtensor` (Fedora), +install the ML runtime separately — it is intentionally **not** declared as a +hard Depends/Requires because the distro versions are CPU-only (torch) or +too old (triton) for GPU workloads. + +FlagTensor needs PyTorch (GPU build) and Triton at runtime: + +```bash +pip install --index-url https://download.pytorch.org/whl/cu128 torch==2.9.0+cu128 +pip install triton +``` + +A `venv` is recommended to isolate pip-installed packages from the system +Python: + +```bash +python3 -m venv ~/.venv/flagos +source ~/.venv/flagos/bin/activate +# then the pip install lines above +``` + +Note: the distro `python3-torch` package (CPU-only build) is intentionally +not pulled in — FlagOS workloads need a GPU build, which PyTorch upstream +distributes via PyPI (per-CUDA-version wheels), not as a `.deb` / `.rpm`. diff --git a/packaging/debian/build-helpers/Dockerfile.deb b/packaging/debian/build-helpers/Dockerfile.deb index c2dfe8b..160104d 100644 --- a/packaging/debian/build-helpers/Dockerfile.deb +++ b/packaging/debian/build-helpers/Dockerfile.deb @@ -7,6 +7,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ dh-python pybuild-plugin-pyproject \ python3-all python3-pip python3-setuptools python3-wheel \ git ca-certificates \ + lintian \ && apt-get clean && rm -rf /var/lib/apt/lists/* @@ -20,6 +21,11 @@ RUN dpkg-buildpackage -us -uc -b || \ find /workspace -name "*.log" -exec echo "=== {} ===" \; -exec cat {} \; 2>/dev/null || true; \ exit 1; } +# Run lintian against the produced .deb — surface packaging warnings +# (unused-license-paragraph, no-manual-page, missing-build-dependency, etc.) +# in the build log without failing the build. +RUN lintian --info --display-info /workspace/python3-flagtensor_*.deb || true + RUN mkdir -p /output && \ find /workspace -maxdepth 1 -name "*.deb" -exec cp {} /output/ \; && \ find /workspace -maxdepth 1 -name "*.changes" -exec cp {} /output/ \; && \ diff --git a/packaging/rpm/specs/flagtensor.spec b/packaging/rpm/specs/flagtensor.spec index a60c93f..48c450d 100644 --- a/packaging/rpm/specs/flagtensor.spec +++ b/packaging/rpm/specs/flagtensor.spec @@ -4,8 +4,7 @@ # Reason: distro torch is CPU-only; distro triton has no current version. Users install both via pip. # See packaging/INSTALL.md (or future flagos-packaging install docs) for the # user-side pip install incantation. -%global __requires_exclude ^python3.*dist.*(torch|triton) - +%global __requires_exclude ^python3(\.[0-9]+)?dist\((torch|triton)\)$ Name: python3-flagtensor Version: 0.1.0 Release: 1%{?dist}