SCons. Software Construction tool. Pierre Navaro. 6 juin 2012. IRMA Strasbourg. Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 1 / 20



Documents pareils
Installation et compilation de gnurbs sous Windows

Environnements de développement (intégrés)

Optimisation de logiciels de modélisation sur centre de calcul

Construction de logiciel et packaging

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

La création d un paquet Debian. Aurélien Jarno. Journées du Logiciel Libre. 15 octobre 2005

Builds et tests Utilisation de CMake et de Dart

Installation et prise en main

Cours Langage C/C++ Programmation modulaire

Votre premier projet Android

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

A. Architecture du serveur Tomcat 6

Introduction à Eclipse

TP1. Outils Java Eléments de correction

Auteur LARDOUX Guillaume Contact Année 2014 DEVELOPPEMENT MOBILE AVEC CORDOVA

Tutoriel code::blocks

Mon premier rpm. 7 juin Avant de commencer RPM URPMI RPMBUILD... 2

Cours Plugin Eclipse. Université Paris VI / Parcours STL / Master I Pierre-Arnaud Marcelot - Iktek - pamarcelot@iktek.com

Introduction à Linux (pour le HPC) «Linux 101» Présentation :

TD/TP 1 Introduction au SDK d Android

Traitement de données

Direction des Systèmes d'information

- TP Programmation Android - NFA024 Conservatoire National des Arts et Métiers

E-TRANSACTIONS. Guide du programmeur API Plug-in. Version 1.1

TP1 : Initiation à Java et Eclipse

Environnements et Outils de Développement Cours 1 Introduction

wxwidgets dans un environnement Microsoft Windows

NatStar V8.00. Ce document présente la liste des nouvelles fonctionnalités de la 8.00, disponible à partir de septembre 2013.

Installation d'un TSE (Terminal Serveur Edition)

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Fiche d utilisation du logiciel. 1 - Installation. J. Thioulouse & D. Chessel

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Déploiement de SAS Foundation

Sécurisation de Windows NT 4.0. et Windows 2000

Mise en œuvre de Rembo Toolkit

Arguments d un programme

Exonet : sauvegarde automatisée d une base de données

Module.NET 3 Les Assemblys.NET

WEB page builder and server for SCADA applications usable from a WEB navigator

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

L informatique en BCPST

Projet De Stijl Plate-forme pour robots mobiles

I0035 INGÉNIEUR - DÉVELOPPEUR APPLICAT IF / DECISIONNEL CONFIRMÉE SAS - SPSS - INFORMAT ICA. 27 ans - 4 ans d'expérience

Bases Java - Eclipse / Netbeans

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

WDpStats Procédure d installation

Le langage SQL (première partie) c Olivier Caron

Mesurer les performances (CPU) sous Linux

Déploiement OOo en environnement Windows Terminal Server

Installation EPLAN platform 2.4

Warren PAULUS. Android SDK et Android x86

Construire des plug-ins pour SAS Management Console SAS 9.1

Déplacer un serveur d'impression

7 Développement d une application de MapReduce

Stéphane DERACO, DSI CNRS l Argos Devops : de l hyperviseur aux conteneurs l 11/12/2014 DOCKER

TP réseau Android. Bidouilles Tomcat. a) Installer tomcat : il suffit de dézipper l'archive apache-tomcat windowsx64.zip.

bbc Launch Pad Juillet 2011 Version 10.0

Jérôme FESSY. IUT de Paris 5. Base de Données. Cours Introductif. Base de Données

Architectures web/bases de données

1 Description générale de VISFIELD

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

Whitepaper. Méthodologie de création de rapports personnalisés SQL Server Reporting Services

Validation de la création des groupes ABM et ajout de l utilisateur SASDEMO

Documentation d'installation Plateforme femme actuelle

Installation d'un serveur FTP géré par une base de données MySQL

TP 4 de familiarisation avec Unix

Quelques mots à propos de Sage

Manuel d'installation de GESLAB Client Lourd

TP Contraintes - Triggers

Sauvegarde et Restauration d un environnement SAS

Introduction à ORACLE WAREHOUSE BUILDER Cédric du Mouza

