Cross-compilation pour Synology

Voici comment compiler un logiciel open source depuis un ordinateur Linux alors qu’il sera utilisé sur le Synology.

Avant de vous lancer dans la compilation d’un logiciel open source, il vaudrait mieux regarder s’il n’existe pas une version déjà compilée pour votre NAS et disponible sous la forme d’un paquet IPKG.

Le principe de la cross-compilation est de compiler des sources sur une plateforme (Linux dans notre cas) alors que l’exécutable produit sera utilisé sur une autre plateforme (le Synology dans notre cas). Rien ne vaut un schéma pour tout clarifier.

Cross_compilation_Linux_synology

Principe de la cross compilation sous Linux

En synthèse, la marche à suivre sera la suivante :

  1. Maîtriser certaines manipulations sur le NAS (accès par Telnet ou SSH).
  2. Obtenir la toolchain (obligatoire pour compiler des choses pour le NAS, mais depuis un PC tournant sous Linux).
  3. Configurer l’environnement du PC Linux qui servira à la compilation.
  4. Télécharger les sources de l’application à compiler.
  5. Compiler les sources.
  6. Copier les fichiers compilés avec FTP, WinSCP ou autre. Depuis le PC Linux vers le Synology.

Étapes préliminaires

Il faut posséder une machine qui tourne sous Linux pour effectuer les manipulations décrites dans ce post. Elle peut être virtuelle (avec VMWare ou Virtual Box), mais cela ne marchera pas avec CygWin, ni avecVisual Studio ou MinGW qui ne savent pas produire des exécutables au format ELF.

Les fondamentaux

La lecture de ce billet nécessite en prérequis fondamental de savoir utiliser SSH ou telnet avec son Synology (notamment pour récupérer la version de Linux du Syno).

Le modèle de CPU

Il faut connaître la famille de processeur qui équipe votre Synology à l’aide de cette page qui donne la correspondance. Ne pas confondre famille de processeur et modèle. Par exemple, mon PC est équipé d’un Intel Q6600 (le modèle), mais la famille de CPU est soit i686 ou x86_64 (selon si on souhaite faire une compilation 32bits ou 64bits). Il en va de même pour les Synology. Je suis l’heureux possesseur d’un DS211j équipé d’un Feroceon (le modèle), mais la famille du CPU est Marvell Kirkwood mv6281. Gardez cette information pour la partie compilation du Kernel, que l’on verra en fin d’article.

La version de Linux du Syno

Connectez-vous sur le Synology via Telnet ou SSH et utilisez la commande uname -r qui devrait renvoyer par exemple 2.6.32.12. Cela sera utile pour plus tard.

Obtention de la toolchain

Rendez-vous sur Sourceforge pour obtenir la toolchain. Il s’agit d’un ensemble d’outils permettant de compiler un logiciel pour qu’il soit exécuté sur le Synology. La toolchain ne s’installe pas sur le NAS, mais sur un ordinateur Linux. Le fait de compiler des sources sur un système (Linux), alors que l’exécutable produit tournera sur un autre système (le NAS Synology) s’appelle la compilation croisée (ou cross-compilation en anglais).

Dans mon cas, comme la famille de CPU de mon NAS est de type Marvell 628x et que la version de Linux est la 2.6.32.12 ; j’ai cliqué sur ce lien : http://sourceforge.net/projects/dsgpl/files/DSM%203.1%20Tool%20Chains/Marvell%2088F628x%20Linux%202.6.32/pour obtenir l’archive gcc421_glibc25_88f628x.tgz.

Toujours sur l’ordinateur Linux, décompressez la toolchain dans /usr/local/ avec, par exemple, la commande tar zxpf gcc421_glibc25_88f6281.tgz –C /usr/local/

Compilation d’un logiciel

Préparation de l’environnement

Sur la machine Linux sur laquelle vous allez compiler, ouvrez un terminal et préparez l’environnement de compilation en positionnant différentes variables système avec ces commandes (à adapter en fonction de la toolchain que vous avez téléchargée. Si votre NAS est basé sur une architecture PowerPC, il faudra remplacer arm-none-linux-gnueabi par powerpc-linux-gnuspe) :

export CFLAGS="-I/usr/local/arm-none-linux-gnueabi/include"
export LDFLAGS="-L/usr/local/arm-none-linux-gnueabi/lib"
export RANLIB=/usr/local/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ranlib
export LD=/usr/local/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-ld
export CC=/usr/local/arm-none-linux-gnueabi/bin/arm-none-linux-gnueabi-gcc
export LD_LIBRARY_PATH=/usr/local/arm-none-linux-gnueabi/lib
export ARCH=arm

Compilation du logiciel

On récupère les sources de l’application à compiler. Dans le même terminal que l’on a préparé à l’étape précédente, on préparera et on lancera la compilation. La plupart des applications open source se compilent avec la séquence d’instructions suivantes :

./configure

make

Peut-être faudra-t-il utiliser la commande ./configure --host=ARM (à adapter selon la plateforme cible – c’est-à-dire le modèle de votre Synology). Le but de ce billet n’est pas de couvrir tous les cas possible. aussi, je vous invite à consulter le fichier README ou INSTALL livré avec le logiciel open source ou bien de fouiller dans la documentation et le site web de l’application afin d’obtenir plus de détails sur les instructions de compilation.

Astuce : La compilation peut être accélérée si vous avez un CPU multicœur avec la commande (par exemple pour 4 coeurs) make modules -j 4.

Copie du logiciel sur le Syno

