Skip to content

fix: build the aiconfigurator wheel as manylinux_2_28#1330

Merged
jasonqinzhou merged 5 commits into
mainfrom
anants/manylinux-wheel
Jul 8, 2026
Merged

fix: build the aiconfigurator wheel as manylinux_2_28#1330
jasonqinzhou merged 5 commits into
mainfrom
anants/manylinux-wheel

Conversation

@nv-anants

@nv-anants nv-anants commented Jul 8, 2026

Copy link
Copy Markdown
Member

The wheel carries a native Rust/PyO3 (abi3) extension but was built on ubuntu:jammy and tagged linux_x86_64 -- a bare platform tag that PyPI rejects and that effectively pins the wheel to the build host's glibc. Build it as a portable manylinux_2_28_x86_64 wheel instead (glibc >= 2.28; RHEL 8+ / Ubuntu 20.04+).

Move the build stage onto quay.io/pypa/manylinux_2_28_x86_64 (glibc 2.28) with an explicit rustup toolchain and uv, pinned to the image's CPython 3.12. maturin's built-in auditwheel checks the manylinux_2_28 policy and stamps the tag -- no separate auditwheel step. uv build makes maturin's PEP517 backend force --compatibility off, so the target is re-asserted via MATURIN_PEP517_ARGS on the build command. README notes the new tag.

Summary by CodeRabbit

  • Documentation

    • Updated the “Install from PyPI” guidance with the wheel’s manylinux_2_28_x86_64 compatibility and glibc >= 2.28 requirement.
    • Clarified that wheels are not published for macOS, Windows, or other architectures (including Linux aarch64); those platforms should install from source.
  • Chores

    • Improved the Linux release-wheel build to use a manylinux_2_28 multi-arch setup and deterministic compatibility tagging.
    • Updated the wheel verification step to use the pinned bundled CPython, and adjusted the maturin build constraint for consistency.

The wheel carries a native Rust/PyO3 (abi3) extension but was built on
ubuntu:jammy and tagged linux_x86_64 -- a bare platform tag that PyPI
rejects and that effectively pins the wheel to the build host's glibc.
Build it as a portable manylinux_2_28_x86_64 wheel instead (glibc >= 2.28;
RHEL 8+ / Ubuntu 20.04+).

Move the build stage onto quay.io/pypa/manylinux_2_28_x86_64 (glibc 2.28)
with an explicit rustup toolchain and uv, pinned to the image's CPython
3.12. maturin's built-in auditwheel checks the manylinux_2_28 policy and
stamps the tag -- no separate auditwheel step. uv build makes maturin's
PEP517 backend force --compatibility off, so the target is re-asserted via
MATURIN_PEP517_ARGS on the build command. README notes the new tag.

Verified: auditwheel reports the wheel consistent with manylinux_2_28_x86_64
(only whitelisted libc/libm/libpthread/libgcc_s referenced, nothing bundled);
it installs and runs on the jammy runtime image; verify_release_wheels.py passes.

Signed-off-by: Anant Sharma <anants@nvidia.com>
@nv-anants
nv-anants requested review from a team as code owners July 8, 2026 20:33
@github-actions github-actions Bot added the fix label Jul 8, 2026
@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The Docker build now targets manylinux_2_28 with a rustup-installed Rust toolchain, pins the Python interpreter used in the build image, and forces wheel compatibility settings during build and verification. The README note and build-system constraint now match the published wheel target.

Changes

Manylinux 2.28 build and docs alignment

Layer / File(s) Summary
Manylinux build stage and toolchain setup
docker/Dockerfile
Build stage switches to a manylinux-${TARGETARCH} base, copies uv, bootstraps Rust through rustup, sets Rust/Cargo environment variables and PATH, and pins UV_PYTHON to the image's CPython 3.12 path.
Wheel build, verification, and compatibility notes
docker/Dockerfile, README.md, pyproject.toml
Wheel build sets MATURIN_PEP517_ARGS="--compatibility manylinux_2_28", verification uses ${UV_PYTHON} instead of python, the README note names manylinux_2_28_x86_64/glibc >= 2.28 and unsupported platforms, and the build-system maturin minimum is raised to 1.5.1 with a compatibility comment.

