Chapitre II Construction, compilation et cross

Transcription

Chapitre II Construction, compilation et cross
Chapitre II
Construction, compilation et
cross-compilation
1
Autoconf / Automake / Libtool
2
CMake
3
Cross-compilation
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
22
Autoconf / Automake / Libtool
Chapitre II
Construction, compilation et
cross-compilation
1
Autoconf / Automake / Libtool
2
CMake
3
Cross-compilation
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
23
Autoconf / Automake / Libtool
Autoconf / Automake / Libtool
Initialement : Make
Syntaxe complexe pour autre chose que les fonctions de base.
Syntaxe peu standardisée : Sun Make, GNU Make, Microsoft
Make, etc.
Nécessité d’écrire beaucoup de lignes (souvent les mêmes dans
des projets différents) (cibles clean install uninstall
. . . ).
Aucune connaissance sur les particularités des systèmes : à
prendre en compte par l’auteur.
Simplement la construction, mais pas la détection de la
configuration et des dépendances.
Lors de l’utilisation, difficultés pour configurer la compilation.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
24
Autoconf / Automake / Libtool
Autoconf / Automake / Libtool
Plutôt que d’écrire manuellement un Makefile, on le fait générer
par un outil.
Ce n’est pas l’auteur du logiciel qui génère le Makefile, mais la
personne qui compile le logiciel :
Le Makefile est personnalisé en fonction du système, des
choix de la personne qui compile, après vérification des
dépendances.
Pour la personne qui compile, utilisation du configure
(éventuellement avec options particulières), puis make.
Pour le développeur, l’enfer.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
25
Autoconf / Automake / Libtool
Autoconf / Automake / Libtool
Compilation de sources
Utilisation de base
./configure
Éventuellement avec options, voir ./configure ––help
Sans options, l’installation se fait habituellement dans
/usr/local
make
make install
en root si le préfixe d’installation requiert les droits root
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
26
Autoconf / Automake / Libtool
Autoconf / Automake / Libtool
Compilation de sources
Quelques options :
––prefix=PREFIX Installation des fichiers dans le répertoire
PREFIX (par défaut dans /usr/local)
––with-PACKAGE Utilisation optionnelle d’une dépendance sur une
bibliothèque.
––enable-XXX Activation d’une fonction.
... Options spécifiques au projet.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
27
Autoconf / Automake / Libtool
Autoconf / Automake / Libtool
Compilation de sources
Quelques cibles du Makefile généré :
par défaut Construction.
clean Nettoyage des fichiers générés par la compilation.
install Installation du résultat de la compilation (dans
PREFIX).
uninstall Suppression des fichiers installés (dans PREFIX).
dist Création d’une archive contenant les sources.
distclean Suppression de tous les fichiers pouvant être
régénérés.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
28
Autoconf / Automake / Libtool
Autoconf / Automake / Libtool
Compilation de sources
Manipulation
1
2
3
4
5
Récupérer l’archive des sources de GNU Hello
http://ftp.igh.cnrs.fr/pub/gnu/hello/ (2.10)
Compiler et installer. Vérifier l’installation en exécutant le
programme.
Supprimer les fichiers installés.
Relancer la compilation et installation dans
/home/<login>/usr (après avoir créé ce répertoire).
Se débrouiller pour que l’exécutable de hello installé dans
/home/<login>/usr/bin soit trouvé si on tape hello dans
le shell.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
29
Autoconf / Automake / Libtool
Autoconf / Automake / Libtool
Fonctionnement
automake génère les fichiers Makefile.in à partir des
fichiers Makefile.am
aclocal génère le fichier aclocal.m4 à partir du fichier
configure.ac (ou configure.in) (pas toujours nécessaire)
autoconf génère le fichier configure à partir du fichier
configure.ac
./configure génère les fichiers Makefile à partir des
fichiers Makefile.in (au moment de la compilation)
libtool est utilisé automatiquement par configure et make
pour prendre en compte les spécificités du système concernant
les bibliothèques.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Autoconf
Construction, compilation et cross-compilation
30
Autoconf / Automake / Libtool
configure.ac
Exemple
AC_INIT(cogitant, 5.3.0)
AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE()
AC_CONFIG_SRCDIR(src/common.cpp)
LT_INIT
AC_PROG_CXX
AC_LANG(C++)
AC_HAVE_SSTREAM
AC_HAVE_LIMITS
AC_ARG_ENABLE(debug, AC_HELP_STRING([––enable-debug],
[compilation avec informations de débogage]), ,
[enable_debug=no])
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
31
Autoconf
Autoconf / Automake / Libtool
configure.ac
Exemple
AC_MSG_CHECKING([for debug])
case "$enable_debug" in
yes) debug=true ;;
no) debug=false ;;
*)
AC_MSG_ERROR([Invalid value $enable_debug
for ––enable-debug]) ;;
esac
if test "$debug" = "true"; then
LOCALCXXFLAGS_COMMON="${LOCALCXXFLAGS_COMMON} -g"
fi
AC_MSG_RESULT([$debug])
AC_CONFIG_FILES(
[src/cg-config \
Makefile \
config/Makefile \
...
AC_OUTPUT
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Automake
Construction, compilation et cross-compilation
32
Autoconf / Automake / Libtool
Makefile.am
Exemple (racine)
SUBDIRS = include src doc java test samples config
EXTRA_DIST = config/depcomp autogen.sh CMakeLists.txt
MAINTAINERCLEANFILES = Makefile.in configure\
aclocal.m4 config/config.guess config/config.sub\
config/install-sh config/ltconfig config/ltmain.sh\
config/missing config/mkinstalldirs
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
33
Automake
Autoconf / Automake / Libtool
Makefile.am
Exemple (src)
MAINTAINERCLEANFILES = Makefile.in
EXTRA_DIST = makefile.unx CMakeLists.txt
AM_CXXFLAGS = ‘$(top_builddir)/src/cg-config
––prefix=$(top_srcdir)
––builddir=$(top_builddir) –cflags‘
noinst_HEADERS = test.h test.cpp
noinst_PROGRAMS = compare perfs biggraphs
compare_SOURCES = compare.cpp
perfs_SOURCES = perfs.cpp
biggraphs_SOURCES = biggraphs.cpp
LDADD = -L$(top_builddir)/src @LOCALLIBS_BASE@
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
34
Autoconf / Automake / Libtool
Autoconf / Automake / Libtool
Modification du processus de compilation
Quelques modifications simples :
Rajouter des sources
Dans le Makefile.am : nomexec_SOURCES.
Rajouter un répertoire
Dans le Makefile.am du répertoire parent : SUBDIRS
Dans le configure.ac : AC_CONFIG_FILES pour la
génération du Makefile du nouveau répertoire.
Créer un nouveau Makefile.am
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
35
Autoconf / Automake / Libtool
Autoconf / Automake/ Libtool
Manipulation
1
2
3
Écrire des fichiers configure.ac et Makefile.am minimaux
(c’est à dire qu’ils contiendront uniquement les lignes
nécessaires et indispensables, en comprenant ces lignes) pour
compiler un programme écrit en C++.
Écrire un programme en C++ affichant la liste des comptes
d’utilisateur de la machine (première colonne de chaque ligne
de /etc/passwd).
Le répertoire des sources sera partagé entre votre système
hôte et un système invité Virtualbox. Vous exécuterez
configure et make ailleurs que dans ce répertoire partagé
afin de pouvoir tester simultanément votre programme dans
les deux systèmes.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
36
CMake
Chapitre II
Construction, compilation et
cross-compilation
1
Autoconf / Automake / Libtool
2
CMake
3
Cross-compilation
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
37
CMake
CMake
Pourquoi ?
Remplacer 3 outils compliqués par un seul (plus simple).
Une seule syntaxe à apprendre.
Multi-plateforme. Gestion des compilateurs Windows.
Ça marche.
Comment ça marche ?
Le développeur écrit un fichier CMakeLists.txt par
répertoire.
Au moment de la compilation, on exécute CMake qui va
générer des fichiers de construction à partir des
CMakeLists.txt (habituellement dans un autre répertoire
pour ne pas polluer le répertoire des sources).
http://www.cmake.org
Systèmes d’exploitation – Master 2 SILI – 2016-2017
CMake
Construction, compilation et cross-compilation
38
CMake
Compilation de sources
En ligne de commande
Méthode rapide : cmake . dans le répertoire des sources.
Méthode conseillée : Créer un répertoire pour la compilation
et exécuter cmake <répertoire source> en étant dans le
répertoire de compilation.
Interface texte
ccmake à la place de cmake (dans le paquet
cmake-curses-gui)
Interface graphique
cmake-gui (dans le paquet cmake-qt-gui)
Défaut : Nécessité de disposer de CMake pour compiler un logiciel.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
39
CMake
CMake
Compilation de sources
Manipulation
1
2
3
4
Télécharger l’archive des sources de PLPlot
http://sourceforge.net/projects/plplot/files/plplot/
(version 5.11.1 sous forme d’un fichier tar.gz)
Lancer la compilation (dans un autre répertoire que celui
contenant les sources).
Est-ce que les exemples ont été compilés ? (dans
examples/c++)
Relancer la compilation afin de compiler les exemples.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
CMake
Construction, compilation et cross-compilation
40
CMake
Édition d’un CMakeLists.txt
Exemple (racine)
PROJECT(cogitant CXX C)
OPTION(BuildExamples "Compile examples" OFF)
IF(UNIX OR MINGW OR MSYS OR CYGWIN)
ADD_DEFINITIONS("-Wall")
ENDIF(UNIX OR MINGW OR MSYS OR CYGWIN)
FIND_PACKAGE(wxWidgets)
IF(wxWidgets_FOUND)
SET(CogiLibs ${CogiLibs} ${wxWidgets_LIBRARIES})
ELSE(wxWidgets_FOUND)
MESSAGE(FATAL_ERROR "wxWidgets not found")
ENDIF(wxWidgets_FOUND)
LINK_LIBRARIES(${CogiLibs})
ADD_SUBDIRECTORY(include)
ADD_SUBDIRECTORY(src)
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
41
CMake
CMake
Édition d’un CMakeLists.txt
Exemple (src)
IF(BuildExamples)
ADD_EXECUTABLE(compare compare.cpp)
ADD_EXECUTABLE(perfs perfs.cpp)
ADD_EXECUTABLE(biggraphs biggraphs.cpp)
ENDIF(BuildExamples)
Systèmes d’exploitation – Master 2 SILI – 2016-2017
CMake
Construction, compilation et cross-compilation
42
CMake
Édition d’un CMakeLists.txt
Exemple (Création d’une bibliothèque)
PROJECT(malib)
SET(malib_SRC malib.cpp)
ADD_LIBRARY(malib ${malib_SRC})
Selon la valeur de BUILD_SHARED_LIBS construit une bibliothèque
statique ou dynamique.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
43
CMake
CMake
Édition d’un CMakeLists.txt
Pour en savoir plus :
http://www.cmake.org/HTML/Documentation.html
http://www.elpauer.org/stuff/learning_cmake.pdf
Manipulation
1
2
Ecrire un programme minimal « Hello world » utilisant CMake
pour la compilation.
Construire une version Debug et une version Release de ce
programme dans deux répertoires différents. Comparer la taille
des deux exécutables produits.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
CMake
Construction, compilation et cross-compilation
44
CMake
Construction d’une bibliothèque
Manipulation
1
Construire une bibliothèque C++ permettant de mémoriser la
configuration d’un serveur DHCP en stockant la
correspondance entre une adresse MAC et une adresse IP. À
une adresse MAC sera associée une seule adresse IP (et
inversement). Fournir une méthode d’ajout d’un couple
MAC/IP, recherche par l’adresse MAC, recherche par l’adresse
IP, stockage dans un fichier, chargement.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
45
CMake
CMake
Construction d’une bibliothèque
Manipulation
2
Construire deux programmes exécutables utilisant cette
bibliothèque. La bibliothèque et les deux exécutables seront
construits à partir du même CMakeLists.txt.
Le premier programme prendra comme paramètre un nom de
fichier de stockage et une adresse MAC et affichera l’IP
correspondante.
Le second programme prendra comme paramètre un nom de
fichier de stockage, une adresse MAC, une adresse IP et
modifiera le fichier de stockage afin de mémoriser le couple
MAC/IP passé en paramètre.
3
Construire la bibliothèque sous forme dynamique
(BUILD_SHARED_LIBS) et s’assurer que les exécutables
utilisent cette bibliothèque dynamique (ldd nomexécutable,
man ldd, man ld.so)
Systèmes d’exploitation – Master 2 SILI – 2016-2017
CMake
Construction, compilation et cross-compilation
46
CMake
Construction d’une bibliothèque
Manipulation
4
5
Partager le répertoire contenant les sources avec une machine
virtuelle, et compiler bibliothèque et exécutable sur les deux
systèmes, dans deux répertoires différents (partagés).
Essayer d’exécuter l’exécutable d’un des deux systèmes avec la
bibliothèque de l’autre système.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
47
CMake
CMake
Sous Windows
CMake est capable de générer des fichiers de construction pour la
plupart des compilateurs Windows.
On utilisera Visual C++ Express (installé sous MS Windows).
Manipulation
1
Compiler (et tester) sous Windows le programme Hello world
de l’exercice précédent.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
CMake
Construction, compilation et cross-compilation
48
CMake
Sous Windows
Défauts
Nécessité de disposer d’une licence de Windows, et de
redémarrer pour compiler (ou utiliser une machine virtuelle)
Nécessité d’installer Visual Studio C++
La cross-compilation permet de générer un exécutable destiné à
une plate-forme depuis une autre plate-forme.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
49
Cross-compilation
Chapitre II
Construction, compilation et
cross-compilation
1
Autoconf / Automake / Libtool
2
CMake
3
Cross-compilation
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Cross-compilation
Construction, compilation et cross-compilation
50
Cross-compilation
Compiler sous un couple système d’exploitation / architecture
matérielle un programme destiné à un autre couple système
d’exploitation / architecture matérielle.
Utilisé systématiquement pour l’embarqué, mais pas uniquement.
Il faut utiliser un compilateur spécifique (produisant du code
objet spécifique) et un éditeur de lien spécifique (produisant
un exécutable spécifique).
Mingw (http://mingw-w64.sf.net) est une adaptation de
GCC pour Windows.
Il permet de compiler du code 32 bits et 64 bits.
Il peut être utilisé sous Windows. . . ou sous Unix par
cross-compilation.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
51
Cross-compilation
Cross-compilation
Mingw
1
2
3
Installer Mingw (C et C++) à partir des packages
(g++-mingw-w64-i686).
Vérifier les noms des exécutables (dpkg -L
g++-mingw-w64-i686 |grep /usr/bin)
Appeler le script configure de l’application à compiler par
./configure ––build=x86_64-linux-elf
––host=i686-w64-mingw32
––build est optionnel et contient l’architecture utilisée pour la
construction (habituellement i686-linux-elf ou
x86_64-linux-elf)
––host contient l’architecture destination (préfixe de
l’exécutable de gcc, i686-w64-mingw32 ou
x86_64-w64-mingw32)
4
5
Lancer la compilation.
Tester le résultat : Wine, Machine virtuelle. . . ou reboot.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Cross-compilation
Construction, compilation et cross-compilation
52
Cross-compilation
Mingw
L’exécution requiert des bibliohtèques dynamiques à copier avec
l’exécutable : au moins libgcc_s_sjlj-1.dll et éventuellement
d’autres telles que libstdc++-6.dll (C++) à aller chercher dans
/usr/lib/gcc/i686-w64-mingw32/5.3-win32/ . . .
Et éventuellement d’autres bibliothèques qui doivent être
cross-compilées pour le système cible.
Manipulation
Créer une version Windows de GNU Hello par cross-compilation.
Systèmes d’exploitation – Master 2 SILI – 2016-2017
Construction, compilation et cross-compilation
53