Skip to content

takt4 1.2.0

takt4 1.2.0 #60

Workflow file for this run

name: full
# The whole application, Slint included. Every job builds Slint from scratch through cargo
# (7–25 minutes), so this runs only when something that can affect the UI build changes,
# once a week to catch drift, and on demand. core.yml covers the engine on every push.
#
# This workflow is ENABLED, by the user on 2026-09-14. It had been `disabled_manually` since
# 2026-09-04, which meant a UI change was covered by nothing: core.yml builds with the UI off
# and does not compile a line of src/ui/. That was noticed while releasing 0.9.6 — a release
# whose every changed file was under src/ui/ — and the answer was to turn this back on rather
# than to keep dispatching it by hand and forgetting to.
#
# WINDOWS ONLY, by the user, 2026-09-06 — the same ruling core.yml carries: it used to cost
# ≈150 billable minutes because macOS is billed at 10× and Slint takes 7–25 minutes to
# build. The macOS and Linux app entries are commented out rather than deleted so bringing
# them back is uncommenting — but bring them back knowing what they used to cost.
#
# **Plus the sanitizers, on every push the path filter below lets through (every push that
# touches the code), by the user on 2026-09-23** (the audit's T4, which
# found that neither had ever run in CI and that `linux-tsan` had never run anywhere):
# AddressSanitizer over the whole tree, the UI included, on Windows; and ThreadSanitizer on
# Linux, because there is no ThreadSanitizer for Windows at all. takt4's threads — the audio
# callback, the model, the tracker, the output thread, the UI, the OSC and MIDI listeners
# and Link's own — are the reason. The cost was put to the user and accepted.
#
# The path filter covers everything that can change the app (the audit found src/core,
# tests/ui, tests/CMakeLists.txt, assets and tools/embed_asset.py all missing from it, so a
# change there went unbuilt until the Monday run; and the audit of 2026-09-25, B4, the Rust
# pin, which is the compiler Slint is built with, and LICENSE and THIRD-PARTY-NOTICES.txt,
# which are embedded in takt4.exe). Documentation alone does not trigger it.
#
# Note the concurrency group below cancels in-progress runs for the same ref: a second push
# to main while this is building kills the first run rather than queueing behind it.
on:
push:
branches: [main]
paths:
- 'src/**'
- 'tests/**'
- 'assets/**'
- 'third_party/**'
- 'cmake/**'
- 'CMakeLists.txt'
- 'CMakePresets.json'
- 'tools/embed_asset.py'
- 'rust-toolchain.toml'
- 'LICENSE'
- 'THIRD-PARTY-NOTICES.txt'
- '.github/workflows/full.yml'
pull_request:
paths:
- 'src/**'
- 'tests/**'
- 'assets/**'
- 'third_party/**'
- 'cmake/**'
- 'CMakeLists.txt'
- 'CMakePresets.json'
- 'tools/embed_asset.py'
- 'rust-toolchain.toml'
- 'LICENSE'
- 'THIRD-PARTY-NOTICES.txt'
- '.github/workflows/full.yml'
schedule:
- cron: '0 6 * * 1' # Mondays, 06:00 UTC
workflow_dispatch:
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
defaults:
run:
shell: bash
jobs:
build:
name: ${{ matrix.preset }}
runs-on: ${{ matrix.os }}
# The ASan job builds the whole tree instrumented and runs every test under it.
timeout-minutes: 180
strategy:
fail-fast: false
matrix:
include:
# The hosted Windows images (windows-latest and windows-2025 alike, as of the
# 2026-08-24 image) ship Visual Studio 2026 only. The preset names no
# generator, so CMake picks whatever Visual Studio is installed.
- os: windows-latest
preset: windows-msvc
app: build/windows-msvc/bin/Release/takt4.exe
cli: build/windows-msvc/bin/Release/takt4-cli.exe
# AddressSanitizer over everything, UI included. cmake/sanitizers.cmake copies the
# ASan runtime DLL beside the binaries, so they start without Visual Studio's PATH.
- os: windows-latest
preset: windows-asan
app: build/windows-asan/bin/Release/takt4.exe
cli: build/windows-asan/bin/Release/takt4-cli.exe
# ThreadSanitizer: Linux is where it exists. TSAN_OPTIONS makes a report fail the
# test that produced it rather than scroll past in a passing run.
- os: ubuntu-24.04
preset: linux-tsan
app: build/linux-tsan/bin/takt4
cli: build/linux-tsan/bin/takt4-cli
# Windows only for now; see the note at the top of this file.
# - os: macos-latest
# preset: macos
# app: build/macos/bin/takt4
# cli: build/macos/bin/takt4-cli
# - os: ubuntu-24.04
# preset: linux
# app: build/linux/bin/takt4
# cli: build/linux/bin/takt4-cli
steps:
- uses: actions/checkout@v7
with:
submodules: recursive
- name: Install Linux packages
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
pkg-config libasound2-dev libjack-jackd2-dev libfontconfig-dev libfreetype-dev
# The hosted images ship CMake, Ninja and a Rust toolchain that satisfy the
# requirements in README.md. Record what was actually used.
- name: Toolchain versions
run: |
cmake --version
ninja --version || true
rustc --version || true
cargo --version || true
- name: Configure
run: cmake --preset ${{ matrix.preset }}
# Linux goes on past the first error (Ninja's -k 0), so a run reports every file GCC
# refuses rather than one per run: GCC warns about things MSVC does not, and this tree
# builds with warnings as errors.
- name: Build
run: cmake --build --preset ${{ matrix.preset }} --parallel ${{ runner.os == 'Linux' && '-- -k 0' || '' }}
# `-all`: a runner has no show on it to disturb, so it runs the [network] and [hardware]
# tests the default presets leave out on a rig (the audit's T2).
- name: Test
env:
TSAN_OPTIONS: halt_on_error=1:second_deadlock_stack=1
run: ctest --preset ${{ matrix.preset }}-all
- name: Version banner
run: ${{ matrix.app }} --version
- name: Console tool
run: |
${{ matrix.cli }} --version
${{ matrix.cli }} devices