Voir ce post pour la copie sécurisée à l’aide de WinSCP si vous êtes sous Windows. J’ai fait un essai depuis Linux, avec – comme expliqué dans le post – l’utilisation du protocole fish (c’est à dire SCP sous Konqueror). On se retrouve alors avec un explorateur de fichier très pratique (mais qui donne accès à tout le disque système, donc possibilité de faire des dégâts si vous supprimez un répertoire système).

Konqueror_fish

Exemple d'utilisation du protocole SCP sous Konqueror

Il ne reste plus qu’à copier les fichiers compilés sur le Synology. Bien sûr, l’installation du logiciel sur le Synology pourrait nécessiter des étapes supplémentaires, mais là encore, ce n’est pas le but de l’article d’en fournir exhaustivement tous les détails.

Sources documentaires

10 réflexions au sujet de « Cross-compilation pour Synology »

  1. Raphael

    Bonjour,

    Merci pour ce tuto, mais une petite erreur c’est glissé dans la rubrique « Préparation de l’environnement ».

    Il faut lire: export LDFLAGS= »-L/usr/local/arm-none-linux-gnueabi/lib »

    Raphael

    Répondre
  2. Thomas

    J’ai l’erreur suivante à la compilation :
    ../../hidapi/linux/hid.c:44:21: error: libudev.h: No such file or directory
    Comment corriger ?

    Merci
    Thomas

    Répondre
  3. jcd_29

    Salut,
    une question concernant la librairie Xuggle. Je voudrais l’utiliser sur le Syno 212j MAIS la partie java se base sur du natif … J’ai lu ton post. Pourquoi pas pas me lancer là dedans. Par contre pour la faisabilité, je n’ai pas beaucoup de recul. Cela fait bien longtemps que j’ai pas fait ça.
    Si tu as un peu de temps, tu peux me donner ton avis ? Voilà les infos pour la compil : http://www.xuggle.com/xuggler/build
    Je voudrais savoir si je vais dans le mur (aïe) ou pas …
    Merci d’avance de tes infos,
    Jean

    Répondre
  4. Philippe

    Bon, juste pour info et en conclusion, si ça peux aider qq’un,
    j’avais quelques soucis de compilation.
    Alors j’ai essayé la Toolchain DSM 5.0 Beta (mon syno est en DSM 4.3).
    Ça fonctionne parfaitement. Aucun souci de glibc ou autre.
    Philippe

    Répondre
  5. Greg

    Bonjourr Benjamin,

    Super tuto, avec des explications claires, merci ! J’ai tenté de compiler le wallet Dogecoin sur un Synology (DS214 : Marvell Armada XP) et apparemment, ma dernière solution semble la cross compilation. Pour compiler ce programme, j’ai besoin de quelques librairies (OpenSSL, Berkeley DB, Boost, miniupnpc …) Si j’ai bien compris, je dois donc installer ces librairies sur mon Linux, disons Ubuntu x86, comme si j’allais compiler pour Ubuntu mais utiliser le gcc fourni par Synology ? J’ai lu quelques part que ces toolchains étaient destinés aux OS x86, peut on les utiliser pour cross compiler sur un Ubuntu 64 bits ou pas du tout ?

    Merci d’avance si tu peux m’éclairer sur ces points.

    Répondre
  6. Rom1

    Bonjour,

    J’ai suivi ton tuto mais je rencontre quelques soucis.
    J’essaie d’installer rcracki_mt sur mon NAS Synology DS412+ avec DSM 5.1.
    http://sourceforge.net/projects/rcracki/files/rcracki_mt/rcracki_mt_0.7.0/rcracki_mt_0.7.0_src.7z/download
    uname -a
    Linux NAS 3.2.40 #5022 SMP Wed Jan 7 14:19:42 CST 2015 x86_64 GNU/Linux synology_cedarview_412+
    uname -r
    3.2.40

    J’ai donc téléchargé cette toolchain:
    http://sourceforge.net/projects/dsgpl/files/DSM%205.1%20Tool%20Chains/Intel%20×86%20Linux%203.2.40%20%28Cedarview%29/gcc473_glibc217_x86_64_cedarview-GPL.tgz/download

    Le souci c’est que je n’arrive pas à cross-compiler malgré tes indications.
    En effet, dans le dossier des sources de rcracki_mt, il n’y a pas de script ./configure. Du coup je pense que les variables d’environnement que l’on définit vers la toolchain ne sont pas prises en compte.

    J’ai également essayé de modifier les variables d’environnement présentes dans le makefile, mais cela m’affiche des erreurs lors de la compilation.

    Petite précision: rcracki_mt a besoin d’un compilateur C++. J’ai donc modifié la variable CC pour lui mettre ….g++, toujours sans succès.

    Quelqu’un aurait-il une solution ou une piste ?

    Merci par avance

    Répondre
  7. Selso LIBERADO

    Bonjour,
    Merci pour ce tuto.
    vous n’êtes en principe pas obligé de définir les répertoires standard pour les bibliothèques et include de votre toolchain, elle les trouvera tout seul.
    Par contre si on n’installe que la toolchain, on peut manquer de ressource pour compiler un logiciel, ou le compiler avec certaines restrictions : par exemple on ne pourra compiler « svn » avec le support du cryptage, pourtant hébergé sur votre nas. Il faut alors d’abord compiler cette dépendance (et ses dépendances), et l’installer (avec ses includes) dans ce qui s’apparentera à l’image de votre système de fichier.

    Bref la toolchain seule devient rapidement très contraignante à utiliser, il vaut mieux essayer d’avoir un générateur de système de fichier tel buildroot ou autre si l’on souhaite exploiter les possibilités du NAS. Pour ça il faudrait se tourner vers la communauté qui a généré les ipkg 😉

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *