You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.5 KiB
136 lines
3.5 KiB
#!/usr/bin/env bash
|
|
|
|
set -Eeuo pipefail
|
|
|
|
app_name="m9zCtrlTty"
|
|
app_package="./apps/m9zCtrlTty"
|
|
script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
|
|
repo_root="$(cd -- "${script_dir}/../.." && pwd)"
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Usage:
|
|
./apps/m9zCtrlTty/build.sh <goos> <goarch> [goarm]
|
|
|
|
Examples:
|
|
./apps/m9zCtrlTty/build.sh linux arm 7
|
|
./apps/m9zCtrlTty/build.sh linux arm64
|
|
./apps/m9zCtrlTty/build.sh windows amd64
|
|
./apps/m9zCtrlTty/build.sh darwin arm64
|
|
|
|
Arguments:
|
|
goos Target operating system accepted by "go tool dist list".
|
|
goarch Target CPU architecture accepted by "go tool dist list".
|
|
goarm ARM generation for 32-bit GOARCH=arm: 5, 6, or 7 (default: 7).
|
|
Soft-float targets may use 5,softfloat, 6,softfloat, or 7,softfloat.
|
|
|
|
Environment variables:
|
|
OUTPUT_ROOT Output root directory (default: dist).
|
|
CGO_ENABLED CGO mode (default: 0 for cross-compilation).
|
|
BUILD_TAGS Optional Go build tags.
|
|
BUILD_LDFLAGS Go linker flags (default: -s -w; set to an empty value to keep symbols).
|
|
EOF
|
|
}
|
|
|
|
if [[ $# -lt 2 || $# -gt 3 ]]; then
|
|
usage >&2
|
|
exit 2
|
|
fi
|
|
|
|
if ! command -v go >/dev/null 2>&1; then
|
|
printf 'Go toolchain was not found in PATH.\n' >&2
|
|
exit 127
|
|
fi
|
|
|
|
target_os="$1"
|
|
target_arch="$2"
|
|
target_pair="${target_os}/${target_arch}"
|
|
|
|
supported_target=false
|
|
while IFS= read -r candidate; do
|
|
if [[ "$candidate" == "$target_pair" ]]; then
|
|
supported_target=true
|
|
break
|
|
fi
|
|
done < <(go tool dist list)
|
|
|
|
if [[ "$supported_target" != true ]]; then
|
|
printf 'Unsupported Go build target: %s\n' "$target_pair" >&2
|
|
printf 'Run "go tool dist list" to see supported targets.\n' >&2
|
|
exit 2
|
|
fi
|
|
|
|
arch_label="$target_arch"
|
|
if [[ "$target_arch" == "arm" ]]; then
|
|
target_goarm="${3:-${GOARM:-7}}"
|
|
case "$target_goarm" in
|
|
5|6|7|5,softfloat|6,softfloat|7,softfloat) ;;
|
|
*)
|
|
printf 'Invalid GOARM value: %s\n' "$target_goarm" >&2
|
|
exit 2
|
|
;;
|
|
esac
|
|
export GOARM="$target_goarm"
|
|
arm_generation="${target_goarm%%,*}"
|
|
arch_label="armv${arm_generation}"
|
|
if [[ "$target_goarm" == *,softfloat ]]; then
|
|
arch_label="${arch_label}-softfloat"
|
|
fi
|
|
elif [[ $# -eq 3 ]]; then
|
|
printf 'The third argument (goarm) is only valid when GOARCH=arm.\n' >&2
|
|
exit 2
|
|
fi
|
|
|
|
output_root="${OUTPUT_ROOT:-dist}"
|
|
if [[ "$output_root" != /* ]]; then
|
|
output_root="${repo_root}/${output_root}"
|
|
fi
|
|
output_dir="${output_root}/${target_os}-${arch_label}"
|
|
|
|
extension=""
|
|
case "$target_os" in
|
|
windows) extension=".exe" ;;
|
|
js|wasip1)
|
|
if [[ "$target_arch" == "wasm" ]]; then
|
|
extension=".wasm"
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
output_path="${output_dir}/${app_name}${extension}"
|
|
mkdir -p "$output_dir"
|
|
|
|
export GOOS="$target_os"
|
|
export GOARCH="$target_arch"
|
|
export CGO_ENABLED="${CGO_ENABLED:-0}"
|
|
|
|
if [[ "${BUILD_LDFLAGS+x}" == "x" ]]; then
|
|
build_ldflags="$BUILD_LDFLAGS"
|
|
else
|
|
build_ldflags="-s -w"
|
|
fi
|
|
|
|
build_args=(build -mod=readonly -trimpath -o "$output_path")
|
|
if [[ -n "${BUILD_TAGS:-}" ]]; then
|
|
build_args+=(-tags "$BUILD_TAGS")
|
|
fi
|
|
if [[ -n "$build_ldflags" ]]; then
|
|
build_args+=(-ldflags "$build_ldflags")
|
|
fi
|
|
build_args+=("$app_package")
|
|
|
|
printf 'Building %s for %s (CGO_ENABLED=%s)\n' "$app_name" "$target_pair" "$CGO_ENABLED"
|
|
if [[ "$target_arch" == "arm" ]]; then
|
|
printf 'Using GOARM=%s\n' "$GOARM"
|
|
fi
|
|
|
|
(
|
|
cd "$repo_root"
|
|
go "${build_args[@]}"
|
|
)
|
|
|
|
printf 'Build complete: %s\n' "$output_path"
|
|
if command -v file >/dev/null 2>&1; then
|
|
file "$output_path"
|
|
fi
|