diff --git a/build.sh b/build.sh index ac33c6e..0c75988 100755 --- a/build.sh +++ b/build.sh @@ -8,12 +8,36 @@ set -e # - HY_APP_COMMIT: App commit hash # - HY_APP_PLATFORMS: Platforms to build for (e.g. "windows/amd64,linux/amd64,darwin/amd64") +export LC_ALL=C +export LC_DATE=C + +has_command() { + local cmd="$1" + type -P "$cmd" > /dev/null 2>&1 +} + +if ! has_command go; then + echo 'Error: go is not installed.' >&2 + exit 1 +fi + +if ! has_command git; then + echo 'Error: git is not installed.' >&2 + exit 1 +fi + +if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then + echo 'Error: not in a git repository.' >&2 + exit 1 +fi + + platform_to_env() { - local os=$1 - local arch=$2 + local os="$1" + local arch="$2" local env="GOOS=$os GOARCH=$arch CGO_ENABLED=0" - case $arch in + case "$arch" in arm) env+=" GOARM= GOARCH=arm" ;; @@ -43,39 +67,54 @@ platform_to_env() { ;; esac - echo $env + echo "$env" } -if ! [ -x "$(command -v go)" ]; then - echo 'Error: go is not installed.' >&2 - exit 1 -fi +make_ldflags() { + local ldflags="-s -w -X 'main.appDate=$(date -u '+%F %T')'" + if [ -n "$HY_APP_VERSION" ]; then + ldflags="$ldflags -X 'main.appVersion=$HY_APP_VERSION'" + else + ldflags="$ldflags -X 'main.appVersion=$(git describe --tags --always --match 'v*')'" + fi + if [ -n "$HY_APP_COMMIT" ]; then + ldflags="$ldflags -X 'main.appCommit=$HY_APP_COMMIT'" + else + ldflags="$ldflags -X 'main.appCommit=$(git rev-parse HEAD)'" + fi + echo "$ldflags" +} -if ! [ -x "$(command -v git)" ]; then - echo 'Error: git is not installed.' >&2 - exit 1 -fi -if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then - echo 'Error: not in a git repository.' >&2 - exit 1 -fi +build_for_platform() { + local platform="$1" + local ldflags="$2" + + local GOOS="${platform%/*}" + local GOARCH="${platform#*/}" + if [[ -z "$GOOS" || -z "$GOARCH" ]]; then + echo "Invalid platform $platform" >&2 + return 1 + fi + echo "Building $GOOS/$GOARCH" + local output="build/hysteria-$GOOS-$GOARCH" + if [[ "$GOOS" = "windows" ]]; then + output="$output.exe" + fi + local envs="$(platform_to_env "$GOOS" "$GOARCH")" + local exit_val=0 + env $envs go build -o "$output" -tags=gpl -ldflags "$ldflags" -trimpath ./app/cmd/ || exit_val=$? + if [[ "$exit_val" -ne 0 ]]; then + echo "Error: failed to build $GOOS/$GOARCH" >&2 + return $exit_val + fi +} -ldflags="-s -w -X 'main.appDate=$(date -u '+%F %T')'" -if [ -n "$HY_APP_VERSION" ]; then - ldflags="$ldflags -X 'main.appVersion=$HY_APP_VERSION'" -else - ldflags="$ldflags -X 'main.appVersion=$(git describe --tags --always)'" -fi -if [ -n "$HY_APP_COMMIT" ]; then - ldflags="$ldflags -X 'main.appCommit=$HY_APP_COMMIT'" -else - ldflags="$ldflags -X 'main.appCommit=$(git rev-parse HEAD)'" -fi if [ -z "$HY_APP_PLATFORMS" ]; then HY_APP_PLATFORMS="$(go env GOOS)/$(go env GOARCH)" fi platforms=(${HY_APP_PLATFORMS//,/ }) +ldflags="$(make_ldflags)" mkdir -p build rm -rf build/* @@ -83,19 +122,7 @@ rm -rf build/* echo "Starting build..." for platform in "${platforms[@]}"; do - GOOS=${platform%/*} - GOARCH=${platform#*/} - echo "Building $GOOS/$GOARCH" - output="build/hysteria-$GOOS-$GOARCH" - if [ $GOOS = "windows" ]; then - output="$output.exe" - fi - envs=$(platform_to_env $GOOS $GOARCH) - env $envs go build -o $output -tags=gpl -ldflags "$ldflags" -trimpath ./app/cmd/ - if [ $? -ne 0 ]; then - echo "Error: failed to build $GOOS/$GOARCH" - exit 1 - fi + build_for_platform "$platform" "$ldflags" done echo "Build complete."