Estimated code review effort: 2 (Simple) | ~10 minutes

Poem

A manylinux wheel takes flight,
rustup lights the build path bright,
UV_PYTHON stays in line,
verify scripts run just fine,
and README sets the stage tonight.

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly states the main change: building the wheel as manylinux_2_28.
Description check ✅ Passed The description explains the motivation and implementation, but it omits the template sections for reviewer start and related issues.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
docker/Dockerfile (1)

39-39: 📐 Maintainability & Code Quality | 🔵 Trivial

Consider pinning the Rust toolchain instead of the floating stable channel.

--default-toolchain stable will resolve to whatever the latest stable Rust release is at build time, so image rebuilds months apart can pick up different compiler versions, hurting build reproducibility for a release artifact.
[recommended_refactor_effort_low_reward_moderate]

-RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
-        | sh -s -- -y --profile minimal --default-toolchain stable
+RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
+        | sh -s -- -y --profile minimal --default-toolchain 1.83.0
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docker/Dockerfile` at line 39, The Rust install step is using the floating
stable channel, which makes rebuilds non-reproducible for release images. Update
the toolchain selection in the Dockerfile’s Rust bootstrap step to a pinned Rust
version instead of --default-toolchain stable, and keep the install aligned with
the existing rustup setup so future builds use the same compiler version.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docker/Dockerfile`:
- Around line 38-39: The rustup installation step in the Dockerfile can succeed
even when curl fails because the pipe is executed without pipefail, so the
failure is hidden and rustup is never installed. Update the RUN step around the
curl-to-sh invocation to avoid piping directly, and make sure the curl result is
explicitly checked before running the installer so the build fails fast if the
download does not succeed.
- Line 43: The UV_PYTHON setting points to the wrong interpreter name in the
Dockerfile. Update the ENV value in the container setup to use the cp312-cp312
Python executable path that actually exists there, and keep the change localized
to the UV_PYTHON definition so the image verifier can find the interpreter
reliably.
- Around line 59-70: The wheel build in the Dockerfile relies on the maturin PEP
517 compatibility behavior, but the current version range still permits older
1.5.x releases that do not include the needed fix. Tighten the maturin minimum
version in the build-system requirements used by the `uv build`/`maturin` path,
or alternatively move the manylinux compatibility setting into backend config so
the Docker build no longer depends on that version-specific CLI behavior.

---

Nitpick comments:
In `@docker/Dockerfile`:
- Line 39: The Rust install step is using the floating stable channel, which
makes rebuilds non-reproducible for release images. Update the toolchain
selection in the Dockerfile’s Rust bootstrap step to a pinned Rust version
instead of --default-toolchain stable, and keep the install aligned with the
existing rustup setup so future builds use the same compiler version.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: f6709aa7-78b6-4f70-be4a-6ba8d5ea3014

📥 Commits

Reviewing files that changed from the base of the PR and between 0828d6b and 13da122.

📒 Files selected for processing (2)
  • README.md
  • docker/Dockerfile
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: AIC Accuracy Regression Testing
  • GitHub Check: Cargo Deny
  • GitHub Check: Build and Test (unit)
  • GitHub Check: Rust/Python engine-step parity
  • GitHub Check: Build and Test (e2e)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.md

📄 CodeRabbit inference engine (.claude/rules/generator/config_schema.md)

**/*.md: Add computation rules in the rules authoring system when a new parameter requires non-trivial value computation beyond simple defaults
Add template modifications in the template authoring system when a new parameter requires special handling in generated artifacts

Files:

  • README.md
**/*

⚙️ CodeRabbit configuration file

