diapositives - LaCIM
Transcription
diapositives - LaCIM
Chapitre 13 : Sujets divers Alexandre Blondin Massé Département d’informatique Université du Québec à Montréal 6 décembre 2016 Construction et maintenance de logiciels INF3135 A. Blondin Massé (UQAM) 6 décembre 2016 1 / 23 Table des matières 1. Moteurs de production Autotools CMake Java 2. Cython A. Blondin Massé (UQAM) 6 décembre 2016 2 / 23 Production I Supposons que nous avons un programme complet et que nous souhaitons le distribuer; I Il existe plusieurs outils pour faciliter cette procédure; I Nous allons nous concentrer sur deux d’entre eux : I Autotools, développé par GNU, qui sont en réalité plusieurs projets : Autoconf, Automake, Libtool. I CMake, qui permet dans certains une portabilité sur Windows. A. Blondin Massé (UQAM) 6 décembre 2016 3 / 23 Cas d’étude A. Blondin Massé (UQAM) 6 décembre 2016 4 / 23 Récupération du projet I Le projet est disponible sur Bitbucket; I Pour le faire fonctionner, il suffit d’entrer (en supposant que toutes les dépendances sont installées) : git clone https://[email protected]/ablondin-projects/maze-sdl.git cd maze-sdl/src make ./maze I Nous aimerions par contre pouvoir l’installer sur le système de sorte qu’il soit disponible de n’importe où. A. Blondin Massé (UQAM) 6 décembre 2016 5 / 23 Introduction I Solution la plus populaire pour les systèmes UNIX; I Très simple à manipuler d’un point de vue utilisateur : ./configure # Configuration adaptée à la machine make # Compilation sudo make install # Installation systeme I Plus difficile d’un point de vue développeur : I Plusieurs outils à maı̂triser : Autoscan, Automake, Autoconf, Libtool, etc. I Bonne connaissance des systèmes d’exploitation requise; I Doit être mis à jour régulièrement. A. Blondin Massé (UQAM) 6 décembre 2016 6 / 23 Retour au cas d’étude I Dans le cas d’étude, aller sur la branche autotools, puis entrer : aclocal autoheader autoconf automake --add-missing automake I Ensuite, pour produire le projet, entrer ./configure make sudo make install A. Blondin Massé (UQAM) 6 décembre 2016 7 / 23 Simplifier pour l’utilisateur I L’utilisateur moyen n’a généralement pas envie d’entrer les commandes ci-bas : aclocal autoheader autoconf automake --add-missing automake I Une stratégie simple consiste à placer ces commandes dans un script (appelé boostrap, par exemple) et alors on n’a qu’à faire ./boostrap ./configure make sudo make install A. Blondin Massé (UQAM) 6 décembre 2016 8 / 23 Fichiers supplémentaires I I Évidemment, pour que Autotools fonctionne, il faut lui communiquer certaines informations à l’aide de fichiers textes : I Un fichier configure.ac, qui gère la configuration; I Dans chaque répertoire/sous-répertoire, un fichier Makefile.am; I Optionnellement, un script boostrap pour simplifier l’installation. L’extension du fichier indique le programme qui l’utilise (ac = autoconf, am = automake, etc.). A. Blondin Massé (UQAM) 6 décembre 2016 9 / 23 Fichiers configure.ac # -*- Autoconf -*# Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([maze], [0.1], [[email protected]]) AM_INIT_AUTOMAKE(maze, 0.1) AC_CONFIG_SRCDIR([src/animated_spritesheet.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # FIXME: Replace ‘main’ with a function in ‘-lSDL2_image’: AC_CHECK_LIB([SDL2_image], [main]) # FIXME: Replace ‘main’ with a function in ‘-ltmx’: AC_CHECK_LIB([tmx], [main]) # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. AC_CHECK_HEADER_STDBOOL # Checks for library functions. AC_FUNC_MALLOC AC_CONFIG_FILES([Makefile src/Makefile assets/Makefile]) AC_OUTPUT A. Blondin Massé (UQAM) 6 décembre 2016 10 / 23 Fichiers Makefile.am (1/2) Fichier /Makefile.am AUTOMAKE_OPTIONS = foreign SUBDIRS = src assets Fichier /src/Makefile.am assetsdir = $(datadir)/@PACKAGE@/assets/ AM_CFLAGS = ‘sdl2-config --cflags‘ ‘xml2-config --cflags‘ DASSETS_PATH=’"${assetsdir}"’ AM_LDFLAGS = -lSDL2_image ‘sdl2-config --libs‘ -ltmx -lz ‘xml2config --libs‘ bin_PROGRAMS = maze maze_SOURCES = animated_spritesheet.c animated_spritesheet.h application.c application.h character.c character.h constants.h game.c game.h main.c maze.c maze.h menu.c menu. h sdl2.h spritesheet.c spritesheet.h utils.h A. Blondin Massé (UQAM) 6 décembre 2016 11 / 23 Fichiers Makefile.am (2/2) Fichier /assets/Makefile.am assetsdir = $(datadir)/@PACKAGE@/assets assets_DATA = level1.tmx maze-tile0000.png maze-tile0001.png maze-tile0010.png maze-tile0011.png maze-tile0100.png mazetile0101.png maze-tile0110.png maze-tile0111.png mazetile1000.png maze-tile1001.png maze-tile1010.png mazetile1011.png maze-tile1100.png maze-tile1101.png mazetile1110.png maze-tile1111.png maze.png play.png quit.png walking.png A. Blondin Massé (UQAM) 6 décembre 2016 12 / 23 CMake I CMake est un logiciel semblable à Autotools, mais qui vise à être multiplateforme; I En particulier, il fonctionne dans plusieurs cas sur Windows (en autant qu’un compilateur soit disponible); I Il permet de simplifier la compilation et l’installation; I Mais il est aussi possible de générer un “template” de projet pour développer (Visual Studio, Eclipse, Netbeans, etc.). I Comme Autotools, il est relativement facile à manipuler d’un point de vue utilisateur, mais est plus complexe d’un point de vue développeur. A. Blondin Massé (UQAM) 6 décembre 2016 13 / 23 Retour sur le cas d’étude I Au niveau utilisateur, il suffit d’entrer les commandes suivantes : git clone https://[email protected]/ablondin-projects /maze-sdl.git cd maze-sdl mkdir build cd build cmake .. I Ensuite, sur les systèmes UNIX, on obtient un Makefile, qu’on peut utiliser : make sudo make install A. Blondin Massé (UQAM) 6 décembre 2016 14 / 23 Un fichier unique : CMakeLists.txt # Global settings cmake_minimum_required(VERSION 3.5.1) project(maze) # Sources and executable file(GLOB SOURCES "src/*.c") add_executable(${PROJECT_NAME} ${SOURCES}) # Includes execute_process(COMMAND "sdl2-config" "--cflags" OUTPUT_VARIABLE SDL2_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND "xml2-config" "--cflags" OUTPUT_VARIABLE XML2_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SDL2_CFLAGS} ${XML2_CFLAGS}") # Linking execute_process(COMMAND "sdl2-config" "--libs" OUTPUT_VARIABLE SDL2_LDFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND "xml2-config" "--libs" OUTPUT_VARIABLE XML2_LDFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lSDL2_image ${SDL2_LDFLAGS} ltmx -lz ${XML2_LDFLAGS}") # Installing include(GNUInstallDirs) install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/assets/ DESTINATION ${ CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/assets FILES_MATCHING PATTERN *.png PATTERN *.tmx) A. Blondin Massé (UQAM) 6 décembre 2016 15 / 23 Développer en Java I Généralement, lorsqu’on développe en Java, on utilise un environnement de développement : I Bien que ceux-ci présentent de nombreux avantages, certains (comme moi) pourraient préférer de continuer à développer avec leur éditeur de texte préféré. I La compilation est alors généralement gérée à l’aide de Ant ou de Maven. A. Blondin Massé (UQAM) 6 décembre 2016 16 / 23 Le greffon Eclim I En particulier, sous Vim, il existe un greffon qui permet d’interagir avec Eclipse : Eclim; I On obtient alors toutes les fonctionnalités d’Eclipse, mais sans la lourdeur de l’application graphique : I I Création de projets; I Compilation facile; I Exécution de tâches (via Ant); I Complétion automatique, etc. Inconvénient : la configuration initiale prend un certain temps... A. Blondin Massé (UQAM) 6 décembre 2016 17 / 23 Table des matières 1. Moteurs de production 2. Cython A. Blondin Massé (UQAM) 6 décembre 2016 18 / 23 Cython I Compilateur statique permettant de compiler du code Python et du code Cython; I Site officiel : http://cython.org/; I Compatible avec Pyhon 2 et 3; I En fait, le langage Cython est un super ensemble du langage Python; I Utilisé dans plusieurs projets pour optimiser certaines parties. A. Blondin Massé (UQAM) 6 décembre 2016 19 / 23 Exemple (Python) import sys from time import time def afficherSousEnsembles(n): s = "{ " i = 0 j = 0 while n != 0: if n % 2 == 1: if (j == 300): print ’j = 300’ j += 1 s += ’%d ’ % i n /= 2 i += 1 s += "}" print s def main(argv=None): if argv is None: argv = sys.argv avant = time(); for i in range(2 ** int(argv[1])): afficherSousEnsembles(i) apres = time(); print "Temps ecoule : %lf seconde(s)\n" % (apres - avant) if __name__ == "__main__": sys.exit(main()) A. Blondin Massé (UQAM) 6 décembre 2016 20 / 23 Exemple (C) #include #include #include #include <stdio.h> <stdlib.h> <math.h> <time.h> void afficherSousEnsembles(unsigned long int n) { unsigned int i, j; printf("{ "); i = j = 0; while (n != 0) { if (n % 2 == 1) { printf("%d ", i); if (j == 300) printf("j = 300"); } n /= 2; ++i; } printf("}\n"); } int main(int argc, char *argv[]) { unsigned long int i; clock_t avant, apres; unsigned long int n; n = pow(2, strtol(argv[1], NULL, 0)); avant = clock(); for (i = 0; i < n; ++i) afficherSousEnsembles(i); apres = clock(); printf("Temps écoulé : %lf seconde(s)\n", ((double)(apres - avant) / CLOCKS_PER_SEC)); return 0; } A. Blondin Massé (UQAM) 6 décembre 2016 21 / 23 Exemple (Python avec appel au programme C) from os import system from time import time import sys def main(argv=None): if argv is None: argv = sys.argv avant = time(); system("./ensemble %s" % argv[1]) apres = time(); print "Temps ecoule : %lf seconde(s)\n" % (apres - avant) if __name__ == "__main__": sys.exit(main()) A. Blondin Massé (UQAM) 6 décembre 2016 22 / 23 Exemple (Cython) import sys from time import time cimport libc.stdio as stdio cdef void afficherSousEnsembles(unsigned long int n): cdef unsigned int i = 0 cdef unsigned int j = 0 stdio.printf("{ ") while n != 0: if n % 2 == 1: stdio.printf("%d ", i) j += 1 n /= 2 i += 1 stdio.printf("}\n") def main(n): cdef int i cdef unsigned long int m = 2 ** n avant = time(); for i from 0 <= i < m: afficherSousEnsembles(i) apres = time(); print("Temps ecoule : %lf seconde(s)\n" % (apres - avant)) A. Blondin Massé (UQAM) 6 décembre 2016 23 / 23