Méthodes d'environnement
Les méthodes d'environnement permettent, comme n'importe quelle méthode ou fonction, de factoriser des tâches répétitives.
Avec SCons, l'ajout d'une nouvelle méthode à un environnement de construction se fait en deux temps :
- définition de la méthode (lignes 1 à 6) ;
- ajout de la méthode à l'environnement à l'aide de la fonction AddMethod (ligne 8).
""" Build project. """ def BuildProject(env, sources, target_name): # Build program. env.Program(target = target_name + '.elf', source = sources) AddMethod(Environment, BuildProject)
Ici la méthode est ajoutée à l'environnement global. Mais elle peut également être ajoutée à n'importe quel environnement.
Intégration
Le système de construction iDreamMicro effectue trois opérations qui peuvent être factorisées :
- construction d'un projet ;
- construction d'une bibliothèque ;
- calcul de l'empreinte mémoire.
Logiquement, on propose de créer trois méthodes contenues dans le fichier build_system/build_tools.py :
- BuildProject ;
- BuildLibrary ;
- ComputeMemoryUsage.
Méthode BuildProject
La méthode BuildProject permet de construire entièrement un projet : construction des bibliothèques utilisées, compilation des sources et production des fichiers binaires de sortie.
""" Build project. """ def BuildProject(env, libraries, sources, target_name): # Build libraries. for library in libraries: SConscript( '#libraries/' + library + '/SConscript', exports = { 'env' : env }, duplicate = 0 ) # Build program. env.Program(target = target_name + '.elf', source = sources) # Create hex binary file. env.Command( target_name + '.hex', target_name + '.elf', env['OBJCOPY'] + ' -O ihex $SOURCE $TARGET' ) AddMethod(Environment, BuildProject)
Elle appelle la méthode BuildLibrary permettant de construire une bibliothèque.
Méthode BuildLibrary
La méthode BuildLibrary permet de construire une bibliothèque et de la rendre visible par la chaîne de compilation.
""" Build library. """ def BuildLibrary(env, sources, target_name): # Build static library. env.StaticLibrary(target = target_name, source = sources) # Append LIBPATH and LIBS. env.Append(LIBPATH = [ '#build/libraries/' + target_name + '/' + env['NAME'] ]) env.Append(LIBS = [ target_name ]) AddMethod(Environment, BuildLibrary)
Méthode ComputeMemoryUsage
La méthode ComputeMemoryUsage calcule l'empreinte mémoire du projet en faisant appel au programme avr-size.
""" Compute memory usage. """ def ComputeMemoryUsage(env, target_name): # Compute memory usage. env.Command( None, target_name + '.elf', env['SIZE'] + ' -C --mcu=' + env['MCU'] + ' $SOURCE' ) AddMethod(Environment, ComputeMemoryUsage)
Fichier SConstruct
Le fichier SConstruct principal importe les méthodes d'environnement nouvellement créées.
Projets
Les scripts de construction étant similaires d'un projet à l'autre, on ne présentera que les modifications relatives au projet helloworld.
Les modifications sont localisées dans le fichier projects/helloworld/SConscript.
Plutôt que d'ordonner chaque action, le script appelle tour à tout les méthodes de l'environnement de construction.
Bibliothèques
Les scripts de construction étant similaires d'une bibliothèque à l'autre, on ne présentera que les modifications relatives à la bibliothèque digital_io et plus particulièrement le fichier libraries/digital_io/src/SConscript.
Plutôt que de construire la bibliothèque et de l'ajouter à la liste des bibliothèques utilisées, le script se contente d'appeler la méthode BuildLibrary.
Conclusion
L'utilisation des méthodes de construction présente de nombreux avantages. Elle évite ou limite la duplication de code entre les différents scripts de construction en factorisant les actions redondantes. Qui dit factorisation dit également amélioration de la maintenabilité. Le cas échéant, il n'est plus nécessaire de modifier une multitude de scripts de construction mais on se contente de modifier la méthode d'environnement.
Articles relatifs
- Environnement de construction SCons pour AVR-GCC (1/2)
- Environnement de construction SCons pour AVR-GCC (2/2)
- Arborescence d'une bibliothèque
- Construction d'une bibliothèque
- Construction de plusieurs projets
- SCons et les variables de construction