**/*: - Prefer applicable inline comments. When the correct fix is clear, small, and limited to the commented diff hunk, include it as a GitHub Suggested Change so the author can apply it with one click.

  • Do not use a suggested change when the fix requires broader design choices, multiple files, generated artifacts, unavailable context, or validation that cannot be inferred from the diff.
  • If a comment is not directly applicable, state the smallest concrete next step and why a one-click suggestion is not safe.

Files:

  • README.md
  • docker/Dockerfile
🔇 Additional comments (2)
docker/Dockerfile (1)

18-37: LGTM!

README.md (1)

32-38: LGTM!

Comment thread docker/Dockerfile Outdated
Comment thread docker/Dockerfile
Comment thread docker/Dockerfile Outdated
Parameterize the wheel build stage by target architecture so it produces
both manylinux_2_28_x86_64 and manylinux_2_28_aarch64 wheels from one
Dockerfile.

BuildKit populates TARGETARCH (amd64/arm64) from --platform (default: the
build host's arch); `FROM manylinux-${TARGETARCH}` selects the matching PyPA
base (quay.io/pypa/manylinux_2_28_{x86_64,aarch64}) and only that stage is
built. MATURIN_PEP517_ARGS is unchanged -- maturin appends the arch, so the
tag resolves to _x86_64 or _aarch64 automatically. The crate is
architecture-agnostic (no target_arch code / x86 intrinsics) and the parquet
data payload is identical across arches.

Build an aarch64 wheel natively on ARM, or from an x86 host via QEMU/buildx:
  docker buildx build --platform linux/arm64 --target build --load .

Also drop a stale comment that referenced a [tool.maturin] compatibility
value that is not set (the target is asserted via MATURIN_PEP517_ARGS).

amd64 build re-verified unchanged; the aarch64 base pull and rustup
toolchain install validated under buildx QEMU emulation.

Signed-off-by: Anant Sharma <anants@nvidia.com>
@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

AIC Accuracy Regression Testing

Workflow result: success

Old revision: 2e33a9ef61afc35e21fd4e042fef040d1fad75e8

Summary

  • # samples added: 0
  • ttft_mape_improvement_%: 0.000000
  • tpot_mape_improvement_%: 0.000000
Comparison summary table
partition num_samples_added ttft_mape_improvement_% tpot_mape_improvement_%
all 0 0.000000 0.000000
agg 0 0.000000 0.000000
disagg 0 0.000000 0.000000
MiniMax-M2.5 0 0.000000 0.000000
Qwen3.5-397B-A17B 0 0.000000 0.000000
Kimi-K2.5 0 0.000000 0.000000
DeepSeek-V3 0 0.000000 0.000000
DeepSeek-R1-NVFP4 0 0.000000 0.000000
DeepSeek-V3.1-NVFP4 0 0.000000 0.000000
Qwen3-32B-NVFP4 0 0.000000 0.000000
DeepSeek-R1 0 0.000000 0.000000
Qwen3-32B 0 0.000000 0.000000
Qwen3-235B-A22B-FP8 0 0.000000 0.000000
Llama-3.1-8B-Instruct-FP8 0 0.000000 0.000000
b300_sxm 0 0.000000 0.000000
gb200 0 0.000000 0.000000
b200_sxm 0 0.000000 0.000000
gb300 0 0.000000 0.000000
h200_sxm 0 0.000000 0.000000
h100_sxm 0 0.000000 0.000000
vllm-agg 0 0.000000 0.000000
sglang-agg 0 0.000000 0.000000
trtllm-disagg 0 0.000000 0.000000
sglang-disagg 0 0.000000 0.000000
trtllm-agg 0 0.000000 0.000000
vllm-disagg 0 0.000000 0.000000
MiniMax-M2.5|b300_sxm|vllm|agg 0 0.000000 0.000000
Qwen3.5-397B-A17B|b300_sxm|sglang|agg 0 0.000000 0.000000
Kimi-K2.5|gb200|trtllm|disagg 0 0.000000 0.000000
Kimi-K2.5|b200_sxm|vllm|agg 0 0.000000 0.000000
Kimi-K2.5|b300_sxm|vllm|agg 0 0.000000 0.000000
MiniMax-M2.5|b200_sxm|vllm|agg 0 0.000000 0.000000
DeepSeek-V3|gb200|trtllm|disagg 0 0.000000 0.000000
DeepSeek-V3|gb300|trtllm|disagg 0 0.000000 0.000000
DeepSeek-V3|gb200|sglang|disagg 0 0.000000 0.000000
DeepSeek-V3|gb300|sglang|disagg 0 0.000000 0.000000
DeepSeek-V3|h200_sxm|sglang|agg 0 0.000000 0.000000
DeepSeek-V3|b200_sxm|trtllm|disagg 0 0.000000 0.000000
DeepSeek-V3|h200_sxm|sglang|disagg 0 0.000000 0.000000
MiniMax-M2.5|h200_sxm|vllm|agg 0 0.000000 0.000000
Qwen3.5-397B-A17B|b200_sxm|sglang|agg 0 0.000000 0.000000
DeepSeek-V3|b200_sxm|sglang|disagg 0 0.000000 0.000000
DeepSeek-V3|b200_sxm|sglang|agg 0 0.000000 0.000000
DeepSeek-V3|b200_sxm|trtllm|agg 0 0.000000 0.000000
DeepSeek-V3|h200_sxm|trtllm|disagg 0 0.000000 0.000000
DeepSeek-V3|h100_sxm|trtllm|disagg 0 0.000000 0.000000
DeepSeek-V3|h200_sxm|trtllm|agg 0 0.000000 0.000000
Kimi-K2.5|gb200|vllm|disagg 0 0.000000 0.000000
DeepSeek-V3|b300_sxm|sglang|agg 0 0.000000 0.000000
DeepSeek-R1-NVFP4|b200_sxm|trtllm|agg 0 0.000000 0.000000
DeepSeek-V3.1-NVFP4|b200_sxm|trtllm|agg 0 0.000000 0.000000
Qwen3-32B-NVFP4|b200_sxm|trtllm|disagg 0 0.000000 0.000000
Qwen3-32B-NVFP4|b200_sxm|trtllm|agg 0 0.000000 0.000000
DeepSeek-R1|gb200|trtllm|agg 0 0.000000 0.000000
Qwen3-32B|gb200|trtllm|agg 0 0.000000 0.000000
DeepSeek-V3.1-NVFP4|gb200|trtllm|agg 0 0.000000 0.000000
Qwen3-32B-NVFP4|gb200|trtllm|disagg 0 0.000000 0.000000
Qwen3-32B-NVFP4|gb200|trtllm|agg 0 0.000000 0.000000
Qwen3-32B|h100_sxm|sglang|agg 0 0.000000 0.000000
Qwen3-32B|h100_sxm|sglang|disagg 0 0.000000 0.000000
Qwen3-235B-A22B-FP8|h100_sxm|trtllm|agg 0 0.000000 0.000000
Qwen3-32B|h100_sxm|trtllm|agg 0 0.000000 0.000000
Qwen3-32B|h100_sxm|vllm|agg 0 0.000000 0.000000
Qwen3-235B-A22B-FP8|h200_sxm|sglang|agg 0 0.000000 0.000000
Qwen3-235B-A22B-FP8|h200_sxm|vllm|agg 0 0.000000 0.000000
Llama-3.1-8B-Instruct-FP8|h200_sxm|vllm|agg 0 0.000000 0.000000
MiniMax-M2.5|h100_sxm|vllm|agg 0 0.000000 0.000000
DeepSeek-R1|b200_sxm|sglang|agg 0 0.000000 0.000000
DeepSeek-R1|h200_sxm|sglang|agg 0 0.000000 0.000000
DeepSeek-R1|b200_sxm|trtllm|agg 0 0.000000 0.000000
DeepSeek-R1|h200_sxm|trtllm|agg 0 0.000000 0.000000
Comparison plot AIC accuracy regression testing comparison plot

Artifact bundle: accuracy-regression-testing-results

nv-anants added 3 commits July 8, 2026 15:10
docker/Dockerfile: download the rustup installer to disk instead of piping
`curl | sh`, so a failed download aborts the build (the pipeline previously
reported only sh's exit status and silently skipped rustup). Add curl retries
for transient network blips and pin the toolchain to 1.96.0 so release wheels
build reproducibly.

pyproject.toml: require maturin>=1.5.1. 1.5.1 fixed `--compatibility` handling
when run as a PEP517 backend, which the manylinux_2_28 wheel build depends on
(MATURIN_PEP517_ARGS="--compatibility manylinux_2_28"); 1.5.0 ignored it.

Signed-off-by: Anant Sharma <anants@nvidia.com>
Trim the verbose block comments added for the manylinux_2_28 wheel build to
their essential rationale (why manylinux/glibc 2.28, why MATURIN_PEP517_ARGS
overrides the PEP517 compatibility default, why pin the interpreter).

Signed-off-by: Anant Sharma <anants@nvidia.com>
Resolve the docker/Dockerfile conflict with #1329 (aiconfigurator-core wheel
removal): keep the manylinux_2_28 multi-arch build but drop the now-removed
core-wheel build step, so only the self-contained aiconfigurator wheel is built.
main's simplified verifier already asserts no aiconfigurator-core wheel is
present and the runtime stage installs aiconfigurator-*.whl only.

Signed-off-by: Anant Sharma <anants@nvidia.com>
Comment thread docker/Dockerfile Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
docker/Dockerfile (1)

44-44: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

UV_PYTHON still points at python3, which doesn't exist in this image.

This exact issue was raised in a prior review round and remains unfixed. manylinux cp*-cp* directories expose the interpreter as bin/python, not bin/python3 — confirmed by cibuildwheel's own existence check (test -x /opt/python/cp312-cp312/bin/python) and other manylinux usage reports. With the current path, "${UV_PYTHON}" at line 65 will fail with "no such file or directory."

🛠️ Suggested fix
-ENV UV_PYTHON=/opt/python/cp312-cp312/bin/python3
+ENV UV_PYTHON=/opt/python/cp312-cp312/bin/python
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docker/Dockerfile` at line 44, The Dockerfile still sets UV_PYTHON to a
non-existent interpreter path, so update the ENV value in the Dockerfile to
point at the manylinux interpreter name actually provided by the cp312-cp312
installation. Use the UV_PYTHON setting and the later "${UV_PYTHON}" invocation
as the reference points, and make sure the path matches the bin/python
executable exposed by the /opt/python/cp312-cp312 directory so the install step
can find it.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@docker/Dockerfile`:
- Line 44: The Dockerfile still sets UV_PYTHON to a non-existent interpreter
path, so update the ENV value in the Dockerfile to point at the manylinux
interpreter name actually provided by the cp312-cp312 installation. Use the
UV_PYTHON setting and the later "${UV_PYTHON}" invocation as the reference
points, and make sure the path matches the bin/python executable exposed by the
/opt/python/cp312-cp312 directory so the install step can find it.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 4a2851d2-2614-4fe9-9520-4f893dccae66

📥 Commits

Reviewing files that changed from the base of the PR and between 66d64c6 and b37e534.

📒 Files selected for processing (2)
  • README.md
  • docker/Dockerfile
✅ Files skipped from review due to trivial changes (1)
  • README.md
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
  • GitHub Check: AIC Accuracy Regression Testing
  • GitHub Check: Build and Test (unit)
  • GitHub Check: Cargo Deny
  • GitHub Check: Build and Test (e2e)
  • GitHub Check: Rust/Python engine-step parity
🧰 Additional context used
📓 Path-based instructions (1)
**/*

