Débuter avec Lima sur macOS
Lors de vos projets en C à l'EPITA, votre code est évalué dans un environnement Linux x86_64 (Debian/Ubuntu).
Travailler nativement sur macOS peut entraîner des problèmes de compatibilité, notamment lors de l'édition de liens avec des bibliothèques statiques précompilées (par exemple des fichiers .a) fournies pour x86_64.
Lima (Linux Virtual Machines) vous permet d'exécuter une machine virtuelle Linux légère sur macOS avec un partage automatique de fichiers entre le système hôte et l'invité.
Différences d'architecture
| Modèle de Mac | Architecture native | Architecture cible | Solution |
|---|---|---|---|
| Mac Intel | x86_64 | x86_64 Linux | Instance Lima standard |
| Apple Silicon (M1/M2/M3/M4) | arm64 (aarch64) | x86_64 Linux | VM x86_64 accélérée par Rosetta 2 |
Prérequis
- Homebrew
- Un IDE (VSCode, CLion, Emacs, ...) installé sur macOS
Installation
Installez lima ainsi que lima-additional-guestagents via Homebrew.
lima-additional-guestagents est requis sur les Mac Apple Silicon pour exécuter des machines virtuelles invitées x86_64. Sans cela, Lima échouera avec l'erreur guest agent binary could not be found.
brew install lima lima-additional-guestagents
Création et démarrage de la VM
Choisissez la commande d'initialisation en fonction de l'architecture du processeur de votre Mac :
- Apple Silicon (M1/M2/M3/M4)
- Mac Intel
Lancez une VM Linux x86_64 accélérée par Rosetta 2 à l'aide du pilote de virtualisation natif macOS vz :
limactl start --name=ubuntu-x86 --vm-type=vz --rosetta template:ubuntu
L'émulation logicielle via QEMU est très lente et provoque fréquemment des dépassements de délai au démarrage (FATA: did not receive an event with the running status). Rosetta 2 offre une vitesse d'exécution quasi native pour les binaires x86_64.
Sur les Mac Intel, une VM Linux standard fonctionne directement :
limactl start --name=ubuntu-x86 template:ubuntu
Configuration de l'environnement Linux
Une fois la VM créée, accédez au shell Linux :
lima -n ubuntu-x86
Dans la VM, mettez à jour les paquets et installez la chaîne d'outils C indispensable :
sudo apt update && sudo apt install -y \
build-essential \
gcc clang clang-format \
make cmake gdb valgrind \
libcriterion-dev libreadline-dev
Utilisation au quotidien
- Ouvrez un terminal sur votre Mac et déplacez-vous dans le dossier de votre projet :
cd ~/chemin/vers/votre/projet
- Ouvrez le shell de la VM Linux dans ce répertoire :
lima -n ubuntu-x86
- Modifiez votre code avec votre éditeur favori sur macOS.
- Compilez et exécutez dans la VM Linux :
make
./mon_programme
- Quittez la VM :
exit
Résolution des problèmes
1. skipping incompatible lib/libexample.a when searching for -lexample
- Cause : Vous essayez de lier une bibliothèque statique
x86_64au sein d'une VM LinuxARM64(aarch64). - Solution : Vérifiez que vous avez bien créé la VM avec le flag
--rosetta(ou--arch=x86_64). Vérifiez votre architecture dans Linux avec :
uname -m
# Le résultat doit être : x86_64
2. cannot open output file mon_programme: Read-only file system
- Cause : Le point de montage partagé de macOS dans Lima est passé en lecture seule (arrive souvent après une mise en veille du système).
- Solution :
- Solution temporaire rapide : Copiez votre projet dans le dossier
/tmpde la VM et compilez-y :
cp -r . /tmp/mon_projet && cd /tmp/mon_projet
make
- Solution permanente : Arrêtez et redémarrez l'instance Lima depuis macOS :
limactl stop ubuntu-x86 && limactl start ubuntu-x86
3. guest agent binary could not be found for Linux-x86_64
- Cause : Binaires guest agents
x86_64manquants sur macOS. - Solution : Exécutez les commandes suivantes dans votre terminal Mac :
brew install lima-additional-guestagents
limactl delete -f ubuntu-x86
limactl start --name=ubuntu-x86 --vm-type=vz --rosetta template:ubuntu
4. implicit declaration of function ou format %f expects double
- Cause : Utilisation d'une fonction sans avoir inclus son fichier d'en-tête (
.h). En C89/C99, les déclarations manquantes retournent par défaut unint. - Solution : Incluez les bons fichiers d'en-tête au début de vos fichiers
.c:
#include <stdio.h>
#include "mon_header.h"
5. Masquer les avertissements unused parameter pour les fonctions non implémentées
Au début d'un projet, avec des stubs de fonctions non encore implémentées, les avertissements du compilateur peuvent être envahissants.
- Solution A (Option Makefile) : Ajoutez temporairement
-Wno-unused-parameter:
make CFLAGS="-Wall -Wextra -Wno-unused-parameter -Iinclude"
- Solution B (Dans le code C) : Castez les variables inutilisées en
void:
int ma_fonction(int param_inutilise) {
(void)param_inutilise;
return 0;
}
Commandes utiles
| Action | Commande (sur macOS) |
|---|---|
| Ouvrir le Shell Linux | lima -n ubuntu-x86 |
| Démarrer la VM | limactl start ubuntu-x86 |
| Arrêter la VM | limactl stop ubuntu-x86 |
| Lister les VMs | limactl list |
| Supprimer la VM | limactl delete ubuntu-x86 |
Ajoutez un alias à votre ~/.zshrc sur macOS pour y accéder rapidement :
echo 'alias linux="lima -n ubuntu-x86"' >> ~/.zshrc && source ~/.zshrc
Vous pouvez maintenant simplement taper linux dans n'importe quel dossier de projet pour basculer dans votre environnement Linux x86_64.