Aller au contenu principal

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 MacArchitecture nativeArchitecture cibleSolution
Mac Intelx86_64x86_64 LinuxInstance Lima standard
Apple Silicon (M1/M2/M3/M4)arm64 (aarch64)x86_64 LinuxVM 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.

Utilisateurs Apple Silicon

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 :

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
Pourquoi Rosetta 2 plutôt que QEMU ?

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.


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​

  1. Ouvrez un terminal sur votre Mac et déplacez-vous dans le dossier de votre projet :
cd ~/chemin/vers/votre/projet
  1. Ouvrez le shell de la VM Linux dans ce répertoire :
lima -n ubuntu-x86
  1. Modifiez votre code avec votre éditeur favori sur macOS.
  2. Compilez et exécutez dans la VM Linux :
make
./mon_programme
  1. 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_64 au sein d'une VM Linux ARM64 (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 /tmp de 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_64 manquants 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 un int.
  • 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​

ActionCommande (sur macOS)
Ouvrir le Shell Linuxlima -n ubuntu-x86
Démarrer la VMlimactl start ubuntu-x86
Arrêter la VMlimactl stop ubuntu-x86
Lister les VMslimactl list
Supprimer la VMlimactl delete ubuntu-x86
Alias dans le terminal

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.