Arborescence

Il est nécessaire de modifier l'arborescence afin d'accueillir plusieurs projets. On crée un dossier projects dans lequel chaque projet a son sous-dossier. On retrouve le projet helloworld ainsi qu'un nouveau projet nommé input_to_output.

idreammicro
|_build_system
|_libraries
|    |_digital_io
|_projects
|    |_helloworld
|    |    |_helloworld.c
|    |    |_SConscript
|    |    |_SConstruct
|    |_input_to_output
|    |    |_input_to_output.c
|    |    |_SConscript
|    |    |_SConstruct
|    |_SConscript
|_SConstruct

Fichier SConstruct

Le fichier SConstruct situé à la racine du projet appelle le script de construction des projets.

# Execute projects SConscript.
SConscript('projects/SConscript')

Fichier projects/SConscript

Le fichier projects/SConscript indique les projets à construire et ordonne leur construction.

# Define projects to build.
projects = [
    'helloworld/',
    'input_to_output/'
]

# Build each project.
for project in projects:
    SConscript(project +  'SConstruct')

Construction d'un projet

Puisqu'il est désormais possible de construire plusieurs projets, il est nécessaire que chacun dispose de son propre dossier de sortie. La construction d'un projet évolue très peu : seul le paramètre variant_dir diffère.

project-sconstruct-diff.png

On prend pour exemple la construction du projet helloworld.

# Set environment for AVR-GCC.
SConscript('#build_system/env_avr.py')

# Import environment set for AVR-GCC.
Import('env_avr')

# Append CPPPATH with the root path of libraries.
env_avr.Append(CPPPATH = [ '#libraries/' ])

# Define environments to use (one environment per target).
environments = [
    'env_arduino_uno',
    'env_arduino_mega2560'
]

# Browse environments.
for environment in environments:
    # Set environment for target.
    SConscript(
        '#build_system/' + environment + '.py',
        exports = 'env_avr'
    )
    # Import environment set for target.
    Import('env_target')
    # Build program.
    SConscript(
        'SConscript',
        variant_dir = '#build/' + 'projects/helloworld/' + environment,
        exports = { 'env_target' : env_target, 'env_name' : environment },
        duplicate = 0
    )

Conclusion

La plateforme iDreamMicro se construit petit à petit. Toutefois il est possible de faire encore mieux en tirant encore plus parti de SCons et du langage Python. Un prochain article proposera de créer des fonctions permettant de factoriser la construction des projets et des bibliothèques.

Articles relatifs