parent
ae122d5b3e
commit
d33d633ba2
@ -0,0 +1,135 @@
|
|||||||
|
#!/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
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
package m9zApi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"tgk-touch/internal/library/m9z"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestApplySolarTaskTime(t *testing.T) {
|
||||||
|
sunrise := time.Date(2026, 8, 21, 5, 32, 0, 0, time.Local)
|
||||||
|
sunset := time.Date(2026, 8, 21, 18, 41, 0, 0, time.Local)
|
||||||
|
sunTimes := &m9z.SunTimes{Sunrise: sunrise, Sunset: sunset}
|
||||||
|
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
apply func(*m9z.ControlTask, *m9z.SunTimes)
|
||||||
|
want time.Time
|
||||||
|
}{
|
||||||
|
{name: "start task uses sunset", apply: applyStartTaskSolarTime, want: sunset},
|
||||||
|
{name: "stop task uses sunrise", apply: applyStopTaskSolarTime, want: sunrise},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
task := &m9z.ControlTask{TimeType: 1}
|
||||||
|
tt.apply(task, sunTimes)
|
||||||
|
if !task.ExecTime.Equal(tt.want) {
|
||||||
|
t.Fatalf("ExecTime = %v, want %v", task.ExecTime, tt.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestApplySolarTaskTimeKeepsScheduledTime(t *testing.T) {
|
||||||
|
scheduled := time.Date(2026, 8, 21, 20, 0, 0, 0, time.Local)
|
||||||
|
task := &m9z.ControlTask{TimeType: 0, ExecTime: scheduled}
|
||||||
|
sunTimes := &m9z.SunTimes{
|
||||||
|
Sunrise: scheduled.Add(-14 * time.Hour),
|
||||||
|
Sunset: scheduled.Add(-time.Hour),
|
||||||
|
}
|
||||||
|
|
||||||
|
applyStartTaskSolarTime(task, sunTimes)
|
||||||
|
applyStopTaskSolarTime(task, sunTimes)
|
||||||
|
|
||||||
|
if !task.ExecTime.Equal(scheduled) {
|
||||||
|
t.Fatalf("ExecTime = %v, want scheduled time %v", task.ExecTime, scheduled)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in new issue