Makefile
2014-09-09
Introduction
Un fichier Makefile explique les étapes pour obtenir un certain résultat. Par exemple, comment obtenir un programme exécutable à partir de ces sources. Il est exécuté avec la commande make
. Ainsi, plutôt que d’écrire soi-même les différentes commandes pour compiler un programme, il suffit de taper la commande make
. De plus, la Makefile permet de ne faire que les opérations nécessaires (par exemple, seulement recompiler les fichiers modifiés).
Lorsqu’on écrit un programme pour une carte Arduino, il est conseillé aux débutants d’utiliser l’IDE officiel (voir la première partie). Cependant, quand on préfère utiliser ses propres programmes, il vaut mieux ne pas avoir à en dépendre. On utilise alors un Makefile qui peut être utilisé depuis n’importe quel IDE suffisamment avancé.
Cette page présente donc un Makefile que j’ai écrit pour cet utilisation.
Télécharger
Récupérez le Makefile depuis GitHub. Il fait partie du projet arduino.c.
Configuration
Une petite configuration du Makefile est d’abord nécessaire. Au début du fichier, vérifiez la valeur des variables suivantes et donnez-en leur une correcte si besoin :
TARGET : le nom de base du fichier à créer (par défaut :
program
, pour le programmeprogram.hex
);BOARD : l’identifiant de votre carte Arduino (par défaut :
leonardo
);ARD_BASE : le chemin vers votre installation du logiciel Arduino, le répertoire des sources du logiciel pouvant suffire (par défaut :
/usr/share/arduino
);PORT : le fichier correspondant à la connexion série de votre carte (par défaut :
/dev/ttyACM0
);LIB_OBJ : le répertoire dans lequel les fichiers objets (fichiers temporaires utilisés par le compilateur) doivent être placés (par défaut :
$(BASE_PATH)/obj
);LIB_C : le répertoire où se trouvent les fichiers sources d’arduino.c (optionnel) (par défaut : “$(BASE_PATH)/arduino.c”).
Note : $(BASE_PATH)
désigne le répertoire où se trouve le fichier ‘Makefile’.
Options
Pour compiler, créez un lien symbolique vers le Makefile d’arduino.c dans le répertoire de votre projet. Compilez ensuite avec la commande ‘make’. Alternativement, vous pouvez simplement copier le fichier ‘Makefile’ et le répetoire ‘core/’ dans le répertoire du projet. Pour plus d’information, consultez, le fichier ‘README’.
Pour compiler un projet Arduino classique (C++, bibliothèques supplémentaires d’Arduino, …), vous devrez ajouter " MODE=cpp"
aux appels à make
. Si vous préférez, vous pouvez simplement décommenter la ligne appropriée dans le Makefile.
Utilisation
Le Makefile vous permet d’utiliser les commandes suivantes :
make
: commemake all
;make all
: crée le fichier .hex à envoyer à la carte;make clean
: supprime les fichiers objets du projet (*.o);make cleanobj
: supprime tous (Arduino, bibliothèques et arduino.c) les fichiers objets utilisés (../obj);make destroy
: commemake clean
et supprime le fichier .hex;make rebuild
: commemake destroy all
(re-compile complétement);make upload
: commemake all
et envoie le fichier .hex à la carte (la redémarre automatiquement si possible.
Portage en C
J’ai fini par devenir un inconditionnel du C pour ce qui est de la programmation dure (autre que scriptée). Aussi, le fait d’utiliser du C++ pour programmer pour Arduino ne m’enchantait pas particulièrement. Le Makefile présenté ci-dessus permet de s’affranchir de la dépendance à l’IDE et de programmer purement en C. Seulement, cela amène des limitations importantes, puisque une bonne partie du code utilisé pour les Arduino est en C++.
Notamment, les bibliothèques sont codées en C++ (jetez un œil au code source de EEPROM pour rire un coup) et l’interface sérielle également (ce qui permet à l’ordinateur d’intéragir avec la carte une fois son programme lancé). J’ai donc commencé à porter les fichiers les plus importants en C. Pour le moment, il s’agit surtout de l’interface USB (fichiers USBCore.cpp, HID.cpp et CDC.cpp).
Pour vous servir de ce portage, récupérez les fichiers d’arduino.c (via Git) et indiquez leur emplacement dans le Makefile. Une fois votre projet recompilé et envoyé sur la carte, vous devriez avoir accès à /dev/ttyACM0. En particulier, la fonction de redémarrage automatique est disponible !