Master1 ère année. Réseaux avancés I. TP nº5 filière ISICG

Vue d ensemble de Windows PowerShell

CONFIGURATION DE LA LIBRAIRIE WEBUTIL (10g) Oracle Forms 10g

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

INSTALLATION CONFIGURATION D OWNCLOUD. La réponse informatique

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

TP1 : Initiation à Java et Eclipse

Comparatif CMS. Laurent BAUREN S Bérenger VIDAL Julie NOVI Tautu IENFA


Linux et le Shell. Francois BAYART. Atelier du samedi 20 Novembre

Simple Database Monitoring - SDBM Guide de l'usager

SÉCURISATION D'UN SERVEUR WINDOWS 2000

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

Service Informatique et Télématique (SITEL), Emile-Argand 11, 2009 Neuchâtel, Tél ,

PRESENTATION RESSOURCES. Christian Dupaty BTS Systèmes Numériques Lycée Fourcade Gardanne Académie d Aix Marseille

Table des matières Avant-propos... V Scripting Windows, pour quoi faire?... 1 Dans quel contexte?

GUIDE D INSTALLATION DE L APPLICATION GECOL SUR

Installation d OpenVPN

Cours Informatique Master STEP

Hébergement MMI SEMESTRE 4

Systeme d'exploitation

A QUOI SERVENT LES BASES DE DONNÉES?

Configurer la supervision pour une base MS SQL Server Viadéis Services

Introduction aux Systèmes et aux Réseaux, Master 2 CCI

Le prototype de la fonction main()

Présentation de l'outil RMAN d'oracle

Transcription:

SCons Software Construction tool Pierre Navaro IRMA Strasbourg 6 juin 2012 Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 1 / 20

Présentation de Scons Utilitaire de construction logiciel utilisant python comme langage de base. Alternative solide aux utilitaires historiques make et autoconf. Permet de produire des programmes par transformation ou compilation. Assure une mise à jour correcte en analysant les dépendances. Très bonne rapidité Des valeurs par défaut sont disponibles en fonction de la plateforme afin de minimiser le travail du programmeur. Reconnait un très grand nombre de langages. Disponible sur Unix, Windows, Mac OS X... Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 2 / 20

Principes de base Le script à la racine du projet doit être nommé SConstruct. Il peut produire des fichiers ou appeler des scripts se trouvant dans des sous-répertoires. Langage déclaratif : Ne pas préjuger de l ordre d exécution. Exécution dans le répertoire où est SConstruct scons Compilation parallèle scons -j 2 Nettoyage des fichiers internes scons -c Exécution peu bavarde scons -Q Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 3 / 20

Compiler plusieurs fichiers C : Les fichiers C sont les éléments d une liste python files = [ main.c, sub1.c, sub2.c ] files = Split("main.c sub1.c sub2.c") files = Glob("*.c") Définition du constructeur pour générer le programme exécutable. Program("exe",files) $ scons scons: Reading SConscript files... scons: done reading SConscript files. scons: Building targets... gcc -o sub1.o -c sub1.c gcc -o sub2.o -c sub2.c gcc -o main.o -c main.c gcc -o exe main.o sub1.o sub2.o scons: done building targets. Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 4 / 20

Compiler des bibliothèques Bibliothèque statique de fichiers F90 Library('user',['initial.f90','vitesse.f90']) $ scons -Q gfortran -o initial.o -c initial.f90 gfortran -o vitesse.o -c vitesse.f90 ar rc libuser.a initial.o vitesse.o ranlib libuser.a Librairie dynamique C++ SharedLibrary('go++',Glob("*.cpp"),CPPATH='.') $ scons -Q g++ -o XFunction.os -c -fpic -I. XFunction.cpp g++ -o approx_grad.os -c -fpic -I. approx_grad.cpp g++ -o condlim.os -c -fpic -I. condlim.cpp g++ -o discret.os -c -fpic -I. discret.cpp g++ -o libgo++.dylib -dynamiclib discret.os condlim.os \ XFunction.os approx_grad.os Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 5 / 20

