Cross-compilation de Boost pour Windows sous Linux

À 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.

 

Vus : 1438
Publié par One More Blog : 26