tally/.mise.toml
2026-10-04 08:34:17 -07:00

86 lines
3.8 KiB
TOML

[tools]
zig = "0.16.0"
zls = "0.16.0"
"github:j178/prek" = "0.4.1"
# Android. Not installed by default on a machine that only builds the CLI and TUI: run
# `mise install` in this directory to pull them when working on the app.
#
# `mise install` is necessary but not sufficient. It provides these four tools; the SDK
# packages they need are downloaded by `sdkmanager` into the android-sdk install
# directory, where mise does not track them - so they survive nothing and are reproduced
# by the tasks below rather than by this table. No NDK: the native library is built by Zig
# without one, and the JNI glue is hand-written (design 6.2, 6.4). See android/SETUP.md.
java = "temurin-21"
gradle = "8.14.5"
android-sdk = "23.0"
[tools."github:DonIsaac/zlint"]
version = "0.9.0"
# -- Android SDK packages --
#
# The versioned ones are pinned; `platform-tools` and `emulator` have no version in their
# package id and always resolve to current, which is the one thing here that is not
# reproducible. Both tasks are idempotent: an already-installed package is a no-op.
[tasks.android-sdk]
description = "Install the SDK packages needed to build the app (~450MB)"
run = 'sdkmanager "platform-tools" "platforms;android-35" "build-tools;35.0.0"'
[tasks.android-emulator]
description = "Install the emulator and a 16KB-page system image (~4.6GB)"
run = 'sdkmanager "emulator" "system-images;android-35;google_apis_ps16k;x86_64"'
[tasks.android-avd]
description = "Create the tally35 AVD in .tmp/avd - recreating it wipes installed apps"
run = '''
mkdir -p "$MISE_PROJECT_ROOT/.tmp/avd"
ANDROID_AVD_HOME="$MISE_PROJECT_ROOT/.tmp/avd" avdmanager create avd \
--name tally35 --device pixel_6 --force \
--package "system-images;android-35;google_apis_ps16k;x86_64"
'''
[tasks.android-install]
description = "Build the native libs and APK, install on the attached device, launch it"
# Rebuilds the libraries every time on purpose: Gradle never invokes Zig, so skipping
# this step packages a stale libtally.so without complaint.
run = '''
set -e
zig build android
(cd "$MISE_PROJECT_ROOT/android" && gradle --no-daemon assembleDebug)
adb wait-for-device
until [ "$(adb shell getprop sys.boot_completed | tr -d '\r')" = "1" ]; do sleep 2; done
adb install -r "$MISE_PROJECT_ROOT/android/app/build/outputs/apk/debug/app-debug.apk"
adb shell am start -n dev.lerch.tally/.MainActivity
'''
[tasks.android-run]
description = "Boot the tally35 AVD - does not install the app (add -- -no-window for headless)"
run = 'ANDROID_AVD_HOME="$MISE_PROJECT_ROOT/.tmp/avd" emulator -avd tally35 -no-audio -no-boot-anim -gpu swiftshader_indirect'
[tasks.android-audit]
description = "Check the Android libraries define every symbol they use (CI runs this too)"
run = 'zig build android && "$MISE_PROJECT_ROOT/android/audit-libs.sh" "$MISE_PROJECT_ROOT/zig-out/android"'
[tasks.apk-signer-test]
description = "Build a release APK and sign it with the CI's HSM signer (action-hsm-sign), against SoftHSM (needs docker or podman)"
run = '''
set -e
zig build android
(cd "$MISE_PROJECT_ROOT/android" && gradle --no-daemon assembleRelease)
# The signer and its test are action-hsm-sign's: by default at the version the workflow
# uses, or a local checkout named by ACTION_HSM_SIGN.
export TMPDIR="$MISE_PROJECT_ROOT/.tmp"
mkdir -p "$TMPDIR"
action="${ACTION_HSM_SIGN:-}"
if [ -z "$action" ]; then
ref="$(sed -n 's|.*lobo/action-hsm-sign@\([^[:space:]]*\).*|\1|p' "$MISE_PROJECT_ROOT/.forgejo/workflows/build.yaml" | head -n 1)"
[ -n "$ref" ] || { echo "no action-hsm-sign version in .forgejo/workflows/build.yaml" >&2; exit 1; }
action="$TMPDIR/action-hsm-sign"
rm -rf "$action"
git clone -q --depth 1 --branch "$ref" https://git.lerch.org/lobo/action-hsm-sign.git "$action"
fi
"$action/signer/test.sh" \
"$MISE_PROJECT_ROOT/android/app/build/outputs/apk/release/app-release-unsigned.apk"
'''