Aller au contenu

Setup macOS — prérequis système

Préparation du MacBook M1 Pro pour développer ArduPilot, MAVProxy, et la glue logicielle. À faire une seule fois au début.

Validé le 2026-05-10 sur macOS Tahoe (Darwin 25.x), MacBook M1 Pro. Toute la stack tient en ~3.3 GB.

Vue d'ensemble

L'idée : on s'appuie au maximum sur le script officiel install-prereqs-mac.sh d'ArduPilot. Il installe pyenv, Python 3.10, la toolchain ARM, et tous les paquets Python (MAVProxy, pymavlink, dronecan, wxPython…). On gère manuellement seulement ce qui n'est pas couvert : Homebrew, le clone du repo, QGC, et Rust.

1. Homebrew

Sur Apple Silicon, Homebrew vit dans /opt/homebrew. Vérifier :

which brew
# attendu : /opt/homebrew/bin/brew

Si absent :

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Suivre l'instruction de fin pour ajouter /opt/homebrew/bin au PATH (~/.zshrc).

2. Xcode Command Line Tools + git

xcode-select --install   # silencieux si déjà installé
git --version            # vérifie

git est inclus dans les CLT.

3. Cloner ArduPilot

mkdir -p ~/Project/bascanada
cd ~/Project/bascanada
git clone --recurse-submodules https://github.com/ArduPilot/ardupilot.git

Compter ~5–10 min selon le débit (le repo + submodules pèse ~1.8 GB).

4. Lancer le script de prérequis

cd ~/Project/bascanada/ardupilot
Tools/environment_install/install-prereqs-mac.sh -y

Le -y accepte automatiquement tous les prompts y/n du script. Le script demande ton password sudo (pour écrire la toolchain ARM dans /opt). Compter ~10–20 min (download + compilation wxPython sur M1).

Ce que le script installe

Catégorie Paquets / artefacts Emplacement
Brew formulas gawk, coreutils, wget, ccache /opt/homebrew
pyenv géré via le script (clone Git) ~/.pyenv
Python 3.10.18 (pinné par ArduPilot) ~/.pyenv/versions/3.10.18
Pip packages pymavlink, MAVProxy, dronecan, pexpect, geocoder, wxPython, intelhex, gnureadline, lxml, matplotlib, empy, flake8, junitparser, setuptools, wheel dans le Python pyenv
Toolchain ARM gcc-arm-none-eabi-10-2020-q4-major (~692 MB) /opt/gcc-arm-none-eabi-10-2020-q4-major
ccache wrappers symlinks arm-none-eabi-gcc/g++ /opt/homebrew/opt/ccache/libexec/

Lignes ajoutées à ~/.zshrc

Le script ajoute (entre autres) :

export PATH=/opt/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH
export PATH=/Users/wq/Project/bascanada/ardupilot/Tools/autotest:$PATH
source /Users/wq/Project/bascanada/ardupilot/Tools/completion/completion.zsh
export PATH=/opt/homebrew/opt/ccache/libexec:$PATH

Important : ces lignes ne sont actives qu'au prochain shell. Ouvrir un nouveau terminal ou faire source ~/.zshrc avant de continuer.

Note sur la version Python

Le script fait pyenv global 3.10.18. Si tu veux garder un autre Python comme global de ton système, isole ArduPilot avec un .python-version dans le repo :

cd ~/Project/bascanada/ardupilot
echo "3.10.18" > .python-version
pyenv global system   # ou ta version préférée

Mais 3.10.18 partout marche très bien et c'est le plus simple.

5. QGroundControl

Pas de Homebrew — DMG officiel :

curl -L -o /tmp/QGroundControl.dmg "https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl.dmg"
hdiutil attach /tmp/QGroundControl.dmg -nobrowse
cp -R /Volumes/QGroundControl/QGroundControl.app /Applications/
hdiutil detach /Volumes/QGroundControl

Le DMG est notarisé Apple Developer ID (vérifié 2026-05-10), donc Gatekeeper l'accepte sans manip. Pour valider :

spctl --assess --verbose /Applications/QGroundControl.app
# attendu : accepted, source=Notarized Developer ID

6. FlightGear (visualiseur 3D, optionnel mais recommandé)

FlightGear sert de fenêtre 3D synchronisée sur SITL — utile pour s'entraîner visuellement et faire des démos. Deux étapes : la cask Homebrew installe l'app, mais FGDATA (~1.88 GB de modèles + scenery de base) doit être bootstrap à part.

6.a — Installer l'app

brew install --cask flightgear

Compter ~270 MB. La cask v2026 pointe sur FlightGear 2024.1.5 (binaire universal x86_64 + arm64). L'app s'installe dans /Applications/FlightGear.app.

Sur macOS le binaire fgfs (Linux) est packagé sous le nom FlightGear dans le .app :

ls /Applications/FlightGear.app/Contents/MacOS/FlightGear
file /Applications/FlightGear.app/Contents/MacOS/FlightGear
# Mach-O universal binary with 2 architectures: [x86_64] [arm64]

