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