Exemple d un programme F90 lié avec des libraries SConstruct Program('exe', Glob('*.f90'), F90FLAGS=['-O3'], LIBPATH='/usr/local/lib', LIBS=['hdf5', 'siloh5','z','gfortran'], F90PATH='/usr/local/include', LINK='g++', LINKFLAGS=['-Wl,-rpath','-Wl,/usr/local/lib']) Compilation $ scons -Q gfortran -o initial.o -c -O3 -I/usr/local/include initial.f90 gfortran -o sorties.o -c -O3 -I/usr/local/include sorties.f90 gfortran -o main.o -c -O3 -I/usr/local/include main.f90 gfortran -o vitesse.o -c -O3 -I/usr/local/include vitesse.f90 g++ -o exe -Wl,-rpath -Wl,/usr/local/lib \ initial.o main.o sorties.o vitesse.o \ -L/usr/local/lib -lhdf5 -lsiloh5 -lz -lgfortran Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 6 / 20

Notion d environnement Un environnement est une collection de variables définissant les mécanismes de compilation et d édition de liens. Construire un nouvel environnement. import os env = Environment(ENV = os.environ) Interrogation d un environnement. print "Compilateur C = ", env[ CC ] print env.dump() # dump tous les paramètres Utiliser un environnement pour compiler env.library ( user, Split ( user1.f90 user2.f90 )) env.program ( exe, 'main.f90', LIBS = [ user ], LIBPATH = [. ] ) Modification d un environnement. debug = Environment(F90FLAGS=[ -g ]) opt = debug.clone() opt.replace(f90flags=['-o3']) #pour une compilation optimisée debug.append(f90flags=['-pg']) #pour analyser avec gprof Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 7 / 20

Exemple d un programme C++ avec des librairies SRCSGOPP = Split(""" geom.cpp maillage.cpp discret.cpp ish.cpp condlim.cpp interpolation.cpp XFunction.cpp approx_grad.cpp hamiltonian.cpp application.cpp timesolveur.cpp sortie_resmtv.cpp sortie_resgnuplot.cpp """) SRCSHYPECOLPP = Split(""" geomns.cpp interp2d.cpp metric2d.cpp maillagens.cpp FunctionMinimisation.cpp Optimisation.cpp MeshSmoothingNS.cpp discretns.cp state2d.cpp thermo_equil2d.cpp thermo_hors_equil2d.cpp condlim2d.cpp state_interface2d.cpp state_node2d.cpp Gradients.cpp riemann flux2d_hyperbolique.cpp flux2d_eulerien.cpp flux2d_lagrangien.cpp InterfaceReconstructionNS.cpp bilan_flux2d.cpp projection2d.cpp applicationns.cpp timesolveurns.cpp DiscontinuousALENS.cpp gpc.c """) SRCSDIFFUSION= 'DiffusionBuildGlobalMatrix.cpp' APPLI= 'goppcemracs_dif.cpp' env = Environment(LIBPATH='.',CPPPATH='.',CPPFLAGS='-O3') env.library('go++',srcsgopp) env.library('hycl++',srcshypecolpp) env.library('diff++', SRCSDIFFUSION) env.program(appli, LIBS=['go++', 'hycl++', 'diff++']) Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 8 / 20

Production hiérarchique Les fichiers de la bibliothèque sont dans src et les programmes sont dans le répertoire test. fichier Sconstruct import os env = Environment( ENV = os.environ, CPPDEFINES='G95') SConscript(['src/SConscript'],['env']) SConscript(['test/SConscript'],['env']) SConscript dans les répertoires src et test Import('env') env.library('fish90',['fish.f']+glob('*.f')) Import('env') env.program('tpois3d.exe',['tpois3d.f'],libpath=['../src'],libs=['fish90']) $scons ar rc src/libfish90.a src/fish.o src/blktri.o src/cblktri.o... ranlib src/libfish90.a gfortran -o test/tpois3d.o -c -DG95 test/tpois3d.f gfortran -o test/tpois3d.exe test/tpois3d.o -Lsrc -lfish90 Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 9 / 20

