mirror of
https://github.com/opentofu/opentofu.git
synced 2025-01-06 14:13:16 -06:00
c133de863b
We're still using vendoring for now until we get _all_ of our tooling updated, so the main idea here is to force use of the vendor directory when running tests and building for development so we can quickly find situations where we forget to run "go mod vendor". We also setting GO111MODULE=off for installation of tools. Right now this is the best way to install a tool in GOBIN without also interfering with go.mod and go.sum, until a better pattern for managing tool dependencies is devised by the Go team. Finally, we run "go mod download" before launching "gox" in the main build process, to prime the local module cache once so that the concurrent "go build" processes won't race to populate it redundantly. This means that we'll be producing final builds from the module cache rather than from vendor as with everything else -- there's currently no way to tell gox to use -mod=vendor -- but that should be fine in practice since our go.sum file will ensure that we get the exact sources we expect in the module cache before building.
107 lines
2.8 KiB
Bash
Executable File
107 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# This script builds the application from source for multiple platforms.
|
|
|
|
# Get the parent directory of where this script is.
|
|
SOURCE="${BASH_SOURCE[0]}"
|
|
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
|
|
DIR="$( cd -P "$( dirname "$SOURCE" )/.." && pwd )"
|
|
|
|
# Change into that directory
|
|
cd "$DIR"
|
|
|
|
# Get the git commit
|
|
GIT_COMMIT=$(git rev-parse HEAD)
|
|
GIT_DIRTY=$(test -n "`git status --porcelain`" && echo "+CHANGES" || true)
|
|
|
|
# Determine the arch/os combos we're building for
|
|
XC_ARCH=${XC_ARCH:-"386 amd64 arm"}
|
|
XC_OS=${XC_OS:-linux darwin windows freebsd openbsd solaris}
|
|
XC_EXCLUDE_OSARCH="!darwin/arm !darwin/386"
|
|
|
|
# Delete the old dir
|
|
echo "==> Removing old directory..."
|
|
rm -f bin/*
|
|
rm -rf pkg/*
|
|
mkdir -p bin/
|
|
|
|
# If its dev mode, only build for ourself
|
|
if [ "${TF_DEV}x" != "x" ]; then
|
|
XC_OS=$(go env GOOS)
|
|
XC_ARCH=$(go env GOARCH)
|
|
fi
|
|
|
|
if ! which gox > /dev/null; then
|
|
echo "==> Installing gox..."
|
|
go get -u github.com/mitchellh/gox
|
|
fi
|
|
|
|
# instruct gox to build statically linked binaries
|
|
export CGO_ENABLED=0
|
|
|
|
# Allow LD_FLAGS to be appended during development compilations
|
|
LD_FLAGS="-X main.GitCommit=${GIT_COMMIT}${GIT_DIRTY} $LD_FLAGS"
|
|
|
|
# In release mode we don't want debug information in the binary
|
|
if [[ -n "${TF_RELEASE}" ]]; then
|
|
LD_FLAGS="-X main.GitCommit=${GIT_COMMIT}${GIT_DIRTY} -X github.com/hashicorp/terraform/version.Prerelease= -s -w"
|
|
fi
|
|
|
|
# Ensure all remote modules are downloaded and cached before build so that
|
|
# the concurrent builds launched by gox won't race to redundantly download them.
|
|
go mod download
|
|
|
|
# Build!
|
|
echo "==> Building..."
|
|
gox \
|
|
-os="${XC_OS}" \
|
|
-arch="${XC_ARCH}" \
|
|
-osarch="${XC_EXCLUDE_OSARCH}" \
|
|
-ldflags "${LD_FLAGS}" \
|
|
-output "pkg/{{.OS}}_{{.Arch}}/${PWD##*/}" \
|
|
.
|
|
|
|
# Move all the compiled things to the $GOPATH/bin
|
|
GOPATH=${GOPATH:-$(go env GOPATH)}
|
|
case $(uname) in
|
|
CYGWIN*)
|
|
GOPATH="$(cygpath $GOPATH)"
|
|
;;
|
|
esac
|
|
OLDIFS=$IFS
|
|
IFS=: MAIN_GOPATH=($GOPATH)
|
|
IFS=$OLDIFS
|
|
|
|
# Create GOPATH/bin if it's doesn't exists
|
|
if [ ! -d $MAIN_GOPATH/bin ]; then
|
|
echo "==> Creating GOPATH/bin directory..."
|
|
mkdir -p $MAIN_GOPATH/bin
|
|
fi
|
|
|
|
# Copy our OS/Arch to the bin/ directory
|
|
DEV_PLATFORM="./pkg/$(go env GOOS)_$(go env GOARCH)"
|
|
if [[ -d "${DEV_PLATFORM}" ]]; then
|
|
for F in $(find ${DEV_PLATFORM} -mindepth 1 -maxdepth 1 -type f); do
|
|
cp ${F} bin/
|
|
cp ${F} ${MAIN_GOPATH}/bin/
|
|
done
|
|
fi
|
|
|
|
if [ "${TF_DEV}x" = "x" ]; then
|
|
# Zip and copy to the dist dir
|
|
echo "==> Packaging..."
|
|
for PLATFORM in $(find ./pkg -mindepth 1 -maxdepth 1 -type d); do
|
|
OSARCH=$(basename ${PLATFORM})
|
|
echo "--> ${OSARCH}"
|
|
|
|
pushd $PLATFORM >/dev/null 2>&1
|
|
zip ../${OSARCH}.zip ./*
|
|
popd >/dev/null 2>&1
|
|
done
|
|
fi
|
|
|
|
# Done!
|
|
echo
|
|
echo "==> Results:"
|
|
ls -hl bin/
|