Context
#1937 added Windows ARM64 (win_arm64) wheel builds. cryptography is a base
dependency of autobahn and publishes no win_arm64 wheel, so pip builds it from
sdist on the windows-11-arm runner. That build links openssl-sys, which needs a
native ARM64 OpenSSL.
To unblock the ARM64 build we added a temporary bootstrap step in
.github/workflows/wheels.yml:
- name: Build OpenSSL for cryptography (Windows ARM64 only)
if: matrix.os == 'windows-11-arm'
shell: pwsh
run: |
vcpkg install --triplet arm64-windows-static-md --clean-after-build openssl
"OPENSSL_DIR=$env:VCPKG_INSTALLATION_ROOT\installed\arm64-windows-static-md" |
Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
This step exists only to work around the missing upstream wheel. It should be
deleted once upstream ships one again.
Upstream status
WoA support landed via pyca/cryptography#15350
and win_arm64 wheels were published — then dropped again:
| cryptography |
win_arm64 wheels |
| 46.0.0 – 46.0.3 |
yes (cp38-abi3, cp311-abi3, cp314-cp314t) |
| 46.0.4 – 50.0.1 |
no |
Verified against the PyPI JSON API on 2026-09-22; latest release is 50.0.1 and still
has none.
Do NOT gate this on the version floor
pyproject.toml declares cryptography>=3.4.6. Tying removal to that floor — or to any
version bound — is unsound, because availability is not monotonic: 46.0.3 has the
wheel and 46.0.4+ do not. A >=46.0.0 floor would wrongly imply the bootstrap is
unnecessary.
The correct condition is about the resolved version at build time, not a declared
bound.
Exit criteria
Remove the step when the version that actually resolves on the ARM64 runner ships a
win_arm64 wheel:
pip index versions cryptography # note the version that resolves
# then confirm a *-win_arm64.whl exists for it on PyPI
Work items
Related
See also #1935 (wheel tiers) — win_arm64 is best-effort, which is part of why this
workaround is acceptable in the interim.
Context
#1937 added Windows ARM64 (
win_arm64) wheel builds.cryptographyis a basedependency of
autobahnand publishes nowin_arm64wheel, so pip builds it fromsdist on the
windows-11-armrunner. That build linksopenssl-sys, which needs anative ARM64 OpenSSL.
To unblock the ARM64 build we added a temporary bootstrap step in
.github/workflows/wheels.yml:This step exists only to work around the missing upstream wheel. It should be
deleted once upstream ships one again.
Upstream status
WoA support landed via pyca/cryptography#15350
and
win_arm64wheels were published — then dropped again:win_arm64wheelscp38-abi3,cp311-abi3,cp314-cp314t)Verified against the PyPI JSON API on 2026-09-22; latest release is 50.0.1 and still
has none.
Do NOT gate this on the version floor
pyproject.tomldeclarescryptography>=3.4.6. Tying removal to that floor — or to anyversion bound — is unsound, because availability is not monotonic: 46.0.3 has the
wheel and 46.0.4+ do not. A
>=46.0.0floor would wrongly imply the bootstrap isunnecessary.
The correct condition is about the resolved version at build time, not a declared
bound.
Exit criteria
Remove the step when the version that actually resolves on the ARM64 runner ships a
win_arm64wheel:Work items
cryptographyships awin_arm64wheelBuild OpenSSL for cryptography (Windows ARM64 only)step fromwheels.ymlwindows-11-armjob still passes (noOPENSSL_DIR, no vcpkg build)TODOcomment block above the stepRelated
See also #1935 (wheel tiers) —
win_arm64is best-effort, which is part of why thisworkaround is acceptable in the interim.