blob: 89f8dc887c7c98079d78c5c1755c962f1cdddaf5 [file] [log] [blame]
# 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.
#!/bin/bash
set -e
# Default values
VERSION="7.1.55"
BUILD_DIR="./build_output"
DOCKER_IMAGE="foundationdb/build:centos7-latest"
REPO_URL="https://github.com/apple/foundationdb.git"
SRC_DIR="./foundationdb"
UPDATE_REPO=true
# Feature flags (default: all enabled except AWS and Azure backup)
BUILD_AWS_BACKUP=false
BUILD_AZURE_BACKUP=false
USE_JEMALLOC=true
USE_LTO=true
BUILD_DOCUMENTATION=true
WITH_ROCKSDB=true
WITH_GRPC=true
FULL_DEBUG_SYMBOLS=true
# Binding flags (default: only C and Python enabled)
BUILD_C_BINDING=true
BUILD_PYTHON_BINDING=true
BUILD_JAVA_BINDING=false
BUILD_GO_BINDING=false
BUILD_SWIFT_BINDING=false
BUILD_RUBY_BINDING=false
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Print help message
show_help() {
cat << EOF
Usage: $0 [OPTIONS]
Build FoundationDB using Docker.
Options:
-v VERSION FoundationDB version/tag to build (default: 7.1.55)
-o BUILD_DIR Output directory for build artifacts (default: ./build_output)
-i DOCKER_IMAGE Docker image to use (default: foundationdb/build:centos7-latest)
-s SRC_DIR Source directory (default: ./foundationdb)
-u Skip updating repository
Backup Options:
--aws Enable AWS backup support
--azure Enable Azure backup support
Build Options:
--no-jemalloc Disable jemalloc (default: enabled)
--no-lto Disable Link Time Optimization (default: enabled)
--no-debug-syms Disable full debug symbols (default: enabled)
--no-docs Disable documentation (default: enabled)
--no-rocksdb Disable RocksDB support (default: enabled)
--no-grpc Disable gRPC support (default: enabled)
Binding Options (default: C and Python enabled, others disabled):
--java Enable Java binding
--go Enable Go binding
--swift Enable Swift binding
--ruby Enable Ruby binding
--all-bindings Enable all bindings
--minimal-bindings Enable only C binding
Environment Variables:
FDB_ENABLE_JAVA Enable Java binding (true/false)
FDB_ENABLE_GO Enable Go binding (true/false)
FDB_ENABLE_SWIFT Enable Swift binding (true/false)
FDB_ENABLE_RUBY Enable Ruby binding (true/false)
General:
-h Show this help message
Examples:
$0 # Build with all features (C + Python bindings)
$0 -v 7.3.0 # Build specific version
$0 -v 7.3.0 --aws --azure # Enable AWS + Azure backup
$0 --java --go --swift # Enable additional bindings
$0 --all-bindings # Enable all bindings
$0 --no-grpc --no-rocksdb # Disable specific features
$0 --minimal-bindings # Only C binding
FDB_ENABLE_JAVA=true $0 # Enable Java via env var
EOF
}
# Parse command line arguments
while [[ $# -gt 0 ]]; do
case $1 in
-v)
VERSION="$2"
shift 2
;;
-o)
BUILD_DIR="$2"
shift 2
;;
-i)
DOCKER_IMAGE="$2"
shift 2
;;
-s)
SRC_DIR="$2"
shift 2
;;
-u)
UPDATE_REPO=false
shift
;;
--aws)
BUILD_AWS_BACKUP=true
shift
;;
--azure)
BUILD_AZURE_BACKUP=true
shift
;;
--no-jemalloc)
USE_JEMALLOC=false
shift
;;
--no-lto)
USE_LTO=false
shift
;;
--no-debug-syms)
FULL_DEBUG_SYMBOLS=false
shift
;;
--no-docs)
BUILD_DOCUMENTATION=false
shift
;;
--no-rocksdb)
WITH_ROCKSDB=false
shift
;;
--no-grpc)
WITH_GRPC=false
shift
;;
--debug-syms)
FULL_DEBUG_SYMBOLS=true
shift
;;
--docs)
BUILD_DOCUMENTATION=true
shift
;;
--rocksdb)
WITH_ROCKSDB=true
shift
;;
--grpc)
WITH_GRPC=true
shift
;;
--java)
BUILD_JAVA_BINDING=true
shift
;;
--go)
BUILD_GO_BINDING=true
shift
;;
--swift)
BUILD_SWIFT_BINDING=true
shift
;;
--ruby)
BUILD_RUBY_BINDING=true
shift
;;
--all-bindings)
BUILD_JAVA_BINDING=true
BUILD_GO_BINDING=true
BUILD_SWIFT_BINDING=true
BUILD_RUBY_BINDING=true
shift
;;
--minimal-bindings)
BUILD_PYTHON_BINDING=false
shift
;;
-h)
show_help
exit 0
;;
*)
echo -e "${RED}Unknown option: $1${NC}" >&2
show_help
exit 1
;;
esac
done
# Override bindings from environment variables
if [ "$FDB_ENABLE_JAVA" = "true" ]; then
BUILD_JAVA_BINDING=true
fi
if [ "$FDB_ENABLE_GO" = "true" ]; then
BUILD_GO_BINDING=true
fi
if [ "$FDB_ENABLE_SWIFT" = "true" ]; then
BUILD_SWIFT_BINDING=true
fi
if [ "$FDB_ENABLE_RUBY" = "true" ]; then
BUILD_RUBY_BINDING=true
fi
# Build CMAKE options string
CMAKE_OPTIONS=""
# Base options
CMAKE_OPTIONS+=" -DCMAKE_BUILD_TYPE=Release"
CMAKE_OPTIONS+=" -DFDB_RELEASE=ON"
# CMAKE_OPTIONS+=" -DFORCE_ALL_COMPONENTS=ON"
# Optional features
if [ "$USE_JEMALLOC" = true ]; then
CMAKE_OPTIONS+=" -DUSE_JEMALLOC=ON"
else
CMAKE_OPTIONS+=" -DUSE_JEMALLOC=OFF"
fi
if [ "$USE_LTO" = true ]; then
CMAKE_OPTIONS+=" -DUSE_LTO=ON"
else
CMAKE_OPTIONS+=" -DUSE_LTO=OFF"
fi
if [ "$FULL_DEBUG_SYMBOLS" = true ]; then
CMAKE_OPTIONS+=" -DFULL_DEBUG_SYMBOLS=ON"
fi
if [ "$BUILD_DOCUMENTATION" = true ]; then
CMAKE_OPTIONS+=" -DBUILD_DOCUMENTATION=ON"
fi
if [ "$WITH_ROCKSDB" = true ]; then
CMAKE_OPTIONS+=" -DWITH_ROCKSDB=ON"
fi
if [ "$WITH_GRPC" = true ]; then
CMAKE_OPTIONS+=" -DWITH_GRPC=ON"
fi
# Backup options
if [ "$BUILD_AWS_BACKUP" = true ]; then
CMAKE_OPTIONS+=" -DBUILD_AWS_BACKUP=ON"
fi
if [ "$BUILD_AZURE_BACKUP" = true ]; then
CMAKE_OPTIONS+=" -DBUILD_AZURE_BACKUP=ON"
fi
# Binding options
if [ "$BUILD_C_BINDING" = true ]; then
CMAKE_OPTIONS+=" -DBUILD_C_BINDING=ON"
fi
if [ "$BUILD_PYTHON_BINDING" = true ]; then
CMAKE_OPTIONS+=" -DBUILD_PYTHON_BINDING=ON"
fi
if [ "$BUILD_JAVA_BINDING" = true ]; then
CMAKE_OPTIONS+=" -DBUILD_JAVA_BINDING=ON"
fi
if [ "$BUILD_GO_BINDING" = true ]; then
CMAKE_OPTIONS+=" -DBUILD_GO_BINDING=ON"
fi
if [ "$BUILD_SWIFT_BINDING" = true ]; then
CMAKE_OPTIONS+=" -DBUILD_SWIFT_BINDING=ON"
fi
if [ "$BUILD_RUBY_BINDING" = true ]; then
CMAKE_OPTIONS+=" -DBUILD_RUBY_BINDING=ON"
fi
# Print configuration
echo -e "${GREEN}=== FoundationDB Build Configuration ===${NC}"
echo -e "${BLUE}Basic Settings:${NC}"
echo " Version: $VERSION"
echo " Build Dir: $BUILD_DIR"
echo " Source Dir: $SRC_DIR"
echo " Docker Image: $DOCKER_IMAGE"
echo " Update Repo: $UPDATE_REPO"
echo ""
echo -e "${BLUE}Enabled Features:${NC}"
echo " JEMALLOC: $USE_JEMALLOC"
echo " LTO: $USE_LTO"
echo " Debug Symbols: $FULL_DEBUG_SYMBOLS"
echo " Documentation: $BUILD_DOCUMENTATION"
echo " RocksDB: $WITH_ROCKSDB"
echo " gRPC: $WITH_GRPC"
echo " AWS Backup: $BUILD_AWS_BACKUP"
echo " Azure Backup: $BUILD_AZURE_BACKUP"
echo ""
echo -e "${BLUE}Enabled Bindings:${NC}"
echo " C: $BUILD_C_BINDING"
echo " Python: $BUILD_PYTHON_BINDING"
echo " Java: $BUILD_JAVA_BINDING"
echo " Go: $BUILD_GO_BINDING"
echo " Swift: $BUILD_SWIFT_BINDING"
echo " Ruby: $BUILD_RUBY_BINDING"
echo ""
echo -e "${BLUE}CMake Options:${NC}"
echo "$CMAKE_OPTIONS" | tr ' ' '\n' | grep -v '^$' | sed 's/^/ /'
echo ""
# Pull Docker image
echo -e "${YELLOW}Pulling Docker image...${NC}"
docker pull "$DOCKER_IMAGE"
# Clone or update repository
if [ -d "$SRC_DIR" ]; then
echo -e "${YELLOW}Repository exists...${NC}"
if [ "$UPDATE_REPO" = true ]; then
echo "Updating repository..."
cd "$SRC_DIR"
git fetch origin
git reset --hard origin/main
cd ..
else
echo "Skipping repository update (-u flag set)"
fi
else
echo -e "${YELLOW}Cloning repository...${NC}"
git clone "$REPO_URL" "$SRC_DIR"
fi
# Checkout specific version/tag
echo -e "${YELLOW}Checking out version: $VERSION${NC}"
cd "$SRC_DIR"
git checkout "$VERSION"
cd ..
# Create build output directory
mkdir -p "$BUILD_DIR"
# Run build in container
echo -e "${YELLOW}Starting build...${NC}"
docker run --rm \
-v "$(pwd)/$SRC_DIR:/foundationdb/src:ro" \
-v "$(pwd)/$BUILD_DIR:/foundationdb/build" \
"$DOCKER_IMAGE" \
bash -c "
mkdir -p /foundationdb/build && \
cd /foundationdb/build && \
CC=clang CXX=clang++ LD=lld cmake -B build -D USE_LD=LLD -D USE_LIBCXX=1 -G Ninja $CMAKE_OPTIONS /foundationdb/src && \
ninja -C build
"
echo ""
echo -e "${GREEN}=== Build Complete! ===${NC}"
echo "Artifacts location: $(pwd)/$BUILD_DIR"