Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port & upstream mypyc wheel build workflow #3197

Merged
merged 3 commits into from
Aug 13, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/mypyc-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
mypy == 0.920
mypy == 0.971

# A bunch of packages for type information
mypy-extensions >= 0.4.3
Expand Down
56 changes: 48 additions & 8 deletions .github/workflows/pypi_upload.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: pypi_upload
name: Publish to PyPI

on:
release:
Expand All @@ -8,14 +8,14 @@ permissions:
contents: read

jobs:
build:
name: PyPI Upload
main:
name: sdist + pure wheel
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3

- name: Set up Python
- name: Set up latest Python
uses: actions/setup-python@v4
with:
python-version: "*"
Expand All @@ -26,11 +26,51 @@ jobs:
python -m pip install --upgrade build twine

- name: Build wheel and source distributions
run: |
python -m build
run: python -m build

- name: Upload to PyPI via Twine
env:
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
run: |
twine upload --verbose -u '__token__' dist/*
run: twine upload --verbose -u '__token__' dist/*

mypyc:
name: mypyc wheels (${{ matrix.name }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
name: linux-x86_64
- os: windows-2019
name: windows-amd64
- os: macos-11
name: macos-x86_64
macos_arch: "x86_64"
- os: macos-11
name: macos-arm64
macos_arch: "arm64"
- os: macos-11
name: macos-universal2
macos_arch: "universal2"

steps:
- uses: actions/checkout@v3

- name: Build wheels via cibuildwheel
uses: pypa/cibuildwheel@v2.8.1
env:
CIBW_ARCHS_MACOS: "${{ matrix.macos_arch }}"
# This isn't supported in pyproject.toml which makes sense (but is annoying).
CIBW_PROJECT_REQUIRES_PYTHON: ">=3.6.2"

- name: Upload wheels as workflow artifacts
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.name }}-mypyc-wheels
path: ./wheelhouse/*.whl

- name: Upload wheels to PyPI via Twine
env:
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
run: pipx run twine upload --verbose -u '__token__' wheelhouse/*.whl
52 changes: 52 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,58 @@ preview = true
requires = ["setuptools>=45.0", "setuptools_scm[toml]>=6.3.1", "wheel"]
build-backend = "setuptools.build_meta"

[tool.cibuildwheel]
build-verbosity = 1
# So these are the environments we target:
# - Python: CPython 3.6+ only
# - Architecture (64-bit only): amd64 / x86_64, universal2, and arm64
# - OS: Linux (no musl), Windows, and macOS
build = "cp3*-*"
skip = ["*-manylinux_i686", "*-musllinux_*", "*-win32", "pp-*"]
before-build = ["pip install -r .github/mypyc-requirements.txt"]
# This is the bare minimum needed to run the test suite. Pulling in the full
# test_requirements.txt would download a bunch of other packages not necessary
# here and would slow down the testing step a fair bit.
test-requires = ["pytest>=6.1.1"]
test-command = 'pytest {project} -k "not incompatible_with_mypyc"'
test-extras = ["d"," jupyter"]
# Skip trying to test arm64 builds on Intel Macs. (so cross-compilation doesn't
# straight up crash)
test-skip = ["*-macosx_arm64", "*-macosx_universal2:arm64"]

[tool.cibuildwheel.environment]
BLACK_USE_MYPYC = "1"
MYPYC_OPT_LEVEL = "3"
MYPYC_DEBUG_LEVEL = "0"
# The dependencies required to build wheels with mypyc aren't specified in
# [build-system].requires so we'll have to manage the build environment ourselves.
PIP_NO_BUILD_ISOLATION = "no"

[tool.cibuildwheel.linux]
before-build = [
"pip install -r .github/mypyc-requirements.txt",
"yum install -y clang",
]
# Newer images break the builds, not sure why. We'll need to investigate more later.
manylinux-x86_64-image = "quay.io/pypa/manylinux2014_x86_64:2021-11-20-f410d11"

[tool.cibuildwheel.linux.environment]
BLACK_USE_MYPYC = "1"
MYPYC_OPT_LEVEL = "3"
MYPYC_DEBUG_LEVEL = "0"
PIP_NO_BUILD_ISOLATION = "no"
# Black needs Clang to compile successfully on Linux.
CC = "clang"

[tool.cibuildwheel.windows]
# For some reason, (compiled) mypyc is failing to start up with "ImportError: DLL load
# failed: A dynamic link library (DLL) initialization routine failed." on Windows for
# at least 3.6. Let's just use interpreted mypy[c].
# See also: https://github.com/mypyc/mypyc/issues/819.
before-build = [
"pip install -r .github/mypyc-requirements.txt --no-binary mypy"
]

[tool.isort]
atomic = true
profile = "black"
Expand Down
5 changes: 4 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,10 @@ def find_python_files(base: Path) -> List[Path]:
]

opt_level = os.getenv("MYPYC_OPT_LEVEL", "3")
ext_modules = mypycify(mypyc_targets, opt_level=opt_level, verbose=True)
debug_level = os.getenv("MYPYC_DEBUG_LEVEL", "3")
ext_modules = mypycify(
mypyc_targets, opt_level=opt_level, debug_level=debug_level, verbose=True
)
else:
ext_modules = []

Expand Down