diff options
Diffstat (limited to '')
-rwxr-xr-x | taskcluster/scripts/misc/build-cpython.sh | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/taskcluster/scripts/misc/build-cpython.sh b/taskcluster/scripts/misc/build-cpython.sh new file mode 100755 index 0000000000..aac2034d0a --- /dev/null +++ b/taskcluster/scripts/misc/build-cpython.sh @@ -0,0 +1,116 @@ +#!/bin/sh +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This script builds the official interpreter for the python language, +# while also packing in a few default extra packages. + +set -e +set -x + +# Required fetch artifact +clang_bindir=${MOZ_FETCHES_DIR}/clang/bin +clang_libdir=${MOZ_FETCHES_DIR}/clang/lib +python_src=${MOZ_FETCHES_DIR}/cpython-source +xz_prefix=${MOZ_FETCHES_DIR}/xz + +# Make the compiler-rt available to clang. +env UPLOAD_DIR= $GECKO_PATH/taskcluster/scripts/misc/repack-clang.sh + +# Extra setup per platform +case `uname -s` in + Darwin) + # Use taskcluster clang instead of host compiler on OSX + export PATH=${clang_bindir}:${PATH} + export CC=clang + export CXX=clang++ + export LDFLAGS=-fuse-ld=lld + + case `uname -m` in + aarch64) + macosx_version_min=11.0 + ;; + *) + macosx_version_min=10.12 + ;; + esac + macosx_sdk=14.2 + # NOTE: both CFLAGS and CPPFLAGS need to be set here, otherwise + # configure step fails. + sysroot_flags="-isysroot ${MOZ_FETCHES_DIR}/MacOSX${macosx_sdk}.sdk -mmacosx-version-min=${macosx_version_min}" + export CPPFLAGS="${sysroot_flags} -I${xz_prefix}/include" + export CFLAGS=${sysroot_flags} + export LDFLAGS="${LDFLAGS} ${sysroot_flags} -L${xz_prefix}/lib" + configure_flags_extra=--with-openssl=/usr/local/opt/openssl + + # see https://bugs.python.org/issue22490 + unset __PYVENV_LAUNCHER__ + + # see https://bugs.python.org/issue44065 + sed -i -e 's,$CC --print-multiarch,:,' ${python_src}/configure + export LDFLAGS="${LDFLAGS} -Wl,-rpath -Wl,@loader_path/../.." + ;; + Linux) + # Use host gcc on Linux + export LDFLAGS="${LDFLAGS} -Wl,-rpath,\\\$ORIGIN/../.." + ;; +esac + +# Patch Python to honor MOZPYTHONHOME instead of PYTHONHOME. That way we have a +# relocatable python for free, while not interfering with the system Python that +# already honors PYTHONHOME. +find ${python_src} -type f -print0 | xargs -0 perl -i -pe "s,PYTHONHOME,MOZPYTHONHOME,g" + +# Actual build +work_dir=`pwd` +tardir=python + +cd `mktemp -d` +${python_src}/configure --prefix=/${tardir} --enable-optimizations ${configure_flags_extra} || { exit_status=$? && cat config.log && exit $exit_status ; } + +export MAKEFLAGS=-j`nproc` +make +make DESTDIR=${work_dir} install +cd ${work_dir} + +${work_dir}/python/bin/python3 -m pip install --upgrade pip==23.0 +${work_dir}/python/bin/python3 -m pip install -r ${GECKO_PATH}/build/psutil_requirements.txt -r ${GECKO_PATH}/build/zstandard_requirements.txt + +case `uname -s` in + Darwin) + + cp /usr/local/opt/openssl/lib/libssl*.dylib ${work_dir}/python/lib/ + cp /usr/local/opt/openssl/lib/libcrypto*.dylib ${work_dir}/python/lib/ + cp ${xz_prefix}/lib/liblzma.dylib ${work_dir}/python/lib/ + + # Instruct the loader to search for the lib in rpath instead of the one used during linking + install_name_tool -change /usr/local/opt/openssl@1.1/lib/libssl.1.1.dylib @rpath/libssl.1.1.dylib ${work_dir}/python/lib/python3.*/lib-dynload/_ssl.cpython-3*-darwin.so + install_name_tool -change /usr/local/opt/openssl@1.1/lib/libcrypto.1.1.dylib @rpath/libcrypto.1.1.dylib ${work_dir}/python/lib/python3.*/lib-dynload/_ssl.cpython-3*-darwin.so + otool -L ${work_dir}/python/lib/python3.*/lib-dynload/_ssl.cpython-3*-darwin.so | grep @rpath/libssl.1.1.dylib + + + install_name_tool -change /xz/lib/liblzma.5.dylib @rpath/liblzma.5.dylib ${work_dir}/python/lib/python3.*/lib-dynload/_lzma.cpython-3*-darwin.so + otool -L ${work_dir}/python/lib/python3.*/lib-dynload/_lzma.cpython-3*-darwin.so | grep @rpath/liblzma.5.dylib + + # Also modify the shipped libssl to use the shipped libcrypto + install_name_tool -change /usr/local/Cellar/openssl@1.1/1.1.1h/lib/libcrypto.1.1.dylib @rpath/libcrypto.1.1.dylib ${work_dir}/python/lib/libssl.1.1.dylib + otool -L ${work_dir}/python/lib/libssl.1.1.dylib | grep @rpath/libcrypto.1.1.dylib + + # sanity check + ${work_dir}/python/bin/python3 -c "import ssl" + ${work_dir}/python/bin/python3 -c "import lzma" + + # We may not have access to system certificate on OSX + ${work_dir}/python/bin/python3 -m pip install certifi==2024.2.2 + ;; + Linux) + cp /usr/lib/x86_64-linux-gnu/libffi.so.* ${work_dir}/python/lib/ + cp /usr/lib/x86_64-linux-gnu/libssl.so.* ${work_dir}/python/lib/ + cp /usr/lib/x86_64-linux-gnu/libcrypto.so.* ${work_dir}/python/lib/ + cp /lib/x86_64-linux-gnu/libncursesw.so.* ${work_dir}/python/lib/ + cp /lib/x86_64-linux-gnu/libtinfo.so.* ${work_dir}/python/lib/ + ;; +esac + +$(dirname $0)/pack.sh ${tardir} |