118 lines
3.9 KiB
Bash
118 lines
3.9 KiB
Bash
#!/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
|