#!/usr/bin/env sh # # Build a static binary for the host OS/ARCH # set -eu : "${CGO_ENABLED=}" : "${GO_LINKMODE=static}" : "${GO_BUILDMODE=}" : "${GO_BUILDTAGS=}" : "${GO_STRIP=}" . ./scripts/build/.variables if [ -z "$CGO_ENABLED" ]; then case "$(go env GOOS)" in linux) case "$(go env GOARCH)" in amd64|arm64|arm|s390x) CGO_ENABLED=1 ;; *) CGO_ENABLED=0 ;; esac ;; darwin|windows) CGO_ENABLED=1 ;; *) CGO_ENABLED=0 ;; esac fi export CGO_ENABLED if [ "$CGO_ENABLED" = "1" ] && [ "$(go env GOOS)" != "windows" ]; then case "$(go env GOARCH)" in mips*|ppc64) # pie build mode is not supported on mips architectures ;; *) GO_BUILDMODE="-buildmode=pie" ;; esac GO_BUILDTAGS="$GO_BUILDTAGS pkcs11" fi if [ "$CGO_ENABLED" = "1" ] && [ "$GO_LINKMODE" = "static" ] && [ "$(go env GOOS)" = "linux" ]; then LDFLAGS="$LDFLAGS -extldflags -static" fi if [ -n "$GO_STRIP" ]; then LDFLAGS="$LDFLAGS -s -w" fi if [ "$(go env GOOS)" = "windows" ]; then : "${WINDRES=$($(go env CC) --print-prog-name=windres)}" if [ -z "$WINDRES" ]; then >&2 echo "Empty WINDRES detected, skipping manifesting binary" else # Generate a Windows file version of the form major,minor,patch,build VERSION_QUAD=$(printf "%s" "$VERSION" | sed -re 's/^([0-9.]*).*$/\1/' | tr . , | sed -re 's/,$//' | sed -re 's/^[0-9]+$/\0,0/' | sed -re 's/^[0-9]+,[0-9]+$/\0,0/' | sed -re 's/^[0-9]+,[0-9]+,[0-9]+$/\0,0/') set -- [ -n "$VERSION" ] && set -- "$@" -D "DOCKER_VERSION=\"$VERSION\"" [ -n "$VERSION_QUAD" ] && set -- "$@" -D "DOCKER_VERSION_QUAD=$VERSION_QUAD" [ -n "$GITCOMMIT" ] && set -- "$@" -D "DOCKER_COMMIT=\"$GITCOMMIT\"" target="$(dirname "$0")/../../cli/winresources/rsrc_$(go env GOARCH).syso" mkdir -p "$(dirname "${target}")" "$WINDRES" -i "$(dirname "$0")/../winresources/docker.rc" -o "$target" --use-temp-file "$@" echo "package winresources" > "$(dirname "${target}")/stub_windows.go" fi fi echo "Building $GO_LINKMODE $(basename "${TARGET}")" export GO111MODULE=auto go build -o "${TARGET}" -tags "${GO_BUILDTAGS}" --ldflags "${LDFLAGS}" ${GO_BUILDMODE} "${SOURCE}" ln -sf "$(basename "${TARGET}")" "$(dirname "${TARGET}")/docker"