blob: 07466bf16fcc6b89bdbb9aa4bbacfc3d66796b19 [file]
#!/bin/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
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)"
COMET_HOME_DIR=$SCRIPT_DIR/../..
function usage {
local NAME=$(basename $0)
cat <<EOF
Usage: $NAME [options]
This script builds comet native binaries inside a docker image. The image is named
"comet-rm" and will be generated by this script
Options are:
-r [repo] : git repo (default: ${REPO})
-b [branch] : git branch (default: ${BRANCH})
-t [tag] : tag for the spark-rm docker image to use for building (default: "latest").
EOF
exit 1
}
function cleanup()
{
if [ $CLEANUP != 0 ]
then
echo Cleaning up ...
if [ "$(docker ps -a | grep comet-arm64-builder-container)" != "" ]
then
docker rm comet-arm64-builder-container
fi
if [ "$(docker ps -a | grep comet-amd64-builder-container)" != "" ]
then
docker rm comet-amd64-builder-container
fi
CLEANUP=0
fi
}
trap cleanup SIGINT SIGTERM EXIT
CLEANUP=1
REPO="https://github.com/apache/datafusion-comet.git"
BRANCH="release"
MACOS_SDK=
HAS_MACOS_SDK="false"
IMGTAG=latest
while getopts "b:hr:t:" opt; do
case $opt in
r) REPO="$OPTARG";;
b) BRANCH="$OPTARG";;
t) IMGTAG="$OPTARG" ;;
h) usage ;;
\?) error "Invalid option. Run with -h for help." ;;
esac
done
echo "Building binaries from $REPO/$BRANCH"
WORKING_DIR="$SCRIPT_DIR/comet-rm/workdir"
cp $SCRIPT_DIR/../cargo.config $WORKING_DIR
# TODO: Search for Xcode (Once building macos binaries works)
#PS3="Select Xcode:"
#select xcode_path in `find . -name "${MACOS_SDK}"`
#do
# echo "found Xcode in $xcode_path"
# cp $xcode_path $WORKING_DIR
# break
#done
if [ -f "${WORKING_DIR}/${MACOS_SDK}" ]
then
HAS_MACOS_SDK="true"
fi
BUILDER_IMAGE_ARM64="comet-rm-arm64:$IMGTAG"
BUILDER_IMAGE_AMD64="comet-rm-amd64:$IMGTAG"
# Build the docker image in which we will do the build
docker build \
--platform=linux/arm64 \
-t "$BUILDER_IMAGE_ARM64" \
--build-arg HAS_MACOS_SDK=${HAS_MACOS_SDK} \
--build-arg MACOS_SDK=${MACOS_SDK} \
"$SCRIPT_DIR/comet-rm"
docker build \
--platform=linux/amd64 \
-t "$BUILDER_IMAGE_AMD64" \
--build-arg HAS_MACOS_SDK=${HAS_MACOS_SDK} \
--build-arg MACOS_SDK=${MACOS_SDK} \
"$SCRIPT_DIR/comet-rm"
# Clean previous Java build
pushd $COMET_HOME_DIR && ./mvnw clean && popd
# Run the builder container for each architecture. The entrypoint script will build the binaries
# AMD64
echo "Building amd64 binary"
docker run \
--name comet-amd64-builder-container \
--memory 24g \
--cpus 6 \
-it \
--platform linux/amd64 \
$BUILDER_IMAGE_AMD64 "${REPO}" "${BRANCH}" amd64
if [ $? != 0 ]
then
echo "Building amd64 binary failed."
exit 1
fi
# ARM64
echo "Building arm64 binary"
docker run \
--name comet-arm64-builder-container \
--memory 24g \
--cpus 6 \
-it \
--platform linux/arm64 \
$BUILDER_IMAGE_ARM64 "${REPO}" "${BRANCH}" arm64
if [ $? != 0 ]
then
echo "Building arm64 binary failed."
exit 1
fi
echo "Building binaries completed"
echo "Copying to java build directories"
JVM_TARGET_DIR=$COMET_HOME_DIR/common/target/classes/org/apache/comet
mkdir -p $JVM_TARGET_DIR
mkdir -p $JVM_TARGET_DIR/linux/amd64
docker cp \
comet-amd64-builder-container:"/opt/comet-rm/comet/native/target/release/libcomet.so" \
$JVM_TARGET_DIR/linux/amd64/
if [ "$HAS_MACOS_SDK" == "true" ]
then
mkdir -p $JVM_TARGET_DIR/darwin/x86_64
docker cp \
comet-amd64-builder-container:"/opt/comet-rm/comet/native/target/x86_64-apple-darwin/release/libcomet.dylib" \
$JVM_TARGET_DIR/darwin/x86_64/
fi
mkdir -p $JVM_TARGET_DIR/linux/aarch64
docker cp \
comet-arm64-builder-container:"/opt/comet-rm/comet/native/target/release/libcomet.so" \
$JVM_TARGET_DIR/linux/aarch64/
if [ "$HAS_MACOS_SDK" == "true" ]
then
mkdir -p $JVM_TARGET_DIR/linux/aarch64
docker cp \
comet-arm64-builder-container:"/opt/comet-rm/comet/native/target/aarch64-apple-darwin/release/libcomet.dylib" \
$JVM_TARGET_DIR/darwin/aarch64/
fi
# Build final jar
echo "Building uber jar and publishing it locally"
pushd $COMET_HOME_DIR
GIT_HASH=$(git rev-parse --short HEAD)
LOCAL_REPO=$(mktemp -d /tmp/comet-staging-repo-XXXXX)
./mvnw "-Dmaven.repo.local=${LOCAL_REPO}" -P spark-3.4 -P scala-2.12 -DskipTests install
./mvnw "-Dmaven.repo.local=${LOCAL_REPO}" -P spark-3.4 -P scala-2.13 -DskipTests install
./mvnw "-Dmaven.repo.local=${LOCAL_REPO}" -P spark-3.3 -P scala-2.12 -DskipTests install
./mvnw "-Dmaven.repo.local=${LOCAL_REPO}" -P spark-3.3 -P scala-2.13 -DskipTests install
./mvnw "-Dmaven.repo.local=${LOCAL_REPO}" -P spark-3.5 -P scala-2.12 -DskipTests install
./mvnw "-Dmaven.repo.local=${LOCAL_REPO}" -P spark-3.5 -P scala-2.13 -DskipTests install
echo "Installed to local repo: ${LOCAL_REPO}"
popd