SCons est un outil de construction de projets (compilation et génération d'exécutables). Il permet de gérer facilement la compilation de projets d'une certaine complexité. Il est capable d'identifier quels composants d'un projet doivent être recompiles, et ne recompiler que ces derniers.
SCons est développé dans le langage Python; écrire un fichier SCons revient donc a écrire des commandes spécifiques dans le langage Python (On appelle ce genre d'outils langages a domaine spécifique intégrés - embedded DSLs). Le grand avantage d'utiliser un tel outil est que l'on peut profiter de la puissance/expressivité de tout le langage Python.
Lors d'un appel a la commande scons, l'outil cherche la présence d'un fichier script nommé SConstruct dans le dossier ou la commande est appelée. Le fichier SConstruct contient les instructions de build du projet. Ce dernier peut déléguer le build a des fichiers SConscript qui se trouvent dans des sous-dossiers du projet. Voici quelques variables et méthodes clefs pour écrire un fichier de build:
Admettons que l'on ait écrit un programme implémentant une calculatrice pour nombres complexes, séparé en modules de la manière suivante :
Les dépendances se traduisent dans nos fichiers par les directives d'inclusion #include ... Bien entendu, chaque fichier d'implémentation (.cc) dépend de plus du fichier de définition (.h) auquel il est associé.
Diagramme de compilation
Le grand avantage de Scons est que ce dernier est capable de trouver les dépendances de par lui-meme, et de compiler les fichiers dans l'ordre requis. Un script possible pourrait donc être :
import os env = Environment() env.Append(CCFLAGS='-std=c++0x -g3 -Wall -Wextra') #inclusion de la libraire env.Append(LINKFLAGS = ['-lgraph']) #calculCplx calculCplx = env.Program(target='calculCplx', src='calculCplx.cc') env.Alias("calculCplx", calculCplx)
Avec le script ci-dessus, il suffit d'appeler scons calculCplx pour compiler les fichiers nécessaires. Supposons maintenant que nous voulions créer une bonne structure de dossiers pour notre projet, ou nous séparons les sources et les exécutables. Voici une structure possible du projet :
dossier_projet/ SConstruct src/ SConscript complexe.h complexe.cc calculatrice.h calculatrice.cc calcGUI.h calcGUI.cc calculCplx.cc test/ lib/ libgraph.h libgraph.a libgraph.o bin/ build/
ou le contenu du fichier SConstruct est :
SConscript('src/SConscript', variant_dir='build', duplicate=0)
et celui du fichier src/SConscript est:
import os env = Environment() env.Append(CCFLAGS='-std=c++0x -g3 -Wall -Wextra') #inclusion de la libraire env.Append(LINKFLAGS = ['-lgraph']) #calculCplx calculCplx = env.Program(target='../bin/calculCplx', src='calculCplx.cc') env.Alias("calculCplx", calculCplx)
SCons contient bien plus d'options qui peuvent être très utiles. Voici quelques liens qui permettent d'en apprendre plus (ou d'assoir les bases):