#!/usr/bin/env bash set -euo pipefail PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" BUILD_VERSION="1.0.1" MIN_GO_MAJOR=1 MIN_GO_MINOR=22 DIST_DIR="$PROJECT_DIR/dist" VENDOR_SOURCE="$PROJECT_DIR/../card-read-service/package/DWCardReaderDLL" VENDOR_DLL="$VENDOR_SOURCE/CardReaderDLL.dll" cd "$PROJECT_DIR" fail() { printf '\n[ERROR] %s\n' "$1" >&2 exit 1 } printf '%s\n' "========================================" printf '%s\n' "Checking readcard-go packaging environment..." printf 'Version: %s\n' "$BUILD_VERSION" printf '%s\n\n' "========================================" command -v go >/dev/null 2>&1 || fail \ "Go was not found in PATH. Install Go $MIN_GO_MAJOR.$MIN_GO_MINOR or later from https://go.dev/dl/" GO_VERSION_RAW="$(go env GOVERSION 2>/dev/null || true)" case "$GO_VERSION_RAW" in go[0-9]*.[0-9]*) ;; *) fail "Unable to parse the installed Go version: ${GO_VERSION_RAW:-unknown}" ;; esac GO_VERSION="${GO_VERSION_RAW#go}" GO_MAJOR="${GO_VERSION%%.*}" GO_REMAINDER="${GO_VERSION#*.}" GO_MINOR="${GO_REMAINDER%%.*}" case "$GO_MAJOR:$GO_MINOR" in *[!0-9:]*|:*|*:) fail "Unable to parse the installed Go version: $GO_VERSION_RAW" ;; esac if [ "$GO_MAJOR" -lt "$MIN_GO_MAJOR" ] || \ { [ "$GO_MAJOR" -eq "$MIN_GO_MAJOR" ] && [ "$GO_MINOR" -lt "$MIN_GO_MINOR" ]; }; then fail "Go $GO_VERSION_RAW is too old. Install Go $MIN_GO_MAJOR.$MIN_GO_MINOR or later from https://go.dev/dl/" fi printf '[OK] Go: %s\n' "$GO_VERSION_RAW" if ! go tool dist list 2>/dev/null | grep -x "windows/386" >/dev/null; then fail "The installed Go toolchain does not support windows/386." fi printf '%s\n' "[OK] Go target: windows/386" [ -f "$PROJECT_DIR/go.mod" ] || fail "Missing Go module file: $PROJECT_DIR/go.mod" printf '%s\n' "[OK] Go module file" [ -f "$PROJECT_DIR/config.json" ] || fail "Missing configuration file: $PROJECT_DIR/config.json" printf '%s\n' "[OK] Configuration file" [ -f "$PROJECT_DIR/readcard-go.exe.manifest" ] || fail \ "Missing Windows application manifest: $PROJECT_DIR/readcard-go.exe.manifest" printf '%s\n' "[OK] Windows application manifest" [ -f "$PROJECT_DIR/rsrc_windows_386.syso" ] || fail \ "Missing embedded Windows resource: $PROJECT_DIR/rsrc_windows_386.syso" printf '%s\n' "[OK] Embedded Windows resource" [ -f "$VENDOR_DLL" ] || fail \ "Vendor DLL was not found: $VENDOR_DLL. Restore card-read-service/package/DWCardReaderDLL before packaging." printf '%s\n' "[OK] Vendor DLL package" if [ "${1:-}" = "--check" ]; then printf '\n%s\n' "Environment check passed." exit 0 fi TMP_BUILD_DIR="$(mktemp -d "${TMPDIR:-/tmp}/readcard-go-build.XXXXXX")" cleanup() { rm -rf -- "$TMP_BUILD_DIR" } trap cleanup EXIT INT TERM printf '\n%s\n\n' "Environment check passed. Packaging readcard-go, please wait..." printf '%s\n' "Compiling Windows x86 tests..." GOOS=windows GOARCH=386 CGO_ENABLED=0 \ go test -c -buildvcs=false -o "$TMP_BUILD_DIR/readcard-go.test.exe" . printf '%s\n' "Building Windows x86 executable..." GOOS=windows GOARCH=386 CGO_ENABLED=0 \ go build \ -buildvcs=false \ -trimpath \ -ldflags "-s -w -H windowsgui -X main.version=$BUILD_VERSION" \ -o "$TMP_BUILD_DIR/readcard-go.exe" \ . mkdir -p "$DIST_DIR/package" cp "$TMP_BUILD_DIR/readcard-go.exe" "$DIST_DIR/readcard-go.exe" cp "$PROJECT_DIR/config.json" "$DIST_DIR/config.json" cp -R "$VENDOR_SOURCE" "$TMP_BUILD_DIR/DWCardReaderDLL" VENDOR_TARGET="$DIST_DIR/package/DWCardReaderDLL" case "$VENDOR_TARGET" in "$DIST_DIR"/*) ;; *) fail "Unexpected vendor target path: $VENDOR_TARGET" ;; esac rm -rf -- "$VENDOR_TARGET" mv "$TMP_BUILD_DIR/DWCardReaderDLL" "$VENDOR_TARGET" printf '\n%s\n' "========================================" printf '%s\n' "Packaging completed successfully." printf 'Output directory: %s\n' "$DIST_DIR" printf '%s\n' "========================================" if [ "$(uname -s)" = "Darwin" ] && command -v open >/dev/null 2>&1; then open "$DIST_DIR" >/dev/null 2>&1 || true fi