blob: c85b186ed05fcf9b1a5c6d5e0bde114851db2aee [file] [log] [blame]
#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
set -e -x
ROOT_DIR=$(git rev-parse --show-toplevel)
cd "${ROOT_DIR}"
PYTHON_VERSION=$1
PYTHON_VERSION_LONG=$2
source pkg/mac/common.sh
source build-support/dep-url.sh
pip3 install pyyaml
dep=$ROOT_DIR/build-support/dep-version.py
PYBIND11_VERSION=$($dep pybind11)
BOOST_VERSION=$($dep boost)
ZLIB_VERSION=$($dep zlib)
OPENSSL_VERSION=$($dep openssl)
PROTOBUF_VERSION=$($dep protobuf)
ZSTD_VERSION=$($dep zstd)
SNAPPY_VERSION=$($dep snappy)
CURL_VERSION=$($dep curl)
# Compile and cache dependencies
CACHE_DIR=${CACHE_DIR_DEPS}
mkdir -p $CACHE_DIR
cd $CACHE_DIR
PREFIX=$CACHE_DIR/install
###############################################################################
if [ ! -f pybind11/.done ]; then
download_dependency $ROOT_DIR/dependencies.yaml pybind11
mkdir -p $PREFIX/include/
cp -rf pybind11-${PYBIND11_VERSION}/include/pybind11 $PREFIX/include/
mkdir -p pybind11
touch pybind11/.done
fi
###############################################################################
if [ ! -f zlib-${ZLIB_VERSION}/.done ]; then
echo "Building ZLib"
download_dependency $ROOT_DIR/dependencies.yaml zlib
pushd zlib-$ZLIB_VERSION
CFLAGS="-fPIC -O3 -arch arm64 -arch x86_64 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" ./configure --prefix=$PREFIX
make -j16
make install
touch .done
popd
else
echo "Using cached ZLib"
fi
###############################################################################
if [ ! -f Python-${PYTHON_VERSION_LONG}/.done ]; then
echo "Building Python $PYTHON_VERSION_LONG"
curl -O -L https://www.python.org/ftp/python/${PYTHON_VERSION_LONG}/Python-${PYTHON_VERSION_LONG}.tgz
tar xfz Python-${PYTHON_VERSION_LONG}.tgz
pushd Python-${PYTHON_VERSION_LONG}
if [ $PYTHON_VERSION = '3.7' ]; then
patch -p1 < ${ROOT_DIR}/pkg/mac/python-3.7.patch
fi
CFLAGS="-fPIC -O3 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET} -I${PREFIX}/include ${PY_CFLAGS}" \
LDFLAGS=" ${PY_CFLAGS} -L${PREFIX}/lib" \
./configure --prefix=$PREFIX --enable-shared --enable-universalsdk --with-universal-archs=universal2
make -j16
make install
curl -O -L https://files.pythonhosted.org/packages/27/d6/003e593296a85fd6ed616ed962795b2f87709c3eee2bca4f6d0fe55c6d00/wheel-0.37.1-py2.py3-none-any.whl
$PREFIX/bin/pip3 install wheel-*.whl
touch .done
popd
else
echo "Using cached Python $PYTHON_VERSION_LONG"
fi
###############################################################################
OPENSSL_VERSION_UNDERSCORE=$(echo $OPENSSL_VERSION | sed 's/\./_/g')
if [ ! -f openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.done ]; then
echo "Building OpenSSL"
download_dependency $ROOT_DIR/dependencies.yaml openssl
# -arch arm64 -arch x86_64
tar xfz OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.tar.gz
mv openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE} openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-arm64
pushd openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-arm64
echo -e "#include <string.h>\n$(cat test/v3ext.c)" > test/v3ext.c
CFLAGS="-fPIC -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
./Configure --prefix=$PREFIX no-shared no-unit-test darwin64-arm64-cc
make -j8
make install_sw
popd
tar xfz OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.tar.gz
mv openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE} openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-x86_64
pushd openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-x86_64
echo -e "#include <string.h>\n$(cat test/v3ext.c)" > test/v3ext.c
CFLAGS="-fPIC -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
./Configure --prefix=$PREFIX no-shared no-unit-test darwin64-x86_64-cc
make -j8
make install_sw
popd
# Create universal binaries
lipo -create openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-arm64/libssl.a openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-x86_64/libssl.a \
-output $PREFIX/lib/libssl.a
lipo -create openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-arm64/libcrypto.a openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}-x86_64/libcrypto.a \
-output $PREFIX/lib/libcrypto.a
touch openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.done
else
echo "Using cached OpenSSL"
fi
###############################################################################
BOOST_VERSION_=${BOOST_VERSION//./_}
if [ ! -f boost/.done ]; then
echo "Building Boost for Py $PYTHON_VERSION"
download_dependency $ROOT_DIR/dependencies.yaml boost
cp -rf boost_${BOOST_VERSION_}/boost $PREFIX/include/
mkdir -p boost
touch .done
fi
###############################################################################
if [ ! -f protobuf-${PROTOBUF_VERSION}/.done ]; then
echo "Building Protobuf"
download_dependency $ROOT_DIR/dependencies.yaml protobuf
pushd protobuf-${PROTOBUF_VERSION}
CXXFLAGS="-fPIC -arch arm64 -arch x86_64 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
./configure --prefix=$PREFIX
make -j16
make install
touch .done
popd
else
echo "Using cached Protobuf"
fi
###############################################################################
if [ ! -f zstd-${ZSTD_VERSION}/.done ]; then
echo "Building ZStd"
download_dependency $ROOT_DIR/dependencies.yaml zstd
pushd zstd-${ZSTD_VERSION}
CFLAGS="-fPIC -O3 -arch arm64 -arch x86_64 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" PREFIX=$PREFIX \
make -j16 -C lib install-static install-includes
touch .done
popd
else
echo "Using cached ZStd"
fi
###############################################################################
if [ ! -f snappy-${SNAPPY_VERSION}/.done ]; then
echo "Building Snappy"
download_dependency $ROOT_DIR/dependencies.yaml snappy
pushd snappy-${SNAPPY_VERSION}
CXXFLAGS="-fPIC -O3 -arch arm64 -arch x86_64 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
cmake . -DCMAKE_INSTALL_PREFIX=$PREFIX -DSNAPPY_BUILD_TESTS=OFF -DSNAPPY_BUILD_BENCHMARKS=OFF
make -j16
make install
touch .done
popd
else
echo "Using cached Snappy"
fi
###############################################################################
if [ ! -f curl-${CURL_VERSION}/.done ]; then
echo "Building LibCurl"
CURL_VERSION_=${CURL_VERSION//./_}
download_dependency $ROOT_DIR/dependencies.yaml curl
pushd curl-${CURL_VERSION}
# Force the compiler to find the OpenSSL headers instead of the headers in the system path like /usr/local/include/openssl.
cp -rf $PREFIX/include/openssl include/
CFLAGS="-I$PREFIX/include -fPIC -arch arm64 -arch x86_64 -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
./configure --with-ssl=$PREFIX \
--without-nghttp2 \
--without-libidn2 \
--disable-ldap \
--without-brotli \
--without-secure-transport \
--disable-ipv6 \
--prefix=$PREFIX
make -j16 install
touch .done
popd
else
echo "Using cached LibCurl"
fi