Séparation sources et compilation fichier Sconstruct pour compiler dans lib import os env = Environment( ENV = os.environ, CPPDEFINES='G95') SConscript(['src/SConscript'],['env'],variant_dir='lib') Autre possibilité, dans le fichier SConstruct import os env = Environment( ENV = os.environ, CPPDEFINES='G95') VariantDir('lib','src') SConscript(['lib/SConscript'],['env']) VariantDir('bin','test') env.program('tpois3d.exe',['bin/tpois3d.f'],libpath=['lib'],libs=['fish90']) Attention SCons copie src dans lib risque de fichiers écrasés. VariantDir('bin','test',duplicate=0) #pas de copie du repertoire. des soucis avec les fichiers d entête peuvent apparaitre dans ce cas. Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 10 / 20

Configuration et vérification de dépendances import os env=environment(env=os.environ,f90flags=['-o3'], LIBPATH='/usr/local/lib', FRAMEWORKS='veclib',F90PATH='/usr/local/include', LIBS=['hdf5', 'siloh5', 'z','gfortran'],link='g++', LINKFLAGS=['-Wl,-rpath','-Wl,/usr/local/lib']) conf = Configure(env) if not conf.checklib('hdf5'): print "HDF5 doit etre installe" Exit(1) if not conf.checklibwithheader('siloh5','silo.h','c'): print "SILO doit etre installe" Exit(1) env = conf.finish() env.program('exe', Glob('*.f90')) $ scons scons: Reading SConscript files... Checking for C library hdf5... (cached) yes Checking for C library siloh5... (cached) yes scons: done reading SConscript files. scons: Building targets... Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 11 / 20

Installation dans des répertoires différents On veut installer la bibliothèque dans le répertoire lib et l exécutable dans le répertoire bin. import os env = Environment( ENV = os.environ, CPPDEFINES='G95') fish_lib = env.library('fish90',['src/fish.f']+glob('src/*.f')) env.install('lib',fish_lib) prog_test = env.program('tpois3d.exe',['test/tpois3d.f'], LIBPATH=['lib'],LIBS=['fish90']) env.install('bin',prog_test) env.depends('prog_test','fish_lib') #facultatif $ scons ar rc libfish90.a src/fish.o src/blktri.o src/cblktri.o src/cmgnbn.o... ranlib libfish90.a Install file: "libfish90.a" as "lib/libfish90.a" gfortran -o tpois3d.exe test/tpois3d.o -Llib -lfish90 Install file: "tpois3d.exe" as "bin/tpois3d.exe" Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 12 / 20

Options en ligne de commande SetOption import os num_cpu = int(os.environ.get('num_cpu', 2)) SetOption('num_jobs', num_cpu) print "running with -j", GetOption('num_jobs') GetOption if GetOption( help ): print 'Voici la liste des options possibles' $ export NUM_CPU=4; scons -h Voici la liste des options possibles running with -j 4 usage: scons [OPTION] [TARGET]... Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 13 / 20

Variables en lignes Scons stocke ces variables définies en ligne de commande dans un dictionnaire ARGUMENTS. import os env = Environment(ENV = os.environ) fcompiler = ARGUMENTS.get('fcompiler', 'gfortran') env.replace(fortran = fcompiler) $scons fcompiler=sunf95 On peut aussi utiliser la liste de nuplets ARGLIST. cppdefines = [] for key, value in ARGLIST: if key == 'define': cppdefines.append(value) env = Environment(CPPDEFINES = cppdefines) env.object('fish.f') $ scons -Q define=g95 gfortran -o fish.o -c -DG95 fish.f Malheureusement il n y a pas d aide disponible pour l utilisateur. Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 14 / 20

Variables en lignes (suite) Pour obtenir l aide en ligne on utilise le constructeur Variables vars = Variables() vars.add('have_fftw', 'Set to 1 to build with FFTW library', 0) env = Environment(variables = vars, CPPDEFINES={'HAVE_FFTW' : '${HAVE_FFTW}'}) Help(vars.GenerateHelpText(env)) $scons -Q HAVE_FFTW=1 cc -o fft.c -c -DHAVE_FFTW=1 fft.c $scons -Q -h HAVE_FFTW: Set to 1 to build with FFTW library default: 0 actual: None Dans un fichier : vars = Variables ( custom.py ) $cat custom.py HAVE_FFTW=1 Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 15 / 20

