mirror of
https://github.com/hashicorp/packer.git
synced 2026-02-20 00:10:04 -05:00
* Updating the license from MPL to Business Source License Going forward, this project will be licensed under the Business Source License v1.1. Please see our blog post for more details at https://hashi.co/bsl-blog, FAQ at https://hashi.co/license-faq, and details of the license at www.hashicorp.com/bsl. * Update copyright file headers to BUSL-1.1 --------- Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com>
159 lines
4 KiB
Bash
Executable file
159 lines
4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Copyright (c) HashiCorp, Inc.
|
|
# SPDX-License-Identifier: BUSL-1.1
|
|
|
|
|
|
# This script builds the application from source for multiple platforms.
|
|
# Determine the arch/os combos we're building for
|
|
ALL_XC_ARCH="386 amd64 arm arm64 ppc64le mips mips64 mipsle mipsle64 s390x"
|
|
ALL_XC_OS="linux darwin windows freebsd openbsd solaris"
|
|
SKIPPED_OSARCH="!darwin/arm !freebsd/arm !freebsd/arm64"
|
|
|
|
# Exit immediately if a command fails
|
|
set -e
|
|
|
|
# Validates that a necessary tool is on the PATH
|
|
function validateToolPresence
|
|
{
|
|
local TOOLNAME=$1
|
|
if ! which ${TOOLNAME} >/dev/null; then
|
|
echo "${TOOLNAME} is not on the path. Exiting..."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Validates that all used tools are present; exits when any is not found
|
|
function validatePreconditions
|
|
{
|
|
echo "==> Checking for necessary tools..."
|
|
validateToolPresence realpath
|
|
validateToolPresence dirname
|
|
validateToolPresence tr
|
|
validateToolPresence find
|
|
}
|
|
|
|
# Get the parent directory of where this script is.
|
|
# NOTE: I'm unsure why you don't just use realpath like below
|
|
function enterPackerSourceDir
|
|
{
|
|
echo "==> Entering Packer source dir..."
|
|
local BUILD_SCRIPT_PATH="${BASH_SOURCE[0]}"
|
|
SOURCEDIR=$(dirname $(dirname $(realpath "${BUILD_SCRIPT_PATH}")))
|
|
cd ${SOURCEDIR}
|
|
}
|
|
|
|
function ensureOutputStructure {
|
|
echo "==> Ensuring output directories are present..."
|
|
mkdir -p bin/
|
|
mkdir -p pkg/
|
|
}
|
|
|
|
function cleanOutputDirs {
|
|
echo "==> Removing old builds..."
|
|
rm -f bin/*
|
|
rm -fr pkg/*
|
|
}
|
|
|
|
function lowerCaseOSType {
|
|
local OS_TYPE=${OSTYPE:=`uname`}
|
|
echo "${OS_TYPE}" | tr "[:upper:]" "[:lower:]"
|
|
}
|
|
|
|
# Returns the OS appropriate path separator
|
|
function getPathSeparator {
|
|
# helpers for Cygwin-hosted builds
|
|
case "$(lowerCaseOSType)" in
|
|
mingw*|msys*|cygwin*)
|
|
# cygwin only translates ';' to ':' on select environment variables
|
|
echo ';'
|
|
;;
|
|
*) echo ':'
|
|
esac
|
|
}
|
|
|
|
function convertPathOnCygwin() {
|
|
local flag
|
|
local somePath
|
|
if [ "${1:0:1}" = '-' ]; then
|
|
flag=$1
|
|
somePath=$2
|
|
else
|
|
somePath=$1
|
|
fi
|
|
|
|
[ -n "${somePath}" ] || return 0
|
|
case "$(lowerCaseOSType)" in
|
|
cygwin*)
|
|
cygpath ${flag} -- "${somePath}"
|
|
;;
|
|
*) echo "${somePath}"
|
|
esac
|
|
}
|
|
|
|
validatePreconditions
|
|
enterPackerSourceDir
|
|
ensureOutputStructure
|
|
cleanOutputDirs
|
|
|
|
PATHSEP=$(getPathSeparator)
|
|
|
|
# XXX works in MINGW?
|
|
# FIXME: What if go is not in the PATH and GOROOT isn't set?
|
|
which go &>/dev/null || PATH+=":`convertPathOnCygwin "${GOROOT:?}"`/bin"
|
|
|
|
OLDIFS="${IFS}"
|
|
|
|
# make sure GOPATH is consistent - Windows binaries can't handle Cygwin-style paths
|
|
IFS="${PATHSEP}"
|
|
for d in ${GOPATH:-$(go env GOPATH)}; do
|
|
_GOPATH+="${_GOPATH:+${PATHSEP}}$(convertPathOnCygwin --windows "${d}")"
|
|
done
|
|
GOPATH="$_GOPATH"
|
|
|
|
# locate 'gox' and traverse GOPATH if needed
|
|
which "${GOX:=gox}" &>/dev/null || {
|
|
for d in ${GOPATH}; do
|
|
GOX="$(convertPathOnCygwin --unix "${d}")/bin/gox"
|
|
[ -x "${GOX}" ] && break || unset GOX
|
|
done
|
|
}
|
|
IFS="$OLDIFS"
|
|
|
|
# Build!
|
|
echo "==> Building..."
|
|
|
|
# If in dev mode, only build for ourself
|
|
if [ -n "${PACKER_DEV+x}" ]; then
|
|
XC_OS=$(go env GOOS)
|
|
XC_ARCH=$(go env GOARCH)
|
|
fi
|
|
|
|
export CGO_ENABLED=0
|
|
|
|
${GOX:?command not found} \
|
|
-os="${XC_OS:-$ALL_XC_OS}" \
|
|
-arch="${XC_ARCH:-$ALL_XC_ARCH}" \
|
|
-osarch="${SKIPPED_OSARCH}" \
|
|
-ldflags "${GOLDFLAGS}" \
|
|
-output "pkg/{{.OS}}_{{.Arch}}/packer" \
|
|
.
|
|
|
|
# trim GOPATH to first element
|
|
IFS="${PATHSEP}"
|
|
# FIXME: How do you know that the first path of GOPATH is the main GOPATH? Or is the main GOPATH meant to be the first path in GOPATH?
|
|
MAIN_GOPATH=(${GOPATH})
|
|
MAIN_GOPATH="$(convertPathOnCygwin --unix "${MAIN_GOPATH[0]}")"
|
|
IFS="${OLDIFS}"
|
|
|
|
# Copy our OS/Arch to the bin/ directory
|
|
echo "==> Copying binaries for this platform..."
|
|
DEV_PLATFORM="./pkg/$(go env GOOS)_$(go env GOARCH)"
|
|
for F in $(find ${DEV_PLATFORM} -mindepth 1 -maxdepth 1 -type f); do
|
|
cp -v ${F} bin/
|
|
cp -v ${F} "${MAIN_GOPATH}/bin/"
|
|
done
|
|
|
|
# Done!
|
|
echo
|
|
echo "==> Results:"
|
|
ls -hl bin/
|