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

Build modernization (GHA, wheels, setuptools) #407

Merged
merged 48 commits into from Dec 12, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
0ba72f8
Script for build manylinux wheels
bsolomon1124 May 23, 2020
cfb1d7d
Build libyaml ourselves, nix yum install
bsolomon1124 May 23, 2020
4327345
Build manylinux2014 wheels in CI
bsolomon1124 May 24, 2020
99568e5
chmod +x
bsolomon1124 May 24, 2020
cc9f531
Typo
bsolomon1124 May 24, 2020
a7de8d2
Remove deprecated 'sudo' arg
bsolomon1124 May 24, 2020
79bbe26
Use --workdir to put ourselves in /io
bsolomon1124 May 24, 2020
d2139d0
Build pure-Python wheels
bsolomon1124 May 24, 2020
8d9be9e
Typo on pip flag
bsolomon1124 May 24, 2020
dcb137a
Remove sudo, check UID 0 instead
bsolomon1124 May 24, 2020
3165b50
Shell syntax
bsolomon1124 May 24, 2020
2a2bfc6
Avoid error where we may be root but not have sudo itself available
bsolomon1124 May 24, 2020
115228c
ls wheel dir after successful build
bsolomon1124 May 24, 2020
59bcd38
Namespace _yaml extension under yaml package
bsolomon1124 May 27, 2020
75ccf4c
[snapshot] Simplify setup.py per 'Distributing Cython modules' docume…
bsolomon1124 May 27, 2020
3ad7bb0
Make build_ext happy with package structure
bsolomon1124 May 27, 2020
3108af5
Specify USE_CYTHON for build
bsolomon1124 May 28, 2020
9803591
Fix ternary
bsolomon1124 May 28, 2020
dee7252
Revert "Fix ternary"
bsolomon1124 May 28, 2020
57cb517
Revert "Specify USE_CYTHON for build"
bsolomon1124 May 28, 2020
76d7f19
Revert "Make build_ext happy with package structure"
bsolomon1124 May 28, 2020
f69087c
Revert "[snapshot] Simplify setup.py per 'Distributing Cython modules…
bsolomon1124 May 28, 2020
46eed93
Reset to 59bcd38 / cherry-pick 3ad7bb0
bsolomon1124 May 28, 2020
c0180aa
Update extension path
bsolomon1124 May 28, 2020
d6f7f87
Update ignored build artifacts
bsolomon1124 May 28, 2020
cb71ba5
Build MacOS wheels
bsolomon1124 May 28, 2020
c2203e7
Create a 'stub' _yaml package for relocated _yaml extension
bsolomon1124 May 28, 2020
6269678
Incorporate macos into Travis build matrix
bsolomon1124 May 28, 2020
8e9cebe
Put _yaml stub under lib/ to aggree with package_dir
bsolomon1124 May 28, 2020
393985f
Use --disable-dependency-tracking for one-time build (see https://git…
bsolomon1124 May 28, 2020
ee1dc2b
No ldconfig on MacOS
bsolomon1124 May 28, 2020
b509351
Don't use -m flag when not in virtual env
bsolomon1124 May 28, 2020
54abbdc
Downgrade to 2.7.17 (.18 not avail via pyenv-build yet?)
bsolomon1124 May 28, 2020
02de749
Echo available Python versions if pyenv cannot find
bsolomon1124 May 28, 2020
6ecc19d
Remove verbose flag when removing temp dir
bsolomon1124 May 28, 2020
4f9aae0
Convert wheel build from Travis CI to GitHub Actions
bsolomon1124 Jun 4, 2020
71fe365
Fixups for GitHub Actions build environment
bsolomon1124 Jun 4, 2020
c781067
Put brew cmds in the right place
bsolomon1124 Jun 4, 2020
f6225d2
Fix brew flag
bsolomon1124 Jun 5, 2020
510d297
CI runner failures ... who knows
bsolomon1124 Jun 5, 2020
27a27ce
Apparently -q is not actually a global option...
bsolomon1124 Jun 5, 2020
6656bd7
libyaml build/test also wants tac from coreutils
bsolomon1124 Jun 5, 2020
c577b2f
Pure-Py wheels need --without-libyaml
bsolomon1124 Jun 5, 2020
007869b
Attempt manylinux1_x86_64 over manylinux2014
bsolomon1124 Jun 5, 2020
9dba870
Build across manylinux1 + manylinux2014
bsolomon1124 Jun 5, 2020
473a885
CI to GHA, wheel builds
nitzmahone Dec 11, 2020
6a292fa
PEP517, setuptools conversion
nitzmahone Dec 12, 2020
6c9faab
Windows tweaks
nitzmahone Dec 12, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .appveyor.yml
Expand Up @@ -10,7 +10,7 @@ image:

environment:
libyaml_repo_url: https://github.com/yaml/libyaml.git
libyaml_refspec: 0.2.2
libyaml_refspec: 0.2.5
PYYAML_TEST_GROUP: all

# matrix:
Expand Down
236 changes: 236 additions & 0 deletions .github/workflows/ci.yml
@@ -0,0 +1,236 @@
---

name: PyYAML CI
on:
push:
pull_request:
workflow_dispatch:

env:
LIBYAML_REPO: https://github.com/yaml/libyaml
LIBYAML_REF: '0.2.5'
jobs:
python_sdist:
name: pyyaml sdist
runs-on: ubuntu-latest
steps:
- name: checkout pyyaml
uses: actions/checkout@v2

- name: install a python
uses: actions/setup-python@v2
with:
python-version: 3.x

- name: install build deps
run: |
python -V
python -m pip install build
- name: build sdist
run: |
export PYYAML_FORCE_CYTHON=1 # we DO want to force Cythoning, at least until 6.0
export PYYAML_FORCE_LIBYAML=0 # we don't actually want to build the lib

Choose a reason for hiding this comment

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

@nitzmahone traditionally, it's common to include C-files generated from Cython in sdists.

Copy link

@henryiii henryiii Dec 12, 2020

Choose a reason for hiding this comment

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

With pyproject.toml it's not as important anymore, as you can specify Cython as a build dependency. (Not saying you can't)

