À propos de l\’auteur : Fabien Danieau est doctorant à Rennes, entre l\’INRIA et Technicolor. Titulaire d\’un diplôme d\’Ingénieur en Cognitique, ses travaux portent actuellement sur l\’application des interfaces haptiques pour le multimédia.
Récemment j\’ai eu besoin de cross-compiler la librairie Boost nécessaire à un projet. Ce ne fût pas chose évidente, j\’ai pensé qu\’un retour d\’expérience pourrait être utile à plus d\’un.
Dans notre cas nous allons voir comment compiler Boost 1.47 pour Windows 32 bits sous une machine Linux ( la procédure décrite a été testée sous Debian Squeeze 64bits et Fedora 14 64bits).
Pré-requis
La librairie Boost se récupère aisément sur le site officiel. Pour la compilation j\’ai utilisé mingw-w32-bin_x86_64-linux_20110818. Le nom indique qu\’il va compiler des projets pour Windows 32bits (w32) et cette compilation se fera sous une machine linux 64 bits (x86_64-linux). On trouve ce compilateur sur le site officiel de mingw.
Pour la suite du tuto nous considéreront que les deux archives récupérées sont décompressées dans un dossier \ »BoostBuild\ » situé à la racine de notre home. Nous obtenons donc l\’architecture suivante.
BoostBuild
-- boost_1_47
-- mingw-w32-bin_x86_64-linux_20110818
Plaçons nous dans le répetoire boost_1_47 et attaquons les choses sérieuses!
cd ~
cd BoostBuild/boost_1_47
Procédure
Premièrement il faut créer un petit fichier de configuration pour indiquer à boost d\’utiliser mingw comme compilateur.
echo \"using gcc : mingw64 : i686-w64-mingw32-g++ : 4.6;\" > user-config.jam
Ceci ne suffisant pas pour que l\’emplacement du compilateur soit trouvé, nous allons modifier temporairement la variable PATH. Le compilateur (i686-w64-mingw32-g++) se trouve dans le dossier mingw-w32-bin_x86_64-linux_20110818/bin.
PATH=/home/fabien/BoostBuild/mingw-w32-bin_x86_64-linux_20110818/bin:$PATH
Cette commande fonctionnera chez les utilisateurs de Debian et autres dérivés. Les possesseurs d\’une Fedora utiliseront plutôt celle-ci.
setenv PATH /home/fabien/BoostBuild/mingw-w32-bin_x86_64-linux_20110818/bin:$PATH
Ensuite, comme indiqué dans la documentation de Boost, il faut appeler le script bootstrap.sh.
sh bootstrap.sh
Dans mon cas le script n\’a pas abouti pour cause de \ »Permission Denied\ ». En effet celui-ci essaie d\’en appeler une autre, build.sh, qui n\’est pas exécutable. D\’où l\’échec… Pour remédier à cela il suffit de faire:
chmod +x tools/build/v2/engine/build.sh
Enfin nous arrivons à la dernière étape, la fameuse compilation de boost. Il faut lancer la commande «./b2» comme nous l\’indique le script bootstrap.sh une fois sa tâche terminée. Cependant nous devons lui passer quelques paramètres spécifique à notre cross-compilation.
./b2 --user-config=user-config.jam --layout=versioned --toolset=gcc-mingw64 define=BOOST_USE_WINDOWS_H address-model=32 variant=debug,release link=static,shared threadapi=win32 target-os=windows stage
\ »user-config\ » et \ »toolset\ » indiquent le compilateur à utiliser. \ »define\ », \ »address-model\ » et \ »target-os\ » spécifient que l\’os cible est windows 32 bits. \ »variant\ » et \ »link\ » déterminent que l\’on veut compiler ici les librairies dynamiques, statiques en version release et debug. Ces arguments sont à modifier suivant vos besoins. L\’argument \ »layout\ » impose ici d\’indiquer ces informations de version dans le nom des fichiers produits.
La compilation est en route, vous devriez voir les librairies apparaître dans le dossier boots_1_47/stage/lib. Cette étape peut prendre un peu de temps suivant les performances de votre machine. Pour une compilation plus rapide n\’hésitez pas à utiliser l\’argument supplémentaire \ »-j n\ » avec n le nombre de processeurs que vous possèdez.
Compilation pour Win64
Si cette article est dédiée à la compilation de la librairie Boost pour windows 32 bits, il est facile de l\’adapter à windows 64 bits. Il vous faudra alors télécharger mingw64-w64 et modifier un peu les arguments de la dernière commande (address-model=64 entre autres). Je n\’ai pas testé mais cela devrait fonctionner.
Anciennes versions de Boost
Si vous voulez compiler une ancienne version de boost (boost_1_46_1 par exemple) il ne faudra pas appeler \ »./b2\ » lors de la dernière étape mais \ »./bjam\ ». L\’ensemble des arguments restent les mêmes.
Références
Quelques références utiles.
- La doc officielle de Boost bien sûr
- Une page expliquant la compilation de Boost avec mingw64 sous windows
- Un article indiquant comment compiler une librairie spécifique dans boost (ici thread)
- Un autre article intéressant avec des infos sur la cross compilation, notamment de Boost
Dans le cadre du débuggage d\’un programme C, j\’ai été amené à écrire dans un fichier plus de 5 millions de valeurs numériques dans le but de les trier ensuite et de supprimer les doublons (\ »Ah le mec qui debug avec des printf()!\ » – Ouai ben des fois y\’a que ça d\’efficace!) . Une fois ce fichier généré, soit environ 40Mo, je me suis posé la question de l\’outil à utiliser pour effectuer les opérations dont j\’avais besoin. J\’ai pensé à plusieurs choses :
Pour peu qu\’on ait un dual-boot géré par Grub 2, la liste des noyaux proposée au démarrage s\’allonge au fur et à mesure des nouvelles versions. Dans la version précédente de Grub, l\’édition du fichier /boot/grub/menu.lst permettait de personnaliser cette liste et en particulier de supprimer de l\’affichage les noyaux antérieurs pour ne garder par exemple que les deux derniers.
Lorsque l\’on souhaite planifier de façon régulière l\’exécution d\’une commande ou d\’un script, le plus efficace reste l\’utilisation de 