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

Add GraalPy to manylinux images #1509

Closed
wants to merge 3 commits into from
Closed
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
3 changes: 3 additions & 0 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,15 @@ RUN manylinux-entrypoint /build_scripts/build-cpython.sh 3.12.0rc1
FROM build_cpython AS all_python
COPY build_scripts/install-pypy.sh \
build_scripts/pypy.sha256 \
build_scripts/install-graalpy.sh \
build_scripts/graalpy.sha256 \
build_scripts/finalize-python.sh \
/build_scripts/
RUN manylinux-entrypoint /build_scripts/install-pypy.sh 3.7 7.3.9
RUN manylinux-entrypoint /build_scripts/install-pypy.sh 3.8 7.3.11
RUN manylinux-entrypoint /build_scripts/install-pypy.sh 3.9 7.3.12
RUN manylinux-entrypoint /build_scripts/install-pypy.sh 3.10 7.3.12
RUN manylinux-entrypoint /build_scripts/install-graalpy.sh 3.10 graal 23.0.0 graalpython
COPY --from=build_cpython36 /opt/_internal /opt/_internal/
COPY --from=build_cpython37 /opt/_internal /opt/_internal/
COPY --from=build_cpython38 /opt/_internal /opt/_internal/
Expand Down
11 changes: 10 additions & 1 deletion docker/build_scripts/finalize.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ MY_DIR=$(dirname "${BASH_SOURCE[0]}")
source $MY_DIR/build_utils.sh

mkdir /opt/python
for PREFIX in $(find /opt/_internal/ -mindepth 1 -maxdepth 1 \( -name 'cpython*' -o -name 'pypy*' \)); do
for PREFIX in $(find /opt/_internal/ -mindepth 1 -maxdepth 1 \( -name 'cpython*' -o -name 'pypy*' -o -name 'graalpy*' \)); do
# Some python's install as bin/python3. Make them available as
# bin/python.
if [ -e ${PREFIX}/bin/python3 ] && [ ! -e ${PREFIX}/bin/python ]; then
Expand All @@ -30,6 +30,15 @@ for PREFIX in $(find /opt/_internal/ -mindepth 1 -maxdepth 1 \( -name 'cpython*'
# Make versioned python commands available directly in environment.
if [[ "${PREFIX}" == *"/pypy"* ]]; then
ln -s ${PREFIX}/bin/python /usr/local/bin/pypy${PY_VER}
elif [[ "${PREFIX}" == *"/graalpy"* ]]; then
ln -s ${PREFIX}/bin/python /usr/local/bin/graalpy${PY_VER}
# we remove most of graalpy itself, but symlink the install script to
# get the same version (same sha) back in the same place
ln -s ${PREFIX}/install-graalpy.sh /usr/local/bin/install-graalpy${PY_VER}
rm -rf ${PREFIX}/lib/graalpy*
rm -rf ${PREFIX}/lib/sulong*
rm -rf ${PREFIX}/lib/llvm*
rm -rf ${PREFIX}/lib/*.so
else
ln -s ${PREFIX}/bin/python /usr/local/bin/python${PY_VER}
fi
Expand Down
2 changes: 2 additions & 0 deletions docker/build_scripts/graalpy.sha256
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
e2a00b2b6485282b4a04aa382e30d696e00d20eb2fe1736debbe2d9df2a8737a graalpython-23.0.0-linux-aarch64.tar.gz
25e4fa7c1d45db6dcac5bfa4d1a0aa9ef5581623dc5903ce98d246c5d394639c graalpython-23.0.0-linux-amd64.tar.gz
51 changes: 51 additions & 0 deletions docker/build_scripts/install-graalpy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/bin/bash

# Stop at any error, show all commands
set -exuo pipefail

# Get script directory
MY_DIR=$(dirname "${BASH_SOURCE[0]}")

# Get build utilities
source $MY_DIR/build_utils.sh

if [ "${BASE_POLICY}" == "musllinux" ]; then
echo "Skip GraalPy build on musllinux"
exit 0
fi

case ${AUDITWHEEL_ARCH} in
x86_64) GRAALPY_ARCH=amd64;;
aarch64) GRAALPY_ARCH=aarch64;;
*) echo "No GraalPy for ${AUDITWHEEL_ARCH}"; exit 0;;
esac

PYTHON_VERSION=$1
VERSION_PREFIX=$2
GRAALPY_VERSION=$3
ARCHIVE_PREFIX=$4
GRAALPY_DOWNLOAD_URL=https://github.com/oracle/graalpython/releases/download/${VERSION_PREFIX}-${GRAALPY_VERSION}/ # e.g. graal-23.0.0/graalpython-23.0.0-linux-amd64.tar.gz
TMPDIR=/tmp/
TARBALL=graalpython-${GRAALPY_VERSION}-linux-${GRAALPY_ARCH}.tar.gz
TARBALL_SHA=`grep " ${TARBALL}\$" ${MY_DIR}/graalpy.sha256`
PREFIX="/opt/_internal/graalpy-${GRAALPY_VERSION}"

# create a download script that will download and extract graalpy. we leave
# this script in the image to avoid the large distribution to use up space in
# the default image.
mkdir -p ${PREFIX}
cat <<EOF> ${PREFIX}/install-graalpy.sh
#!/bin/bash
set -exuo pipefail
mkdir -p ${PREFIX}
mkdir -p ${TMPDIR}
curl -fsSL -o "${TMPDIR}/${TARBALL}" "${GRAALPY_DOWNLOAD_URL}/${TARBALL}"
cd ${TMPDIR}
echo "${TARBALL_SHA}" | sha256sum -c
tar -xf "${TMPDIR}/${TARBALL}" --overwrite --strip-components=1 -C "${PREFIX}"
rm -f "${TMPDIR}/${TARBALL}"
EOF

# call the download script right now.
chmod +x ${PREFIX}/install-graalpy.sh
${PREFIX}/install-graalpy.sh
6 changes: 6 additions & 0 deletions tests/run_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ else
exit 1
fi

# make sure all graalpy versions are available for testing
for INSTALLER in $(find /opt/_internal/ -mindepth 2 -maxdepth 2 \( -name 'install-graalpy.sh' \)); do
$INSTALLER
done

for PYTHON in /opt/python/*/bin/python; do
# Smoke test to make sure that our Pythons work, and do indeed detect as
Expand All @@ -28,6 +32,8 @@ for PYTHON in /opt/python/*/bin/python; do
PYVERS=$(${PYTHON} -c "import sys; print('.'.join(map(str, sys.version_info[:2])))")
if [ "${IMPLEMENTATION}" == "pypy" ]; then
LINK_PREFIX=pypy
elif [ "${IMPLEMENTATION}" == "graalpy" ]; then
LINK_PREFIX=graalpy
else
LINK_PREFIX=python
# Make sure sqlite3 module can be loaded properly and is the manylinux version one
Expand Down