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