diff --git a/cloud/script/build_fdb.sh b/cloud/script/build_fdb.sh new file mode 100644 index 00000000000000..89f8dc887c7c98 --- /dev/null +++ b/cloud/script/build_fdb.sh @@ -0,0 +1,384 @@ +# 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"