Note : FlightGear --version ne retourne rien visible depuis un terminal sur macOS (les bundles .app détachent leur stdout). On valide plutôt par le test SITL.

6.b — Bootstrap FGDATA (1.88 GB)

La cask ne contient PAS les ~1.88 GB de modèles, sons, textures, base d'aéroports, etc. nécessaires pour que FG démarre. Le launcher GUI les télécharge au premier run, mais on préfère le faire en script :

# 1. Télécharger l'archive officielle (1.88 GB compressé)
curl -L -o /tmp/fgdata.txz \
  "https://sourceforge.net/projects/flightgear/files/release-2024.1/FlightGear-2024.1.5-data.txz/download"

# 2. Extraire dans la zone canonique macOS (~2.6 GB décompressé)
mkdir -p "$HOME/Library/Application Support/FlightGear"
tar -xJf /tmp/fgdata.txz -C "$HOME/Library/Application Support/FlightGear"
# Le tarball top-dir = "fgdata_2024_1/" — on renomme en "fgdata"
mv "$HOME/Library/Application Support/FlightGear/fgdata_2024_1" \
   "$HOME/Library/Application Support/FlightGear/fgdata"
rm /tmp/fgdata.txz

# 3. Vérifier la structure
ls "$HOME/Library/Application Support/FlightGear/fgdata" | head
# attendu : AI ATC Aircraft Airports Astro Compositor Docs Effects Engines ...

# 4. Workaround "espace dans le path" — symlink dans ~/.fgfs/fgdata
#    (FG ou son loader Qt s'embrouille parfois avec --fg-root contenant un
#     espace blanc, ce qui fait que le process reste à RSS=30KB et n'ouvre
#     jamais sa fenêtre. Symlinker vers un chemin "propre" règle ça.)
mkdir -p ~/.fgfs
ln -snf "$HOME/Library/Application Support/FlightGear/fgdata" ~/.fgfs/fgdata

Le Makefile racine pointe FG sur ce répertoire via --fg-root. Pas besoin de l'ajouter à un PATH ou à ~/.zshrc.

Source officielle : https://www.flightgear.org/download/ → onglet "Base package" pour ta version.

6.c — Test rapide

cd ~/Project/bascanada/my_fleet
make fg          # plane SITL @ CYHU + FlightGear 3D
make fg-down     # ferme FG
make down        # arrête SITL

La scenery se télécharge automatiquement au premier vol via TerraSync (~100-300 MB pour la Rive-Sud de Montréal, tile w074n45).

Note : FG n'est pas requis pour la chaîne SITL → Cockpit/QGC. C'est strictement un viewer 3D additionnel. Voir flightgear.md pour le détail d'intégration.

7. Rust (optionnel, Phase 4)

Pour la glue logicielle si tu pars sur Rust :

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# choisir 1) default
source $HOME/.cargo/env
rustc --version

8. Vérification finale

Ouvrir un nouveau terminal (pour que ~/.zshrc soit relu) et exécuter :

which brew                  # /opt/homebrew/bin/brew
python3 --version           # 3.10.18
which python3               # ~/.pyenv/shims/python3
arm-none-eabi-gcc --version # 10.2.1
mavproxy.py --version       # MAVProxy is a modular ground station...
sim_vehicle.py --help | head -1
ls /Applications/QGroundControl.app
python3 -c "import pymavlink, dronecan, pexpect; print('imports OK')"

# Optionnel — si FG installé :
test -x /Applications/FlightGear.app/Contents/MacOS/FlightGear && echo "FG OK"

Si tout répond, tu es prêt pour sitl.md.

Pièges Apple Silicon connus

Symptôme Cause Solution
arm-none-eabi-gcc: command not found après le script PATH pas relu Nouveau terminal, ou source ~/.zshrc
python3 retourne 3.14 (Homebrew) au lieu de 3.10 pyenv shims pas en tête de PATH Vérifier eval "$(pyenv init -)" dans ~/.zshrc avant les autres exports PATH
Le script échoue sur wxPython Compilation lente, parfois timeout réseau Relancer le script — il reprend où il s'est arrêté
sudo demande le password en boucle Timeout de cache sudo (~5 min) Normal pour un script long, retape simplement
QGC ne s'ouvre pas — "endommagé" Quarantaine sur DMG non-officiel N'arrive pas avec le DMG notarisé officiel ; si oui, vérifier la source
Plus de place sur disque Compte ~3.3 GB total Vérifier avec du -sh ~/.pyenv ~/Project/bascanada/ardupilot /opt/gcc-arm-none-eabi-*

État disque (référence)

Composant Taille
ArduPilot repo + submodules ~1.8 GB
pyenv + Python 3.10.18 + pip packages ~800 MB
Toolchain ARM dans /opt ~700 MB
QGroundControl.app ~330 MB
FlightGear.app + scenery (optionnel) ~3 GB (app ~2 GB + scenery cache ~0.5-1 GB)
Total sans FG ~3.6 GB
Total avec FG ~6.6 GB