#!/usr/bin/env bash # Author: cirakg & claude ai # Summary: Compile the watch app for one device: debug, release or unit-test build. # # Usage: build-app.sh debug|release|test DEVICE # Output: build//.prg, and the compiler log next to it. # # Policy (README section 17.7): strict type checking (-l 3), and any compiler # warning fails the build. Test builds add test.jungle, so test code never # reaches debug or release builds; release builds (-r) also drop every # (:debug) declaration, such as the diagnostics in source/util/Diag.mc. set -euo pipefail # shellcheck source=ciq-env.sh source "$(dirname "${BASH_SOURCE[0]}")/ciq-env.sh" mode="${1:?usage: build-app.sh debug|release|test DEVICE}" device="${2:?usage: build-app.sh debug|release|test DEVICE}" ciq_require_sdk ciq_require_key ciq_require_device "${device}" # icons.jungle (generated by tools/make_icon.py --all) gives every device a # launcher icon of exactly its size. jungles="/work/monkey.jungle;/work/icons.jungle" args=(-d "${device}" -y "${DEV_KEY}" -l 3 -w) case "${mode}" in debug) ;; release) args+=(-r) ;; test) jungles="${jungles};/work/test.jungle" args+=(-t) ;; *) die "unknown build mode '${mode}' (use debug, release or test)" ;; esac out_dir="${BUILD_DIR}/${mode}" mkdir -p "${out_dir}" compile_log="${out_dir}/${device}.log" if ! monkeyc -f "${jungles}" -o "${out_dir}/${device}.prg" "${args[@]}" >"${compile_log}" 2>&1; then cat "${compile_log}" >&2 die "compile failed for ${device} (${mode} build)" fi if grep -q "^WARNING" "${compile_log}"; then grep "^WARNING" "${compile_log}" >&2 die "compiler warnings for ${device} (${mode} build); warnings count as errors" fi log "built build/${mode}/${device}.prg"