Créer une règle de compilation Ecrire un "Builder". import os env = Environment(ENV=os.environ) env.prependenvpath('path','/usr/local/cuda/bin') cudabuilder = Builder(action= 'nvcc -m64 -c $SOURCE',src_suffix = '.cu') env.append(builders = { 'Cuda' : cudabuilder}) env.cuda('c_kernels') $ scons -Q nvcc -m64 -c c_kernels.cu Ne pas écrire un "Builder" et utiliser "Command". f2py_module = env.command('mylapack','dgemm.f', "f2py -m $TARGET -c $SOURCE --f90flags=-o3 -lapack" ) Depends(f2py_module, 'dgemm.pyf') lib_user = env.library('user',['f90routines.f90','f90wrap.f90']) f2py_module = env.command('f90mod','f90module.f90', "f2py -m $TARGET -c $SOURCE --f90flags=-o3 -luser" ) Requires(f2py_module, lib_user) Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 16 / 20

Un exemple de SConstruct pour PETSc import os env = Environment(ENV=os.environ) PETSC_DIR = os.getenv('petsc_dir') PETSC_ARCH = os.getenv('petsc_arch') env.replace(f90=petsc_dir+'/'+petsc_arch+'/bin/mpif90') env.replace(f90flags=['-o3','-m64']) env.append(libpath=[ PETSC_DIR+'/'+PETSC_ARCH+'/lib']) env.append(libs=['petsc']) env.append(linkflags=['-wl,-commons,use_dylibs']) env.append(f90path=[ PETSC_DIR+'include/finclude', PETSC_DIR+'/'+PETSC_ARCH+'/include', PETSC_DIR+'/include']) env.program('exe', ['petsc_dmmg.f90']) Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 17 / 20

Gérer plusieurs serveurs connus avec SCons import os, socket,distutils.util platform = distutils.util.get_platform() hostname = socket.gethostname() env = Environment(ENV=os.environ,LIBS=['siloh5', 'z', 'hdf5']) if platform[:6] == 'macosx': env.replace(cppdefines = 'MAC') env.replace(frameworks = 'veclib', LINK = 'g++', LIBPATH= '/usr/local/lib', F90PATH = ['/usr/local/include'], F90FLAGS = '-cpp -D_MAC',) env.append(libs = ['gfortran', 'dfftpack']) if hostname[:8] == 'irma-hpc': #where Oracle studio compiler is available env.replace(fortran='sunf95') env.prepend(fortranflags = '-fpp') env.replace(libpath= '/usr/local/hdf5/lib',linkflags='-xlic_lib=sunperf') env.append(libs = ['nsl', 'socket']) env.program('picsou', Glob('*.f90')+Glob('*.f')) Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 18 / 20

Un dernier exemple Vérifier un numéro de version gfortran : ff = os.popen('gfortran --version') ll = ff.readline() ff.close() fc_version =ll[18:21] if float(fc_version) < 4.5: print 'gfortran version number '+fc_version+' less than 4.5' exit(); Lancer des tests def rununittest(env,target,source): import subprocess app = str(source[0].abspath) if not subprocess.call(app): open(str(target[0]),'w').write("passed\n") for root,dirs,files in os.walk('.'): for file in files: env.program(file) Command("unit_test in "+root[2:],file[:-4],rununittest) Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 19 / 20

Autres fonctionnalités de Scons Changer le type de détection pour la mise à jour. Par défaut, elle est basée sur la signature MD5. Gestion explicite des dépendances (Depend,Requires,Ignore) Ecrire ses propres constructeurs (CUDA). Très efficace pour les programmes JAVA. On peut utiliser des fonctions python pour la construction. Faiblesses Produit jeune. Quelques manques en Fortran distutils reste plus performant pour créer des modules python. Réputé plus lent que CMake, l utilisation de MD5 est chère. Documentation et exemples http://www.scons.org/doc/2.0.1/html/scons-user.html http://www.scons.org/wiki/sconsrecipes Pierre Navaro (IRMA Strasbourg) SCons 6 juin 2012 20 / 20