linuxkit/tools/go-compile/compile.sh
Avi Deitcher 7a129b6e8d
bump golangci-lint to v2.0.2 and update all lint issues (#4116)
Signed-off-by: Avi Deitcher <avi@deitcher.net>
2025-04-09 17:53:20 +03:00

107 lines
1.8 KiB
Bash
Executable File

#!/bin/sh
# This is designed to compile a single package to a single binary
# so it makes some assumptions about things to simplify config
# to output a single binary (in a tarball) just use -o file
set -e
usage() {
echo "Usage: -o file"
exit 1
}
[ $# = 0 ] && usage
while [ $# -gt 1 ]
do
flag="$1"
case "$flag" in
-o)
out="$2"
mkdir -p "$(dirname $2)"
shift
;;
--package)
package="$2"
shift
;;
--ldflags)
ldflags="$2"
shift
;;
--clone-path)
clonepath="$2"
shift
;;
--clone)
clone="$2"
shift
;;
--commit)
commit="$2"
shift
;;
*)
echo "Unknown option $1"
exit 1
esac
shift
done
[ $# -gt 0 ] && usage
[ -z "$out" ] && usage
[ -z "$package" ] && package=$(basename "$out")
dir="$GOPATH/src/$package"
if [ -z "$clone" ]
then
mkdir -p "$dir"
cd "$dir"
# untar input
tar xf -
else
mkdir -p "$GOPATH/src/$clonepath"
cd "$GOPATH/src/$clonepath"
git clone "$clone" .
[ ! -z "$commit" ] && git checkout "$commit"
mkdir -p "$dir"
cd "$dir"
fi
cd "$dir"
# Use '-mod=vendor' for builds which have switched to go modules
[ -f go.mod ] && MOD_ARG="-mod=vendor"
# lint before building
>&2 echo "gofmt..."
test -z $(gofmt -s -l .| grep -v .pb. | grep -v vendor/ | tee /dev/stderr)
>&2 echo "govet..."
test -z $(GOOS=linux go vet $MOD_ARG -printf=false . 2>&1 | grep -v "^#" | grep -v vendor/ | tee /dev/stderr)
>&2 echo "golint..."
golangci-lint run ./... >&2
>&2 echo "ineffassign..."
test -z $(ineffassign ./... | tee /dev/stderr)
>&2 echo "go build..."
if [ "$GOOS" = "darwin" -o "$GOOS" = "windows" ]
then
if [ -z "$ldflags" ]
then
go build $MOD_ARG -o $out "$package"
else
go build $MOD_ARG -o $out -ldflags "${ldflags}" "$package"
fi
else
go build $MOD_ARG -o $out -buildmode pie -ldflags "-linkmode=external -s -w ${ldflags} -extldflags \"-static-pie\"" "$package"
fi
tar cf - $out