From c187090720cb90aba83512c501d29fbd7c011d7e Mon Sep 17 00:00:00 2001 From: MatheusMeM Date: Wed, 9 Sep 2026 04:01:29 -0300 Subject: [PATCH] R8: spellcore estatico para Pi (musl) e corte da leg arm do Python Leg aarch64-unknown-linux-musl na matriz do spellcore, no proprio runner arm: nenhuma dep do workspace tem codigo C, entao basta rustup target add. O CI so aceita o artefato spellcore-linux-aarch64-static se o ELF nao tiver NEEDED. A leg ubuntu-24.04-arm da matriz Python sai: build_lite.sh empacota so .py, shows e profiles, e o tarball do arm era byte a byte o do x64. --- .github/workflows/build.yml | 39 ++++++++++++++++++++++++++++++------- INSTALL.md | 15 ++++++++++++-- ROADMAP.md | 6 +++--- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 920f6ae..52f5ccb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,8 +14,10 @@ jobs: python: strategy: fail-fast: false + # ponytail: sem leg arm ; build_lite.sh empacota so .py + shows + profiles, o tarball do + # arm sai byte a byte igual ao do x64 (e colidia no merge do release) matrix: - os: [windows-latest, ubuntu-latest, ubuntu-24.04-arm] + os: [windows-latest, ubuntu-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 @@ -66,41 +68,64 @@ jobs: - os: ubuntu-24.04-arm bin: spellcore name: spellcore-linux-aarch64 + # Pi aarch64 estatico (PRD 6). O runner ja e' aarch64: musl e' so mais um target do + # rustup, sem cross nem zigbuild. Nenhuma dep do workspace tem codigo C (Helios e' stub + # sem rusb), entao o musl-libc que vem com o std basta. + - os: ubuntu-24.04-arm + bin: spellcore + name: spellcore-linux-aarch64-static + target: aarch64-unknown-linux-musl runs-on: ${{ matrix.os }} env: CARGO_TERM_COLOR: always + T: ${{ matrix.target && format('--target {0}', matrix.target) || '' }} + REL: target/${{ matrix.target && format('{0}/', matrix.target) || '' }}release steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: components: clippy + - name: target musl + if: matrix.target + run: rustup target add ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 with: workspaces: spellcore + key: ${{ matrix.name }} - name: clippy working-directory: spellcore - run: cargo clippy --workspace --all-targets -- -D warnings + run: cargo clippy --workspace --all-targets ${{ env.T }} -- -D warnings - name: testes (inclui conformidade byte a byte com os fixtures) working-directory: spellcore - run: cargo test --workspace + run: cargo test --workspace ${{ env.T }} - name: release working-directory: spellcore - run: cargo build --release --workspace + run: cargo build --release --workspace ${{ env.T }} + + - name: confirma que o binario e' estatico + if: matrix.target + shell: bash + working-directory: spellcore + run: | + B="${{ env.REL }}/${{ matrix.bin }}" + file "$B" + ls -l "$B" + if readelf -d "$B" | grep -q NEEDED; then echo "tem dependencia dinamica"; exit 1; fi - name: bench como gate (jitter e throughput) # ponytail: runner compartilhado tem ruido, aqui so reporta ; tirar continue-on-error em runner self-hosted continue-on-error: true working-directory: spellcore run: | - ./target/release/jitter --secs 5 - ./target/release/throughput + ./${{ env.REL }}/jitter --secs 5 + ./${{ env.REL }}/throughput - name: renomeia o binario shell: bash - run: cp "spellcore/target/release/${{ matrix.bin }}" "${{ runner.temp }}/${{ matrix.name }}" + run: cp "spellcore/${{ env.REL }}/${{ matrix.bin }}" "${{ runner.temp }}/${{ matrix.name }}" - uses: actions/upload-artifact@v4 with: diff --git a/INSTALL.md b/INSTALL.md index b7726dc..1ca2e08 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -41,8 +41,19 @@ O serviço `spellcaster` sobe `spell serve`; a GUI fica em `http://.lo para quem tiver navegador na rede. `install.sh ` muda a pasta. Tarball `--no-gui` é o mesmo pacote sem os assets da GUI. -Binário Rust para o Pi: `spellcore-linux-aarch64` do release (glibc; o build estático musl é -pendência do R8). +Binário Rust para o Pi, dois no release: + +- `spellcore-linux-aarch64-static` — musl, sem `NEEDED` no ELF: roda em qualquer Raspberry Pi OS + aarch64 (ou Alpine, ou container `scratch`) sem depender da versão do glibc. Use este por padrão. +- `spellcore-linux-aarch64` — glibc, para o caso de precisar de algo do sistema em runtime. + +```bash +chmod +x spellcore-linux-aarch64-static +./spellcore-linux-aarch64-static play shows/medgrupo.spell --osc-port 9000 +``` + +Fora do binário estático: o Helios (USB) já é stub no `laser` em qualquer build — não é limitação +do musl. ## 3. A partir do código-fonte (desenvolvimento) diff --git a/ROADMAP.md b/ROADMAP.md index e6334c0..f01861f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -153,7 +153,7 @@ O plano acima (F0–F7) foi o do protótipo Python e está concluído até F6. O | R5 GUI Tauri | show de 3 min do zero; Face em modo performance | pendente | voto das rodadas 5 e 6 do design | | R6 previz Godot | 60 fps, 64 fixtures, 2 LED walls | pendente | Godot não instalado | | R7 MCP com rmcp | sessão de IA monta e toca um show sem GUI | pendente | nenhum: registry pronto | -| R8 empacotamento | onedir, Linux, Pi estático; CI com bench como gate | parcial | Pi estático (musl) pendente; só CI | +| R8 empacotamento | onedir, Linux, Pi estático; CI com bench como gate | concluída | — | | R9 editores de Face/Graph + painel Agent | operador monta uma Face em 10 min | pendente | depende de R5 | ## 8. Design — rodadas e branches (09/09/2026) @@ -185,11 +185,11 @@ CI, sem tocar no que já está conforme): |---|---|---|---| | R3 pixel mapping | crate `pixelmap` com rayon (wgpu depois), bench Criterion | 100 000 px a 60 Hz < 2 ms | nada | | R7 MCP | crate `mcp` com rmcp (stdio + HTTP), tools do registry, `spellcore mcp install` | sessão de IA escaneia, patcheia, cria timeline e dá play | nada | -| R8 Pi estático | job de CI `aarch64-unknown-linux-musl`, artefato `spellcore-linux-aarch64-static` | binário roda num Pi limpo sem glibc da versão | nada | +| ~~R8 Pi estático~~ | ~~job de CI `aarch64-unknown-linux-musl`, artefato `spellcore-linux-aarch64-static`~~ | feito: leg musl na matriz do `spellcore`, ELF sem `NEEDED` verificado no CI | — | | R5 base | `canvaskit.js` (pan, zoom, seleção, hit-test por bisect, dirty-flag, DPR) + timeline canvas portada do Python | testes headless no Chrome; timeline abre `medgrupo.spell` | nada (design só define o cromo) | | Design | merge das branches de design; rodada 7 | voto do dono | voto das rodadas 5 e 6 | Bloqueadas até instalar SDK (decisão do dono, não de agente): R2 (GStreamer + NDI SDK), R6 (Godot 4). R9 espera R5. -Já feito: F0–F6, R0, R1, R4, CI com release por tag, docs (README, INSTALL, LICENSE, ARCHITECTURE, PRD). +Já feito: F0–F6, R0, R1, R4, R8, CI com release por tag, docs (README, INSTALL, LICENSE, ARCHITECTURE, PRD).