Choose a reason for hiding this comment

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

@henryiii and it is specified there. I just remember that we tried to avoid that in aiohttp because at the time installing Cython required some extra system build deps.

python -m build .
# ensure exactly one artifact was produced
shopt -s nullglob
DISTFILES=(dist/*.tar.gz)
if [[ ${DISTFILES[@]} -ne 1 ]]; then
echo "unexpected content in dist dir: $(ls dist/*.tar.gz)"
exit 1
fi
- name: test sdist
run: |
# install some libyaml headers
# TODO: should we smoke test the sdist against the libyaml we built?
sudo apt update
sudo apt install libyaml-dev -y
# ensure Cython is not present so we use only what's in the sdist
python -m pip uninstall Cython -y || true

Choose a reason for hiding this comment

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

This shouldn't matter because unless you disable pip PEP517 build env isolation, it'll be built in a separate clean virtualenv that does not have Cython unless you add it as a build dep via pyproject.toml

# pass no extra args- we should auto-install with libyaml since it's present
python -m pip install dist/*.tar.gz -v
python packaging/build/smoketest.py
- name: upload sdist artifact
uses: actions/upload-artifact@v2
with:
name: dist
path: dist/*.tar.gz


linux_libyaml:
name: libyaml ${{ matrix.arch }} ${{ matrix.platform }}
runs-on: ubuntu-latest
strategy:
matrix:
platform:
# manylinux1 is forward-compatible to 2010/2014
#- manylinux2014
#- manylinux2010
- manylinux1
arch:
- x86_64
env:
DOCKER_IMAGE: quay.io/pypa/${{ matrix.platform }}_${{ matrix.arch }}
steps:
- name: check cached libyaml state
id: cached_libyaml
uses: actions/cache@v2
with:
path: |
libyaml
key: libyaml_${{ matrix.platform }}_${{ matrix.arch }}_${{ env.LIBYAML_REF }}

- name: checkout pyyaml
uses: actions/checkout@v2
if: steps.cached_libyaml.outputs.cache-hit != 'true'

- name: build libyaml
run: |
docker run --rm -v $(pwd):/io -e LIBYAML_REF -e LIBYAML_REPO --workdir /io "$DOCKER_IMAGE" /io/packaging/build/libyaml.sh
if: steps.cached_libyaml.outputs.cache-hit != 'true'

linux_pyyaml:
needs: linux_libyaml
name: pyyaml ${{ matrix.arch }} ${{ matrix.platform }} ${{ matrix.python_tag }}
runs-on: ubuntu-latest
strategy:
matrix:
platform:
# so long as manylinux1 container builds work, they're forward-compatible to 2010/2014
# - manylinux2014
# - manylinux2010
- manylinux1
arch:
- x86_64
python_tag:
# NB: manylinux >=2014 containers don't have Python 2.7, so we have to use exclude to skip it
- cp27-cp27mu

Choose a reason for hiding this comment

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

@nitzmahone why only "mu"? py2 has two separate builds to link against

Choose a reason for hiding this comment

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

You also need "cp27-cp27m" to cover that.

- cp36-cp36m
- cp37-cp37m
- cp38-cp38
- cp39-cp39
# exclude:
# - platform: manylinux2014
# arch: x86_64
# python_tag: cp27-cp27mu
env:
AW_PLAT: ${{ matrix.platform }}_${{ matrix.arch }}
DOCKER_IMAGE: quay.io/pypa/${{ matrix.platform }}_${{ matrix.arch }}
PYTHON_TAG: ${{ matrix.python_tag }}
PYYAML_BUILD_WHEELS: 1
steps:
- uses: actions/checkout@v2

- name: fetch cached libyaml
id: cached_libyaml
uses: actions/cache@v2
with:
path: |
libyaml
key: libyaml_${{ matrix.platform }}_${{ matrix.arch }}_${{ env.LIBYAML_REF }}

- name: ensure libyaml fetched
run: exit 1
if: steps.cached_libyaml.outputs.cache-hit != 'true'

- name: start container
run: |
docker run --name worker -t -d --rm -v $(pwd):/io "$DOCKER_IMAGE" bash
- name: build/test/package
run: |
docker exec -e PYTHON_TAG -e PYYAML_RUN_TESTS -e PYYAML_BUILD_WHEELS -e AW_PLAT --workdir /io worker \
/io/packaging/build/manylinux.sh
- uses: actions/upload-artifact@v2
with:
name: dist
path: dist/*.whl

macos_libyaml:
name: libyaml ${{ matrix.arch }} ${{ matrix.platform }}
runs-on: ${{ matrix.platform }}
strategy:
matrix:
platform:
- macos-10.15
arch:
- x86_64
steps:
- name: check cached libyaml state
id: cached_libyaml
uses: actions/cache@v2
with:
path: |
libyaml
key: libyaml_${{ matrix.platform }}_${{ matrix.arch }}_${{ env.LIBYAML_REF }}

- name: checkout pyyaml
uses: actions/checkout@v2
if: steps.cached_libyaml.outputs.cache-hit != 'true'

- name: build libyaml
env:
MACOSX_DEPLOYMENT_TARGET: '10.9'
run: |
brew install automake coreutils
bash ./packaging/build/libyaml.sh
if: steps.cached_libyaml.outputs.cache-hit != 'true'


macos_pyyaml:
needs: macos_libyaml
name: pyyaml ${{ matrix.arch }} ${{ matrix.platform }} ${{ matrix.python_tag }}
runs-on: ${{ matrix.platform }}
strategy:
matrix:
platform:
- macos-10.15
arch:
- x86_64
python_tag:
- cp27*
- cp36*
- cp37*
- cp38*
- cp39*
steps:
- name: checkout pyyaml
uses: actions/checkout@v2

- name: get cached libyaml state
id: cached_libyaml
uses: actions/cache@v2
with:
path: |
libyaml
key: libyaml_${{ matrix.platform }}_${{ matrix.arch }}_${{ env.LIBYAML_REF }}

- name: ensure libyaml fetched
run: exit 1
if: steps.cached_libyaml.outputs.cache-hit != 'true'

- name: install a python
uses: actions/setup-python@v2
with:
python-version: 3.x

- name: build/test/package
env:
CIBW_BUILD: ${{ matrix.python_tag }}
CIBW_BUILD_VERBOSITY: 1
run: |
bash ./packaging/build/macos.sh
- uses: actions/upload-artifact@v2
with:
name: dist
path: dist/*.whl
9 changes: 8 additions & 1 deletion .gitignore
@@ -1,8 +1,15 @@
# build outputs
/dist/*
/build/*
/ext/_yaml.c
/lib/PyYAML.egg-info/*
/lib3/PyYAML.egg-info/*
/wheelhouse/*
/yaml/_yaml.c
MANIFEST
**/*.so
**/*.dylib
**/*.pyd


# cached Python binaries
*.py[cdo]
Expand Down
54 changes: 0 additions & 54 deletions .travis.yml

This file was deleted.

5 changes: 4 additions & 1 deletion MANIFEST.in
@@ -1,7 +1,10 @@
include README LICENSE CHANGES setup.py
include CHANGES README LICENSE Makefile pyproject.toml setup.py
recursive-include lib/yaml *.py
recursive-include lib/_yaml *.py
recursive-include lib3/yaml *.py
recursive-include lib3/_yaml *.py
recursive-include examples *.py *.cfg *.yaml
recursive-include tests/data *
recursive-include tests/lib *.py
recursive-include tests/lib3 *.py
recursive-include yaml *
31 changes: 31 additions & 0 deletions lib/_yaml/__init__.py
@@ -0,0 +1,31 @@
# This is a stub package designed to roughly emulate the _yaml
# extension module, which previously existed as a standalone module
# and has been moved into the `yaml` package namespace.
# It does not perfectly mimic its old counterpart, but should get
# close enough for anyone who's relying on it even when they shouldn't.
import yaml

if not yaml.__with_libyaml__:
from sys import version_info

exc = ModuleNotFoundError if version_info >= (3, 6) else ImportError
raise exc("No module named '_yaml'")
else:
from yaml._yaml import *
import warnings
warnings.warn(
'The _yaml extension module is now located at yaml._yaml'
' and its location is subject to change. To use the'
' LibYAML-based parser and emitter, import from `yaml`:'
' `from yaml import CLoader as Loader, CDumper as Dumper`.',
DeprecationWarning
)
del warnings
# Don't `del yaml` here because yaml is actually an existing
# namespace member of _yaml.

__name__ = '_yaml'
# If the module is top-level (i.e. not a part of any specific package)
# then the attribute should be set to ''.
# https://docs.python.org/3.8/library/types.html
__package__ = ''
2 changes: 1 addition & 1 deletion lib/yaml/__init__.py
Expand Up @@ -8,7 +8,7 @@
from loader import *
from dumper import *

__version__ = '5.3.1'
__version__ = '5.4.0a0'

try:
from cyaml import *
Expand Down
2 changes: 1 addition & 1 deletion lib/yaml/cyaml.py
Expand Up @@ -4,7 +4,7 @@
'CBaseDumper', 'CSafeDumper', 'CDumper'
]

from _yaml import CParser, CEmitter
from yaml._yaml import CParser, CEmitter

from constructor import *

Expand Down