-
Notifications
You must be signed in to change notification settings - Fork 122
153 lines (133 loc) · 6.31 KB
/
build-wheels.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
on:
push:
branches: [ public ]
tags:
- v*
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs:
build_wheels:
name: Build wheels on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-11]
fail-fast: false
steps:
- uses: actions/checkout@v3
with:
submodules: 'recursive'
- uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install cibuildwheel
run: python -m pip install cibuildwheel==2.19.1
- name: Build wheels
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
QUIP_ARCHS=linux_x86_64_gfortran_openmp
elif [ "$RUNNER_OS" == "macOS" ]; then
QUIP_ARCHS="darwin_x86_64_gfortran_openmp darwin_arm64_gfortran_openmp"
else
echo "RUNNER_OS=$RUNNER_OS not supported!"
exit 1
fi
echo "RUNNER_OS=$RUNNER_OS"
echo "QUIP_ARCHS=${QUIP_ARCHS}"
# see if this workflow run was triggered from a tag
event_ref=${{ github.ref }}
if [[ ! -z $event_ref && $event_ref =~ ^refs/tags/ ]]; then
echo ${{ github.ref }} | sed -e 's|refs/tags/||' > GITHUB_TAG
fi
# map from QUIP_ARCH to cibuildwheel architecture
for QUIP_ARCH in $QUIP_ARCHS; do
case $QUIP_ARCH in
linux_x86_64_gfortran_openmp)
ARCHS=auto64
;;
darwin_x86_64_gfortran_openmp)
ARCHS=x86_64
;;
darwin_arm64_gfortran_openmp)
ARCHS=arm64
;;
esac
echo "QUIP_ARCH=${QUIP_ARCH}, ARCHS=${ARCHS}"
if [[ $ARCHS == "arm64" ]]; then
# install arm64 cross compiler
# taken from https://github.com/MacPython/gfortran-install/blob/master/gfortran_utils.sh#L97
curl -L -O https://github.com/isuruf/gcc/releases/download/gcc-10-arm-20210228/gfortran-darwin-arm64.tar.gz
export GFORTRAN_SHA=f26990f6f08e19b2ec150b9da9d59bd0558261dd
if [[ "$(shasum gfortran-darwin-arm64.tar.gz)" != "${GFORTRAN_SHA} gfortran-darwin-arm64.tar.gz" ]]; then
echo "shasum mismatch for gfortran-darwin-arm64"
exit 1
fi
sudo mkdir -p /opt/
sudo cp "gfortran-darwin-arm64.tar.gz" /opt/gfortran-darwin-arm64.tar.gz
pushd /opt
sudo tar -xvf gfortran-darwin-arm64.tar.gz
sudo rm gfortran-darwin-arm64.tar.gz
popd
export FC_ARM64="$(find /opt/gfortran-darwin-arm64/bin -name "*-gfortran")"
libgfortran="$(find /opt/gfortran-darwin-arm64/lib -name libgfortran.dylib)"
libdir=$(dirname $libgfortran)
export FC_ARM64_LDFLAGS="-L$libdir -Wl,-rpath,$libdir"
# Setup cross build for single arch arm_64 wheels
# host_alias automatically lets autoconf know that we are cross compiling for arm64 darwin
export CIBW_ENVIRONMENT="ARCHS=${ARCHS} QUIP_ARCH=${QUIP_ARCH} RUNNER_OS=${RUNNER_OS} FC=$FC_ARM64 F90=$FC_ARM64 F95=$FC_ARM64 F77=$FC_ARM64 LDFLAGS=\" -arch arm64 $FC_ARM64_LDFLAGS\" NPY_DISTUTILS_APPEND_FLAGS=1 CFLAGS=\" -arch arm64\" CXXFLAGS=\" -arch arm64\" CPPFLAGS=\" -arch arm64\" _PYTHON_HOST_PLATFORM=macosx-11.0-arm64 ARCHFLAGS=\" -arch arm64\" FCFLAGS=\" -arch arm64\" CROSS_COMPILING=1 host_alias=aarch64-apple-darwin20.0.0 MACOSX_DEPLOYMENT_TARGET=11.0 SDKROOT=/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk"
else
export CIBW_ENVIRONMENT="ARCHS=${ARCHS} QUIP_ARCH=${QUIP_ARCH} RUNNER_OS=${RUNNER_OS}"
fi
mkdir -p build/${QUIP_ARCH}
cp quippy/setup.py build/${QUIP_ARCH}
./bin/gitversion --hash-only > build/${QUIP_ARCH}/VERSION
echo "CIBW_ENVIRONMENT=$CIBW_ENVIRONMENT"
if [ "$RUNNER_OS" == "macOS" ]; then
export CIBW_SKIP="cp27-* cp35-* cp36-* pp*"
python -m cibuildwheel --output-dir wheelhouse --archs $ARCHS build/${QUIP_ARCH}
else
export CIBW_MANYLINUX_X86_64_IMAGE="manylinux2014"
export CIBW_SKIP="cp27-* cp35-* cp36-* pp* *musllinux*"
python -m cibuildwheel --output-dir wheelhouse --archs $ARCHS build/${QUIP_ARCH}
fi
done
env:
CIBW_TEST_SKIP: "*-macosx_arm64"
CIBW_BEFORE_ALL_MACOS: "brew install gfortran && brew unlink gfortran && brew link gfortran"
# CIBW_BEFORE_ALL_LINUX: "which yum && yum install -y gcc-gfortran || apk add gfortran"
CIBW_BEFORE_BUILD: "bash .github/workflows/prepare-wheel-build.sh"
# Uncomment to get SSH access for testing
- name: Setup tmate session
if: failure()
uses: mxschmitt/action-tmate@v3
timeout-minutes: 15
- uses: actions/upload-artifact@v3
with:
path: ./wheelhouse/*.whl
- name: Build source tarball
if: startsWith(github.ref, 'refs/tags/')
run: |
pip install git-archive-all
version=$(echo ${{ github.ref }} | sed -e 's|refs/tags/||')
git-archive-all QUIP-$version.tar.gz
- name: Release wheels and source tarball
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
files: wheelhouse/*.whl QUIP-*.tar.gz
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check tag
id: check-tag
run: |
if [[ ${{ github.ref }} =~ ^refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo ::set-output name=match::true
fi
- name: Deploy to PyPI
if: steps.check-tag.outputs.match == 'true'
run: |
pip install twine
twine upload wheelhouse/*.whl
env:
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}