#!/bin/bash # build_binaries.sh # # Builds doltgres binaries with os-arch tuples provided as arguments, e.g. windows-amd64 linux-amd64 # # This script is intended to be run in a docker environment via build.sh or # build_all_binaries.sh. You can also use it to build locally, but it needs to run apt-get and other # commands which modify the system. # # To build doltgres for the OS / arch of this machine, use build.sh. set -e set -o pipefail apt-get update && apt-get install -y p7zip-full pigz curl xz-utils mingw-w64 clang-19 mkdir -p /tmp/build-deps pushd /tmp/build-deps curl -o optcross.tar.xz https://dolthub-tools.s3.us-west-2.amazonaws.com/optcross/"$(uname -m)"-linux_20250327_0.0.3_trixie.tar.xz tar Jxf optcross.tar.xz -C / curl -o icustatic.tar.xz https://dolthub-tools.s3.us-west-2.amazonaws.com/icustatic/20250327_0.0.3_trixie.tar.xz tar Jxf icustatic.tar.xz -C / export PATH=/opt/cross/bin:"$PATH" popd OS_ARCH_TUPLES="$*" declare -A platform_cc platform_cc["linux-arm64"]="aarch64-linux-musl-gcc" platform_cc["linux-amd64"]="x86_64-linux-musl-gcc" platform_cc["darwin-arm64"]="clang-19 --target=aarch64-darwin --sysroot=/opt/cross/darwin-sysroot -mmacosx-version-min=12.0" platform_cc["darwin-amd64"]="clang-19 --target=x86_64-darwin --sysroot=/opt/cross/darwin-sysroot -mmacosx-version-min=12.0" platform_cc["windows-amd64"]="x86_64-w64-mingw32-gcc" declare -A platform_cxx platform_cxx["linux-arm64"]="aarch64-linux-musl-g++" platform_cxx["linux-amd64"]="x86_64-linux-musl-g++" platform_cxx["darwin-arm64"]="clang++-19 --target=aarch64-darwin --sysroot=/opt/cross/darwin-sysroot -mmacosx-version-min=12.0 --stdlib=libc++" platform_cxx["darwin-amd64"]="clang++-19 --target=x86_64-darwin --sysroot=/opt/cross/darwin-sysroot -mmacosx-version-min=12.0 --stdlib=libc++" platform_cxx["windows-amd64"]="x86_64-w64-mingw32-g++" declare -A platform_as platform_as["linux-arm64"]="aarch64-linux-musl-as" platform_as["linux-amd64"]="x86_64-linux-musl-as" platform_as["darwin-arm64"]="clang-19 --target=aarch64-darwin --sysroot=/opt/cross/darwin-sysroot -mmacosx-version-min=12.0" platform_as["darwin-amd64"]="clang-19 --target=x86_64-darwin --sysroot=/opt/cross/darwin-sysroot -mmacosx-version-min=12.0" platform_as["windows-amd64"]="x86_64-w64-mingw32-as" declare -A platform_go_ldflags platform_go_ldflags["linux-arm64"]="-linkmode external -s -w" platform_go_ldflags["linux-amd64"]="-linkmode external -s -w" platform_go_ldflags["darwin-arm64"]="-s -w -compressdwarf=false -extldflags -Wl,-platform_version,macos,12.0,14.4" platform_go_ldflags["darwin-amd64"]="-s -w -compressdwarf=false -extldflags -Wl,-platform_version,macos,12.0,14.4" platform_go_ldflags["windows-amd64"]="-s -w" declare -A platform_cgo_ldflags platform_cgo_ldflags["linux-arm64"]="-static -s" platform_cgo_ldflags["linux-amd64"]="-static -s" platform_cgo_ldflags["darwin-arm64"]="" platform_cgo_ldflags["darwin-amd64"]="" # Stack smash protection lib is built into clang for unix platforms, # but on Windows we need to pull in the separate ssp library platform_cgo_ldflags["windows-amd64"]="-static-libgcc -static-libstdc++ -Wl,-Bstatic -lssp" for tuple in $OS_ARCH_TUPLES; do os=`echo $tuple | sed 's/-.*//'` arch=`echo $tuple | sed 's/.*-//'` o="out/doltgresql-$os-$arch" mkdir -p "$o/bin" mkdir -p "$o/licenses" cp -r ./licenses "$o/licenses" cp LICENSE "$o/licenses" bin="doltgres" if [ "$os" = windows ]; then bin="$bin.exe" fi echo Building "$o/bin/$bin" CGO_ENABLED=1 \ GOOS="$os" \ GOARCH="$arch" \ CC="${platform_cc[${tuple}]}" \ CXX="${platform_cxx[${tuple}]}" \ AS="${platform_as[${tuple}]}" \ CGO_LDFLAGS="${platform_cgo_ldflags[${tuple}]}" \ go build -buildvcs=false -trimpath \ -ldflags="${platform_go_ldflags[${tuple}]}" \ -tags icu_static -o "$o/bin/$bin" \ ./cmd/doltgres if [ "$os" = windows ]; then (cd out && 7z a "doltgresql-$os-$arch.zip" "doltgresql-$os-$arch" && 7z a "doltgresql-$os-$arch.7z" "doltgresql-$os-$arch") else tar cf - -C out "doltgresql-$os-$arch" | pigz -9 > "out/doltgresql-$os-$arch.tar.gz" fi done