02eaf654d5
User : "pourquoi en brew ? pourquoi ne pas les inclures dans le build ?". Le DMG embarque maintenant TOUT — l'utilisateur n'a plus rien à installer manuellement : - SuperCollider.app 3.14 universel (~150 MB, téléchargé depuis github.com/supercollider releases puis copié depuis le .dmg monté + démonté) - node-v20.18.0-darwin-arm64 binary (~70 MB) standalone dans payload/runtime/ - libusb-1.0.0.dylib bundled dans oscope-of.app/Contents/ Frameworks/ avec install_name_tool -change pour le retrouver via @executable_path/../Frameworks/libusb-1.0.0.dylib DMG attendu ~250 MB au lieu de 10 MB. Mais entièrement autonome : drag & drop, premier lancement, ça tourne. INSTALL.txt + release notes mis à jour pour indiquer "tout-inclus, rien à installer en plus".
232 lines
9.0 KiB
YAML
232 lines
9.0 KiB
YAML
name: Build & Release macOS .dmg
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
workflow_dispatch: # bouton manuel dans l'UI GitHub
|
|
|
|
permissions:
|
|
contents: write # nécessaire pour créer/upload les releases
|
|
|
|
jobs:
|
|
build-mac:
|
|
runs-on: macos-14 # Apple Silicon (arm64)
|
|
timeout-minutes: 60
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Setup Xcode
|
|
uses: maxim-lobanov/setup-xcode@v1
|
|
with:
|
|
xcode-version: latest-stable
|
|
|
|
- name: Install build dependencies (libusb + create-dmg)
|
|
run: |
|
|
brew install libusb create-dmg
|
|
|
|
- name: Download SuperCollider 3.14
|
|
run: |
|
|
mkdir -p ~/sc-dl
|
|
curl -sL --max-time 300 -o ~/sc-dl/sc.dmg \
|
|
https://github.com/supercollider/supercollider/releases/download/Version-3.14.0/SuperCollider-3.14.0-macOS-universal.dmg
|
|
ls -lh ~/sc-dl/sc.dmg
|
|
hdiutil attach -nobrowse -quiet ~/sc-dl/sc.dmg
|
|
ls /Volumes/ | head -5
|
|
# Le volume s'appelle "SuperCollider 3.14.0" ou similaire
|
|
SC_VOL=$(ls /Volumes | grep -i SuperCollider | head -1)
|
|
mkdir -p ~/sc-extracted
|
|
cp -R "/Volumes/$SC_VOL/SuperCollider.app" ~/sc-extracted/
|
|
hdiutil detach "/Volumes/$SC_VOL" -quiet
|
|
ls -lh ~/sc-extracted/SuperCollider.app/Contents/MacOS/
|
|
|
|
- name: Download Node.js 20
|
|
run: |
|
|
mkdir -p ~/node-dl
|
|
curl -sL --max-time 120 -o ~/node-dl/node.tar.gz \
|
|
https://nodejs.org/dist/v20.18.0/node-v20.18.0-darwin-arm64.tar.gz
|
|
cd ~/node-dl
|
|
tar xzf node.tar.gz
|
|
ls -la node-v20.18.0-darwin-arm64/bin/node
|
|
|
|
- name: Cache openFrameworks
|
|
id: cache-of
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/of
|
|
key: of-0.12.1-macos-${{ runner.arch }}
|
|
|
|
- name: Download openFrameworks 0.12.1
|
|
if: steps.cache-of.outputs.cache-hit != 'true'
|
|
run: |
|
|
cd ~
|
|
curl -sL -o of.tar.gz https://github.com/openframeworks/openFrameworks/releases/download/0.12.1/of_v0.12.1_osx_release.tar.gz
|
|
tar xzf of.tar.gz
|
|
mv of_v0.12.1_osx_release of
|
|
rm of.tar.gz
|
|
|
|
- name: Symlink oscope-of into oF tree
|
|
run: |
|
|
ln -sf "$GITHUB_WORKSPACE/oscope-of" ~/of/apps/myApps/oscope-of
|
|
|
|
- name: Build oscope-of (Release)
|
|
run: |
|
|
cd ~/of/apps/myApps/oscope-of
|
|
make OF_ROOT=$HOME/of -j4 Release
|
|
|
|
- name: Build launcher (universal)
|
|
run: |
|
|
cd launcher
|
|
chmod +x build.sh 2>/dev/null || true
|
|
if [ -f build.sh ]; then
|
|
bash build.sh || true
|
|
else
|
|
xcodebuild -scheme AVLiveLauncher -configuration Release \
|
|
-destination 'platform=macOS' \
|
|
-derivedDataPath build ARCHS='arm64 x86_64' || true
|
|
fi
|
|
ls -la build/ 2>/dev/null || true
|
|
|
|
- name: Verify binary
|
|
run: |
|
|
ls -la "$GITHUB_WORKSPACE/oscope-of/bin/oscope-of.app/Contents/MacOS/" || true
|
|
file "$GITHUB_WORKSPACE/oscope-of/bin/oscope-of.app/Contents/MacOS/oscope-of" || true
|
|
|
|
- name: Bundle libusb into oscope-of.app + data/
|
|
run: |
|
|
cd "$GITHUB_WORKSPACE/oscope-of/bin"
|
|
mkdir -p oscope-of.app/Contents/Frameworks oscope-of.app/Contents/Resources
|
|
# Copie data/ dans Resources
|
|
cp -r data oscope-of.app/Contents/Resources/
|
|
# Embarque libusb dans Frameworks et réécrit le rpath
|
|
BIN=oscope-of.app/Contents/MacOS/oscope-of
|
|
# Trouve le chemin du libusb actuellement linké
|
|
OLD_LIB=$(otool -L "$BIN" | awk '/libusb/{print $1; exit}')
|
|
if [ -n "$OLD_LIB" ] && [ -f "$OLD_LIB" ]; then
|
|
cp -L "$OLD_LIB" oscope-of.app/Contents/Frameworks/libusb-1.0.0.dylib
|
|
install_name_tool -change "$OLD_LIB" \
|
|
"@executable_path/../Frameworks/libusb-1.0.0.dylib" "$BIN"
|
|
echo "libusb bundled : $OLD_LIB → @executable_path/.."
|
|
otool -L "$BIN" | head -10
|
|
else
|
|
echo "warning: libusb not found in linker output"
|
|
otool -L "$BIN" | head -10
|
|
fi
|
|
|
|
- name: Stage DMG payload
|
|
run: |
|
|
cd "$GITHUB_WORKSPACE"
|
|
mkdir -p dist payload
|
|
# 1. oscope-of.app (visualizer)
|
|
cp -R oscope-of/bin/oscope-of.app payload/
|
|
# 2. AVLiveLauncher.app si build OK
|
|
if [ -d launcher/build/Release/AVLiveLauncher.app ]; then
|
|
cp -R launcher/build/Release/AVLiveLauncher.app payload/
|
|
elif [ -d launcher/build/Build/Products/Release/AVLiveLauncher.app ]; then
|
|
cp -R launcher/build/Build/Products/Release/AVLiveLauncher.app payload/
|
|
fi
|
|
# 3. sound_algo source (pour sclang)
|
|
cp -R sound_algo payload/
|
|
# 4. SuperCollider.app bundled
|
|
cp -R ~/sc-extracted/SuperCollider.app payload/
|
|
# 5. node binary standalone (~70 MB)
|
|
mkdir -p payload/runtime
|
|
cp ~/node-dl/node-v20.18.0-darwin-arm64/bin/node payload/runtime/node
|
|
chmod +x payload/runtime/node
|
|
# 6. INSTALL.txt avec prérequis et marche à suivre
|
|
cat > payload/INSTALL.txt <<'EOF'
|
|
AV-Live ${{ github.ref_name }} — DMG TOUT-INCLUS
|
|
================================================
|
|
|
|
Ce paquet contient TOUT le nécessaire (rien à installer en plus) :
|
|
- oscope-of.app visualizer (libusb bundled)
|
|
- AVLiveLauncher.app menubar coordinateur
|
|
- SuperCollider.app moteur audio 3.14 universel
|
|
- sound_algo/ 1099 SynthDef + 345 tracks
|
|
- runtime/node Node.js 20 standalone pour web UI
|
|
- INSTALL.txt ce fichier
|
|
|
|
INSTALLATION :
|
|
1. Glissez le contenu du DMG dans un dossier (ex: ~/AV-Live/)
|
|
ou directement dans /Applications pour les .app
|
|
2. Premier lancement : clic-droit sur l'app > Ouvrir
|
|
(Gatekeeper unsigned, normal pour binaire open-source)
|
|
3. AVLiveLauncher démarre tout automatiquement :
|
|
sclang (moteur audio) + oscope-of (visu) + node (web :3000)
|
|
|
|
UTILISATION :
|
|
Touches 1-9, 0 -> 10 demoparties principales
|
|
Touches F6-F10 -> 5 demoparties additionnelles
|
|
Touche q / Esc -> mode live (sphere wave 3D)
|
|
Touches azertyuiop -> 10 backgrounds scènes
|
|
Touches s d f g h... -> 17 paramètres FX live
|
|
Flèches haut/bas -> ajuste valeur paramètre sélectionné
|
|
|
|
Hantek 6022BL (oscilloscope USB) supporté en option pour piloter
|
|
la visualisation depuis l'audio physique. Sans le scope, oscope-of
|
|
tourne quand même avec le signal OSC depuis sclang.
|
|
|
|
Documentation : https://github.com/electron-rare/AV-Live
|
|
EOF
|
|
|
|
create-dmg \
|
|
--volname "AV-Live ${{ github.ref_name }}" \
|
|
--window-pos 200 120 \
|
|
--window-size 700 480 \
|
|
--icon-size 90 \
|
|
--icon "oscope-of.app" 130 180 \
|
|
--icon "AVLiveLauncher.app" 280 180 \
|
|
--icon "sound_algo" 430 180 \
|
|
--icon "INSTALL.txt" 580 180 \
|
|
--app-drop-link 350 360 \
|
|
"dist/AV-Live-${{ github.ref_name }}.dmg" \
|
|
payload/ \
|
|
|| true
|
|
# Fallback tar.gz si create-dmg fail
|
|
if [ ! -f "dist/AV-Live-${{ github.ref_name }}.dmg" ]; then
|
|
tar czf "dist/AV-Live-${{ github.ref_name }}.tar.gz" -C payload .
|
|
fi
|
|
ls -la dist/ payload/
|
|
|
|
- name: Upload artifact
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: AV-Live-macOS
|
|
path: dist/*
|
|
|
|
- name: Create GitHub Release
|
|
if: startsWith(github.ref, 'refs/tags/v')
|
|
uses: softprops/action-gh-release@v2
|
|
with:
|
|
files: dist/*
|
|
generate_release_notes: true
|
|
body: |
|
|
# AV-Live ${{ github.ref_name }} — DMG tout-inclus
|
|
|
|
Build automatique macOS (Apple Silicon). **Aucune dépendance à
|
|
installer**, tout est bundlé dans le DMG.
|
|
|
|
## Contenu
|
|
|
|
- `oscope-of.app` — visualizer (41 bg, 15 demoparties, 35 modèles 3D, libusb bundled)
|
|
- `AVLiveLauncher.app` — menubar coordinateur
|
|
- `SuperCollider.app` — moteur audio 3.14 universel
|
|
- `sound_algo/` — 1099 SynthDef + 345 tracks SC
|
|
- `runtime/node` — Node.js 20 standalone
|
|
- `INSTALL.txt`
|
|
|
|
## Installation
|
|
|
|
1. Téléchargez `AV-Live-${{ github.ref_name }}.dmg`
|
|
2. Glissez le contenu dans `~/AV-Live/` ou `/Applications`
|
|
3. **Premier lancement** : clic-droit sur l'app > Ouvrir (Gatekeeper non signé)
|
|
4. AVLiveLauncher démarre tout automatiquement
|
|
|
|
**Note** : binaires non signés Apple Developer. Avertissement Gatekeeper attendu, c'est normal.
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|