⚙️ CodeRabbit configuration file

**/*: - Prefer applicable inline comments. When the correct fix is clear, small, and limited to the commented diff hunk, include it as a GitHub Suggested Change so the author can apply it with one click.

  • Do not use a suggested change when the fix requires broader design choices, multiple files, generated artifacts, unavailable context, or validation that cannot be inferred from the diff.
  • If a comment is not directly applicable, state the smallest concrete next step and why a one-click suggestion is not safe.

Files:

  • docker/Dockerfile
🔇 Additional comments (2)
docker/Dockerfile (2)

18-25: LGTM!


63-65: LGTM!

Also applies to: 69-69

@simone-chen simone-chen left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR!

@jasonqinzhou
jasonqinzhou merged commit d01ce3d into main Jul 8, 2026
13 checks passed
@jasonqinzhou
jasonqinzhou deleted the anants/manylinux-wheel branch July 8, 2026 22:35
@jasonqinzhou
jasonqinzhou restored the anants/manylinux-wheel branch July 8, 2026 22:35
@jasonqinzhou
jasonqinzhou deleted the anants/manylinux-wheel branch July 8, 2026 22:36
jasonqinzhou pushed a commit that referenced this pull request Jul 8, 2026
* fix: build the aiconfigurator wheel as manylinux_2_28

The wheel carries a native Rust/PyO3 (abi3) extension but was built on
ubuntu:jammy and tagged linux_x86_64 -- a bare platform tag that PyPI
rejects and that effectively pins the wheel to the build host's glibc.
Build it as a portable manylinux_2_28_x86_64 wheel instead (glibc >= 2.28;
RHEL 8+ / Ubuntu 20.04+).

Move the build stage onto quay.io/pypa/manylinux_2_28_x86_64 (glibc 2.28)
with an explicit rustup toolchain and uv, pinned to the image's CPython
3.12. maturin's built-in auditwheel checks the manylinux_2_28 policy and
stamps the tag -- no separate auditwheel step. uv build makes maturin's
PEP517 backend force --compatibility off, so the target is re-asserted via
MATURIN_PEP517_ARGS on the build command. README notes the new tag.

Verified: auditwheel reports the wheel consistent with manylinux_2_28_x86_64
(only whitelisted libc/libm/libpthread/libgcc_s referenced, nothing bundled);
it installs and runs on the jammy runtime image; verify_release_wheels.py passes.

Signed-off-by: Anant Sharma <anants@nvidia.com>

* ci: build aiconfigurator wheels for arm64 as well as x86-64

Parameterize the wheel build stage by target architecture so it produces
both manylinux_2_28_x86_64 and manylinux_2_28_aarch64 wheels from one
Dockerfile.

BuildKit populates TARGETARCH (amd64/arm64) from --platform (default: the
build host's arch); `FROM manylinux-${TARGETARCH}` selects the matching PyPA
base (quay.io/pypa/manylinux_2_28_{x86_64,aarch64}) and only that stage is
built. MATURIN_PEP517_ARGS is unchanged -- maturin appends the arch, so the
tag resolves to _x86_64 or _aarch64 automatically. The crate is
architecture-agnostic (no target_arch code / x86 intrinsics) and the parquet
data payload is identical across arches.

Build an aarch64 wheel natively on ARM, or from an x86 host via QEMU/buildx:
  docker buildx build --platform linux/arm64 --target build --load .

Also drop a stale comment that referenced a [tool.maturin] compatibility
value that is not set (the target is asserted via MATURIN_PEP517_ARGS).

amd64 build re-verified unchanged; the aarch64 base pull and rustup
toolchain install validated under buildx QEMU emulation.

Signed-off-by: Anant Sharma <anants@nvidia.com>

* fix: harden Rust bootstrap and tighten maturin pin for wheel builds

docker/Dockerfile: download the rustup installer to disk instead of piping
`curl | sh`, so a failed download aborts the build (the pipeline previously
reported only sh's exit status and silently skipped rustup). Add curl retries
for transient network blips and pin the toolchain to 1.96.0 so release wheels
build reproducibly.

pyproject.toml: require maturin>=1.5.1. 1.5.1 fixed `--compatibility` handling
when run as a PEP517 backend, which the manylinux_2_28 wheel build depends on
(MATURIN_PEP517_ARGS="--compatibility manylinux_2_28"); 1.5.0 ignored it.

Signed-off-by: Anant Sharma <anants@nvidia.com>

* docs: condense wheel-build comments in Dockerfile

Trim the verbose block comments added for the manylinux_2_28 wheel build to
their essential rationale (why manylinux/glibc 2.28, why MATURIN_PEP517_ARGS
overrides the PEP517 compatibility default, why pin the interpreter).

Signed-off-by: Anant Sharma <anants@nvidia.com>

---------

Signed-off-by: Anant Sharma <anants@nvidia.com>
(cherry picked from commit d01ce3d)
nv-nmailhot pushed a commit that referenced this pull request Jul 8, 2026
* fix: build the aiconfigurator wheel as manylinux_2_28

The wheel carries a native Rust/PyO3 (abi3) extension but was built on
ubuntu:jammy and tagged linux_x86_64 -- a bare platform tag that PyPI
rejects and that effectively pins the wheel to the build host's glibc.
Build it as a portable manylinux_2_28_x86_64 wheel instead (glibc >= 2.28;
RHEL 8+ / Ubuntu 20.04+).

Move the build stage onto quay.io/pypa/manylinux_2_28_x86_64 (glibc 2.28)
with an explicit rustup toolchain and uv, pinned to the image's CPython
3.12. maturin's built-in auditwheel checks the manylinux_2_28 policy and
stamps the tag -- no separate auditwheel step. uv build makes maturin's
PEP517 backend force --compatibility off, so the target is re-asserted via
MATURIN_PEP517_ARGS on the build command. README notes the new tag.

Verified: auditwheel reports the wheel consistent with manylinux_2_28_x86_64
(only whitelisted libc/libm/libpthread/libgcc_s referenced, nothing bundled);
it installs and runs on the jammy runtime image; verify_release_wheels.py passes.



* ci: build aiconfigurator wheels for arm64 as well as x86-64

Parameterize the wheel build stage by target architecture so it produces
both manylinux_2_28_x86_64 and manylinux_2_28_aarch64 wheels from one
Dockerfile.

BuildKit populates TARGETARCH (amd64/arm64) from --platform (default: the
build host's arch); `FROM manylinux-${TARGETARCH}` selects the matching PyPA
base (quay.io/pypa/manylinux_2_28_{x86_64,aarch64}) and only that stage is
built. MATURIN_PEP517_ARGS is unchanged -- maturin appends the arch, so the
tag resolves to _x86_64 or _aarch64 automatically. The crate is
architecture-agnostic (no target_arch code / x86 intrinsics) and the parquet
data payload is identical across arches.

Build an aarch64 wheel natively on ARM, or from an x86 host via QEMU/buildx:
  docker buildx build --platform linux/arm64 --target build --load .

Also drop a stale comment that referenced a [tool.maturin] compatibility
value that is not set (the target is asserted via MATURIN_PEP517_ARGS).

amd64 build re-verified unchanged; the aarch64 base pull and rustup
toolchain install validated under buildx QEMU emulation.



* fix: harden Rust bootstrap and tighten maturin pin for wheel builds

docker/Dockerfile: download the rustup installer to disk instead of piping
`curl | sh`, so a failed download aborts the build (the pipeline previously
reported only sh's exit status and silently skipped rustup). Add curl retries
for transient network blips and pin the toolchain to 1.96.0 so release wheels
build reproducibly.

pyproject.toml: require maturin>=1.5.1. 1.5.1 fixed `--compatibility` handling
when run as a PEP517 backend, which the manylinux_2_28 wheel build depends on
(MATURIN_PEP517_ARGS="--compatibility manylinux_2_28"); 1.5.0 ignored it.



* docs: condense wheel-build comments in Dockerfile

Trim the verbose block comments added for the manylinux_2_28 wheel build to
their essential rationale (why manylinux/glibc 2.28, why MATURIN_PEP517_ARGS
overrides the PEP517 compatibility default, why pin the interpreter).



---------


(cherry picked from commit d01ce3d)

Signed-off-by: Anant Sharma <anants@nvidia.com>
Co-authored-by: Anant Sharma <anants@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants