From 2dc137975a9ce3d27a30ccc5e16bb858aaf6cb8c Mon Sep 17 00:00:00 2001 From: Peter Lithammer Date: Wed, 17 Nov 2021 18:45:39 +0100 Subject: [PATCH] Build `musllinux` wheels --- .../problem-installing-psycopg2.md | 1 - .github/workflows/packages.yml | 4 ++ scripts/build/build_musllinux_1_1.sh | 68 +++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100755 scripts/build/build_musllinux_1_1.sh diff --git a/.github/ISSUE_TEMPLATE/problem-installing-psycopg2.md b/.github/ISSUE_TEMPLATE/problem-installing-psycopg2.md index f3093368..52dde387 100644 --- a/.github/ISSUE_TEMPLATE/problem-installing-psycopg2.md +++ b/.github/ISSUE_TEMPLATE/problem-installing-psycopg2.md @@ -14,7 +14,6 @@ If you have a question, such has "how do you do X with Python/PostgreSQL/psycopg - [ ] I am running the latest version of pip, i.e. typing ``pip --version`` you get [this version](https://pypi.org/project/pip/). - [ ] I have read the [installation documentation](https://www.psycopg.org/docs/install.html) and the [frequently asked questions](https://www.psycopg.org/docs/faq.html) - [ ] I am not trying to install `psycopg2-binary` on an Apple M1, for which [binary packages are not supported](https://github.com/psycopg/psycopg2/issues/1286) -- [ ] I am not trying to install `psycopg2-binary` in an Alpine Linux Docker image - [ ] If install failed, I typed `pg_config` on the command line and I obtained an output instead of an error. **Please complete the following information:** diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml index 4fd6cb81..39751032 100644 --- a/.github/workflows/packages.yml +++ b/.github/workflows/packages.yml @@ -61,6 +61,10 @@ jobs: - {tag: manylinux2014, arch: i686} - {tag: manylinux_2_24, arch: aarch64} - {tag: manylinux_2_24, arch: ppc64le} + - {tag: musllinux_1_1, arch: x86_64} + - {tag: musllinux_1_1, arch: i686} + - {tag: musllinux_1_1, arch: aarch64} + - {tag: musllinux_1_1, arch: ppc64le} runs-on: ubuntu-20.04 steps: diff --git a/scripts/build/build_musllinux_1_1.sh b/scripts/build/build_musllinux_1_1.sh new file mode 100755 index 00000000..62860dcb --- /dev/null +++ b/scripts/build/build_musllinux_1_1.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +# Create musllinux_1_1 wheels for psycopg2 +# +# Look at the .github/workflows/packages.yml file for hints about how to use it. + +set -euo pipefail +set -x + +dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +prjdir="$( cd "${dir}/../.." && pwd )" + +# Build all the available versions, or just the ones specified in PYVERS +if [ ! "${PYVERS:-}" ]; then + PYVERS="$(ls /opt/python/)" +fi + +# Find psycopg version +version=$(grep -e ^PSYCOPG_VERSION "${prjdir}/setup.py" | sed "s/.*'\(.*\)'/\1/") +# A gratuitous comment to fix broken vim syntax file: '") +distdir="${prjdir}/dist/psycopg2-$version" + +# Replace the package name +if [[ "${PACKAGE_NAME:-}" ]]; then + sed -i "s/^setup(name=\"psycopg2\"/setup(name=\"${PACKAGE_NAME}\"/" \ + "${prjdir}/setup.py" +fi + +# Install prerequisite libraries +apk update +apk add postgresql-dev +# Add findutils because the Busybox version lacks the `-ls` flag, used by the +# `strip_wheel.sh` script. +apk add findutils + +# Create the wheel packages +for pyver in $PYVERS; do + pybin="/opt/python/${pyver}/bin" + "${pybin}/python" -m build -w -o "${prjdir}/dist/" "${prjdir}" +done + +# Bundle external shared libraries into the wheels +for whl in "${prjdir}"/dist/*.whl; do + "${dir}/strip_wheel.sh" "$whl" + auditwheel repair "$whl" -w "$distdir" +done + +# Make sure the postgresql-dev is not in the system +apk del postgresql-dev + +# Install packages and test +cd "${prjdir}" +for pyver in $PYVERS; do + pybin="/opt/python/${pyver}/bin" + "${pybin}/pip" install ${PACKAGE_NAME:-psycopg2} --no-index -f "$distdir" + + # Print psycopg and libpq versions + "${pybin}/python" -c "import psycopg2; print(psycopg2.__version__)" + "${pybin}/python" -c "import psycopg2; print(psycopg2.__libpq_version__)" + "${pybin}/python" -c "import psycopg2; print(psycopg2.extensions.libpq_version())" + + # Fail if we are not using the expected libpq library + if [[ "${WANT_LIBPQ:-}" ]]; then + "${pybin}/python" -c "import psycopg2, sys; sys.exit(${WANT_LIBPQ} != psycopg2.extensions.libpq_version())" + fi + + "${pybin}/python" -c "import tests; tests.unittest.main(defaultTest='tests.test_suite')" +done