From 25c40f8ac30af161617181e40ecfcbbe767210b6 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Sat, 16 Jul 2022 23:02:46 +0100 Subject: [PATCH] build: add scripts to build macOS arm64 packages --- .gitignore | 1 + scripts/build/build_macos_arm64.sh | 80 ++++++++++++++++++++++++++ scripts/build/run_build_macos_arm64.sh | 40 +++++++++++++ 3 files changed, 121 insertions(+) create mode 100755 scripts/build/build_macos_arm64.sh create mode 100755 scripts/build/run_build_macos_arm64.sh diff --git a/.gitignore b/.gitignore index 457c9ab6..b921662e 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ env? /rel /wheels /packages +/wheelhouse diff --git a/scripts/build/build_macos_arm64.sh b/scripts/build/build_macos_arm64.sh new file mode 100755 index 00000000..23e4aa10 --- /dev/null +++ b/scripts/build/build_macos_arm64.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +# Build psycopg2-binary wheel packages for Apple M1 (cpNNN-macosx_arm64) +# +# This script is designed to run on Scaleway Apple Silicon machines. +# +# The script cannot be run as sudo (installing brew fails), but requires sudo, +# so it can pretty much only be executed by a sudo user as it is. + +set -euo pipefail +set -x + +python_versions="3.8.10 3.9.13 3.10.5" +postgres_version=14 + +# Move to the root of the project +dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd "${dir}/../../" + +# Add /usr/local/bin to the path. It seems it's not, in non-interactive sessions +if ! (echo $PATH | grep -q '/usr/local/bin'); then + export PATH=/usr/local/bin:$PATH +fi + +# Install brew, if necessary. Otherwise just make sure it's in the path +if [[ -x /opt/homebrew/bin/brew ]]; then + eval "$(/opt/homebrew/bin/brew shellenv)" +else + command -v brew > /dev/null || ( + # Not necessary: already installed + # xcode-select --install + NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL \ + https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" + ) + eval "$(/opt/homebrew/bin/brew shellenv)" +fi + +# Install PostgreSQL, if necessary +command -v pg_config > /dev/null || ( + brew install postgresql@${postgres_version} + brew services start postgresql +) + +# Install the Python versions we want to build +for ver3 in $python_versions; do + ver2=$(echo $ver3 | sed 's/\([^\.]*\)\(\.[^\.]*\)\(.*\)/\1\2/') + command -v python${ver2} > /dev/null || ( + (cd /tmp && + curl -fsSl -O \ + https://www.python.org/ftp/python/${ver3}/python-${ver3}-macos11.pkg) + sudo installer -pkg /tmp/python-${ver3}-macos11.pkg -target / + ) +done + +# Create a virtualenv where to work +if [[ ! -x .venv/bin/python ]]; then + python3 -m venv .venv +fi + +source .venv/bin/activate +pip install cibuildwheel + +# Build the binary packages +export CIBW_PLATFORM=macos +export CIBW_ARCHS=arm64 +export CIBW_BUILD='cp{38,39,310}-*' +export CIBW_TEST_COMMAND='python -c "import tests; tests.unittest.main(defaultTest=\"tests.test_suite\")"' + +export PSYCOPG2_TESTDB=postgres +export PYTHONPATH=$(pwd) + +# For some reason, cibuildwheel tests says that psycopg2 is already installed, +# refuses to install, then promptly fails import. So, please, seriously, +# install this thing. +export PIP_FORCE_REINSTALL=1 + +# Replace the package name +sed -i .bak 's/^setup(name="psycopg2"/setup(name="psycopg2-binary"/' setup.py + +cibuildwheel diff --git a/scripts/build/run_build_macos_arm64.sh b/scripts/build/run_build_macos_arm64.sh new file mode 100755 index 00000000..b2a62306 --- /dev/null +++ b/scripts/build/run_build_macos_arm64.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# Build psycopg2-binary wheel packages for Apple M1 (cpNNN-macosx_arm64) +# +# This script is designed to run on a local machine: it will clone the repos +# remotely and execute the `build_macos_arm64.sh` script remotely, then will +# download the built packages. A tag to build must be specified. +# +# In order to run the script, the `m1` host must be specified in +# `~/.ssh/config`; for instance: +# +# Host m1 +# User m1 +# HostName 1.2.3.4 + +set -euo pipefail +# set -x + +tag=${1:-} + +if [[ ! "${tag}" ]]; then + echo "Usage: $0 TAG" >&2 + exit 2 +fi + +rdir=psycobuild + +# Clone the repos +ssh m1 rm -rf "${rdir}" +ssh m1 git clone https://github.com/psycopg/psycopg2.git --branch ${tag} "${rdir}" + +# Allow sudoing without password, to allow brew to install +ssh -t m1 bash -c \ + 'test -f /etc/sudoers.d/m1 || echo "m1 ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/m1' + +# Build the wheel packages +ssh m1 "${rdir}/scripts/build/build_macos_arm64.sh" + +# Transfer the packages locally +scp -r "m1:${rdir}/wheelhouse" .