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.

sconstruct.png

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.

projects_helloworld_sconscript.png

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.

libraries_digital_io_src_sconscript.png

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

Références