osx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #!/usr/bin/env bash
  2. set -ex
  3. . $(dirname $0)/osx_helpers.sh
  4. DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET:-"$(macos_version)"}
  5. SDK_FETCH=
  6. if ! [ ${DEPLOYMENT_TARGET} == "$(macos_version)" ]; then
  7. SDK_FETCH=1
  8. # SDK URL from https://github.com/docker/golang-cross/blob/master/osx-cross.sh
  9. SDK_URL=https://s3.dockerproject.org/darwin/v2/MacOSX${DEPLOYMENT_TARGET}.sdk.tar.xz
  10. SDK_SHA1=dd228a335194e3392f1904ce49aff1b1da26ca62
  11. fi
  12. OPENSSL_VERSION=1.1.1a
  13. OPENSSL_URL=https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
  14. OPENSSL_SHA1=8fae27b4f34445a5500c9dc50ae66b4d6472ce29
  15. PYTHON_VERSION=3.7.2
  16. PYTHON_URL=https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz
  17. PYTHON_SHA1=0cd8e52d8ed1d0be12ac8e87a623a15df3a3b418
  18. #
  19. # Install prerequisites.
  20. #
  21. if ! [ -x "$(command -v brew)" ]; then
  22. ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  23. fi
  24. if ! [ -x "$(command -v grealpath)" ]; then
  25. brew update > /dev/null
  26. brew install coreutils
  27. fi
  28. if ! [ -x "$(command -v python3)" ]; then
  29. brew update > /dev/null
  30. brew install python3
  31. fi
  32. if ! [ -x "$(command -v virtualenv)" ]; then
  33. pip install virtualenv==16.2.0
  34. fi
  35. #
  36. # Create toolchain directory.
  37. #
  38. BUILD_PATH="$(grealpath $(dirname $0)/../../build)"
  39. mkdir -p ${BUILD_PATH}
  40. TOOLCHAIN_PATH="${BUILD_PATH}/toolchain"
  41. mkdir -p ${TOOLCHAIN_PATH}
  42. #
  43. # Set macOS SDK.
  44. #
  45. if [[ ${SDK_FETCH} && ! -f ${TOOLCHAIN_PATH}/MacOSX${DEPLOYMENT_TARGET}.sdk/SDKSettings.plist ]]; then
  46. SDK_PATH=${TOOLCHAIN_PATH}/MacOSX${DEPLOYMENT_TARGET}.sdk
  47. fetch_tarball ${SDK_URL} ${SDK_PATH} ${SDK_SHA1}
  48. else
  49. SDK_PATH="$(xcode-select --print-path)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX${DEPLOYMENT_TARGET}.sdk"
  50. fi
  51. #
  52. # Build OpenSSL.
  53. #
  54. OPENSSL_SRC_PATH=${TOOLCHAIN_PATH}/openssl-${OPENSSL_VERSION}
  55. if ! [[ $(${TOOLCHAIN_PATH}/bin/openssl version) == *"${OPENSSL_VERSION}"* ]]; then
  56. rm -rf ${OPENSSL_SRC_PATH}
  57. fetch_tarball ${OPENSSL_URL} ${OPENSSL_SRC_PATH} ${OPENSSL_SHA1}
  58. (
  59. cd ${OPENSSL_SRC_PATH}
  60. export MACOSX_DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET}
  61. export SDKROOT=${SDK_PATH}
  62. ./Configure darwin64-x86_64-cc --prefix=${TOOLCHAIN_PATH}
  63. make install_sw install_dev
  64. )
  65. fi
  66. #
  67. # Build Python.
  68. #
  69. PYTHON_SRC_PATH=${TOOLCHAIN_PATH}/Python-${PYTHON_VERSION}
  70. if ! [[ $(${TOOLCHAIN_PATH}/bin/python3 --version) == *"${PYTHON_VERSION}"* ]]; then
  71. rm -rf ${PYTHON_SRC_PATH}
  72. fetch_tarball ${PYTHON_URL} ${PYTHON_SRC_PATH} ${PYTHON_SHA1}
  73. (
  74. cd ${PYTHON_SRC_PATH}
  75. ./configure --prefix=${TOOLCHAIN_PATH} \
  76. --enable-ipv6 --without-ensurepip --with-dtrace --without-gcc \
  77. --datarootdir=${TOOLCHAIN_PATH}/share \
  78. --datadir=${TOOLCHAIN_PATH}/share \
  79. --enable-framework=${TOOLCHAIN_PATH}/Frameworks \
  80. --with-openssl=${TOOLCHAIN_PATH} \
  81. MACOSX_DEPLOYMENT_TARGET=${DEPLOYMENT_TARGET} \
  82. CFLAGS="-isysroot ${SDK_PATH} -I${TOOLCHAIN_PATH}/include" \
  83. CPPFLAGS="-I${SDK_PATH}/usr/include -I${TOOLCHAIN_PATH}/include" \
  84. LDFLAGS="-isysroot ${SDK_PATH} -L ${TOOLCHAIN_PATH}/lib"
  85. make -j 4
  86. make install PYTHONAPPSDIR=${TOOLCHAIN_PATH}
  87. make frameworkinstallextras PYTHONAPPSDIR=${TOOLCHAIN_PATH}/share
  88. )
  89. fi
  90. #
  91. # Smoke test built Python.
  92. #
  93. openssl_version ${TOOLCHAIN_PATH}
  94. echo ""
  95. echo "*** Targeting macOS: ${DEPLOYMENT_TARGET}"
  96. echo "*** Using SDK ${SDK_PATH}"
  97. echo "*** Using $(python3_version ${TOOLCHAIN_PATH})"
  98. echo "*** Using $(openssl_version ${TOOLCHAIN_PATH})"