summaryrefslogtreecommitdiff
path: root/script
diff options
context:
space:
mode:
authorChristopher Crone <christopher.crone@docker.com>2018-07-10 13:52:57 +0200
committerChristopher Crone <christopher.crone@docker.com>2018-07-23 11:41:32 +0200
commit450efd557af180f2d5e8bd275a4c30afccc70ab2 (patch)
treed59f3ac5a605a1dc54a9277a43c87604e4c783b1 /script
parent6cb17b90ef60bce2b984c569e02fa89d277279b5 (diff)
macOS: Rework build scripts
Allows us to build for older versions of macOS by downloading an older SDK and building OpenSSL and Python against it. Signed-off-by: Christopher Crone <christopher.crone@docker.com>
Diffstat (limited to 'script')
-rwxr-xr-xscript/build/osx4
-rwxr-xr-xscript/setup/osx117
-rw-r--r--script/setup/osx_helpers.sh41
3 files changed, 132 insertions, 30 deletions
diff --git a/script/build/osx b/script/build/osx
index 0c4b062b..c62b2702 100755
--- a/script/build/osx
+++ b/script/build/osx
@@ -1,11 +1,11 @@
#!/bin/bash
set -ex
-PATH="/usr/local/bin:$PATH"
+TOOLCHAIN_PATH="$(realpath $(dirname $0)/../../build/toolchain)"
rm -rf venv
-virtualenv -p /usr/local/bin/python3 venv
+virtualenv -p ${TOOLCHAIN_PATH}/bin/python3 venv
venv/bin/pip install -r requirements.txt
venv/bin/pip install -r requirements-build.txt
venv/bin/pip install --no-deps .
diff --git a/script/setup/osx b/script/setup/osx
index 972e79ef..08491b6e 100755
--- a/script/setup/osx
+++ b/script/setup/osx
@@ -1,43 +1,104 @@
-#!/bin/bash
+#!/usr/bin/env bash
set -ex
-python_version() {
- python -V 2>&1
-}
+. $(dirname $0)/osx_helpers.sh
-python3_version() {
- python3 -V 2>&1
-}
-
-openssl_version() {
- python -c "import ssl; print ssl.OPENSSL_VERSION"
-}
+DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET:-"$(macos_version)"}
+SDK_FETCH=
+if ! [ ${DEPLOYMENT_TARGET} == "$(macos_version)" ]; then
+ SDK_FETCH=1
+ # SDK URL from https://github.com/docker/golang-cross/blob/master/osx-cross.sh
+ SDK_URL=https://s3.dockerproject.org/darwin/v2/MacOSX${DEPLOYMENT_TARGET}.sdk.tar.xz
+ SDK_SHA1=dd228a335194e3392f1904ce49aff1b1da26ca62
+fi
-desired_python3_version="3.6.4"
-desired_python3_brew_version="3.6.4_2"
-python3_formula="https://raw.githubusercontent.com/Homebrew/homebrew-core/b4e69a9a592232fa5a82741f6acecffc2f1d198d/Formula/python3.rb"
+OPENSSL_VERSION=1.1.0h
+OPENSSL_URL=https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
+OPENSSL_SHA1=0fc39f6aa91b6e7f4d05018f7c5e991e1d2491fd
-PATH="/usr/local/bin:$PATH"
+PYTHON_VERSION=3.6.6
+PYTHON_URL=https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz
+PYTHON_SHA1=ae1fc9ddd29ad8c1d5f7b0d799ff0787efeb9652
-if !(which brew); then
+#
+# Install prerequisites.
+#
+if ! [ -x "$(command -v brew)" ]; then
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi
+if ! [ -x "$(command -v grealpath)" ]; then
+ brew update > /dev/null
+ brew install coreutils
+fi
+if ! [ -x "$(command -v python3)" ]; then
+ brew update > /dev/null
+ brew install python3
+fi
+if ! [ -x "$(command -v virtualenv)" ]; then
+ pip install virtualenv
+fi
-brew update > /dev/null
-
-if !(python3_version | grep "$desired_python3_version"); then
- if brew list | grep python3; then
- brew unlink python3
- fi
+#
+# Create toolchain directory.
+#
+BUILD_PATH="$(grealpath $(dirname $0)/../../build)"
+mkdir -p ${BUILD_PATH}
+TOOLCHAIN_PATH="${BUILD_PATH}/toolchain"
+mkdir -p ${TOOLCHAIN_PATH}
- brew install "$python3_formula"
- brew switch python3 "$desired_python3_brew_version"
+#
+# Set macOS SDK.
+#
+if [ ${SDK_FETCH} ]; then
+ SDK_PATH=${TOOLCHAIN_PATH}/MacOSX${DEPLOYMENT_TARGET}.sdk
+ fetch_tarball ${SDK_URL} ${SDK_PATH} ${SDK_SHA1}
+else
+ SDK_PATH="$(xcode-select --print-path)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${DEPLOYMENT_TARGET}.sdk"
fi
-echo "*** Using $(python3_version) ; $(python_version)"
-echo "*** Using $(openssl_version)"
+#
+# Build OpenSSL.
+#
+OPENSSL_SRC_PATH=${TOOLCHAIN_PATH}/openssl-${OPENSSL_VERSION}
+if ! [ -f ${TOOLCHAIN_PATH}/bin/openssl ]; then
+ rm -rf ${OPENSSL_SRC_PATH}
+ fetch_tarball ${OPENSSL_URL} ${OPENSSL_SRC_PATH} ${OPENSSL_SHA1}
+ (
+ cd ${OPENSSL_SRC_PATH}
+ export MACOSX_DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET}
+ export SDKROOT=${SDK_PATH}
+ ./Configure darwin64-x86_64-cc --prefix=${TOOLCHAIN_PATH}
+ make install_sw install_dev
+ )
+fi
-if !(which virtualenv); then
- pip install virtualenv
+#
+# Build Python.
+#
+PYTHON_SRC_PATH=${TOOLCHAIN_PATH}/Python-${PYTHON_VERSION}
+if ! [ -f ${TOOLCHAIN_PATH}/bin/python3 ]; then
+ rm -rf ${PYTHON_SRC_PATH}
+ fetch_tarball ${PYTHON_URL} ${PYTHON_SRC_PATH} ${PYTHON_SHA1}
+ (
+ cd ${PYTHON_SRC_PATH}
+ ./configure --prefix=${TOOLCHAIN_PATH} \
+ --enable-ipv6 --without-ensurepip --with-dtrace --without-gcc \
+ --datarootdir=${TOOLCHAIN_PATH}/share \
+ --datadir=${TOOLCHAIN_PATH}/share \
+ --enable-framework=${TOOLCHAIN_PATH}/Frameworks \
+ MACOSX_DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET} \
+ CFLAGS="-isysroot ${SDK_PATH} -I${TOOLCHAIN_PATH}/include" \
+ CPPFLAGS="-I${SDK_PATH}/usr/include -I${TOOLCHAIN_PATH}include" \
+ LDFLAGS="-isysroot ${SDK_PATH} -L ${TOOLCHAIN_PATH}/lib"
+ make -j 4
+ make install PYTHONAPPSDIR=${TOOLCHAIN_PATH}
+ make frameworkinstallextras PYTHONAPPSDIR=${TOOLCHAIN_PATH}/share
+ )
fi
+
+echo ""
+echo "*** Targeting macOS: ${DEPLOYMENT_TARGET}"
+echo "*** Using SDK ${SDK_PATH}"
+echo "*** Using $(python3_version ${TOOLCHAIN_PATH})"
+echo "*** Using $(openssl_version ${TOOLCHAIN_PATH})"
diff --git a/script/setup/osx_helpers.sh b/script/setup/osx_helpers.sh
new file mode 100644
index 00000000..d60a30b6
--- /dev/null
+++ b/script/setup/osx_helpers.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+
+# Check file's ($1) SHA1 ($2).
+check_sha1() {
+ echo -n "$2 *$1" | shasum -c -
+}
+
+# Download URL ($1) to path ($2).
+download() {
+ curl -L $1 -o $2
+}
+
+# Extract tarball ($1) in folder ($2).
+extract() {
+ tar xf $1 -C $2
+}
+
+# Download URL ($1), check SHA1 ($3), and extract utility ($2).
+fetch_tarball() {
+ url=$1
+ tarball=$2.tarball
+ sha1=$3
+ download $url $tarball
+ check_sha1 $tarball $sha1
+ extract $tarball $(dirname $tarball)
+}
+
+# Version of Python at toolchain path ($1).
+python3_version() {
+ $1/bin/python3 -V 2>&1
+}
+
+# Version of OpenSSL used by toolchain ($1) Python.
+openssl_version() {
+ $1/bin/python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
+}
+
+# System macOS version.
+macos_version() {
+ sw_vers -productVersion | cut -f1,2 -d'.'
+}