build-go.sh 3.46 KiB
#!/bin/bash
#
# you can choose your OS and Architecture as follows:
# ./build.sh --os=windows --arch=amd64
#
# or you can use --help to check a list of platforms and options
#
if ! which go &>/dev/null; then
echo "Go is not installed or is not in \$PATH"
echo "giving up..."
exit 1
fi
unset GOBIN
BIN_NAME=acme-downloader
PATH=$PATH:$(go env GOPATH)/bin
GOPATH=$(go env GOPATH)
BUILDTIME=$(date -u '+%Y-%m-%d_%H:%M:%S')
REPO_DIR=$(dirname $0)
if [[ "$REPO_DIR" = '.' ]]; then
REPO_DIR=$(pwd)
fi
test -L "${GOPATH}/src/${REPO_DIR}" || ln -sf "$REPO_DIR" "${GOPATH}/src/"
REPO_NAME=$(basename "$REPO_DIR")
cd "${GOPATH}/src/$REPO_NAME"
export PATH GOPATH
usage() {
echo "Usage: $(basename $0)"
echo " -h | --help [Print this help and exit]"
echo " --os=OS (Compile binary for this OS)"
echo " --arch=ARCH (Compile binary for this Architecture)"
echo " --upx (Enable UPX compression)"
echo " --no-upx (Disable UPX compression)"
echo " --version (Version number. If not used it will be the latest tag)"
echo ""
echo " Below is a list of supported OS/Arch combinations:"
echo "OS ARCH"
go tool dist list | column -t -s '/' --table-columns =======,=======
exit
}
OPTS=$(getopt -o "h" --longoptions "help,os:,arch:,upx,no-upx,version:" -- "$@")
eval set -- "$OPTS"
while true; do
case "$1" in
-h | --help)
usage
;;
--os)
shift
OS="$1"
;;
--arch)
shift
ARCH="$1"
;;
--upx)
UPX='UPX'
;;
--no-upx)
NOUPX='NOUPX'
;;
--version)
shift
VERSION="$1"
;;
--)
shift
break
;;
esac
shift
done
if [[ -n $VERSION ]]; then
PROG_VERSION=$(echo $VERSION | tr -d v)
else
PROG_VERSION=$(git describe --tags $(git rev-list --tags --max-count=1) | tr -d v)
fi
if [[ -z $OS ]] || [[ -z $ARCH ]]; then
echo -e "\nYou need to supply OS and Architecture\n"
usage
fi
if [[ "$OS" == "windows" ]]; then
BIN_NAME="${BIN_NAME}.exe"
fi
# env GOOS=$OS GOARCH=$ARCH go build -ldflags "-s -w -X main.appVersion=${PROG_VERSION} -X main.buildTime=${BUILDTIME}" .
env GOOS=$OS GOARCH=$ARCH go get -ldflags "-s -w -X main.appVersion=${PROG_VERSION} -X main.buildTime=${BUILDTIME}" .
if [ $? -gt 0 ]; then
echo -e "\nthere was an error while compiling the code\n"
exit
fi
EXECUTABLE_PATH="${GOPATH}/bin/${OS}_${ARCH}/${BIN_NAME}"
[ -f $EXECUTABLE_PATH ] || EXECUTABLE_PATH="${GOPATH}/bin/${BIN_NAME}"
run_upx() {
if ! which upx &>/dev/null; then
echo "please download upx here: https://github.com/upx/upx/releases"
echo "and store the executable within your \$PATH"
exit
fi
upx --brute "$EXECUTABLE_PATH"
}
if [[ "$UPX" == 'UPX' ]]; then
run_upx
elif [[ "$NOUPX" == 'NOUPX' ]]; then
true
else
while true; do
echo -e "\nUPX degrades performances but in the case of acme-downloader it is not noticeable"
echo -e "UPX does not work on some OS/Arch combination (I haven't tried them all)\n"
read -p "Do you wish to run upx against ${BIN_NAME}? (y/n) " yn
case $yn in
[Yy]*)
echo ""
run_upx
break
;;
[Nn]*) break ;;
*)
echo "Please answer Y|y or N|n."
;;
esac
done
fi
cp $EXECUTABLE_PATH .
echo -e "\nthe binary was compiled and it is avilable as:\n - \"$EXECUTABLE_PATH\"\n"