Catégories
Développement Synology

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

12 réponses sur « Cross-compilation pour Synology »

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

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

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

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

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.

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

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 😉

Hello,

Merci pour toutes ces informations claires et concises.
J’ai essayé la marche à suivre pour un DS713+ (Intel Atom D2700 x86_64) mais je n’arrive pas à déterminer certains paramètres.

il s’agit de:
export ARCH=xxxx
./configure –host=xxxx

J’ai essayé avec x64 ou encore x86_64-pc-linux-gnu mais sans succès J’obtiens toujours l’erreur suivante lors de la compilation:

checking whether the C compiler works… no
configure: error: C compiler cannot create executables

Est-ce que quelqu’un pourrais me renseigner sur ces champs s’il vous plait ?

IL faut que machine de développement et la machine cible soient de même architecture.
Shay, je pense que votre machine de développement n’est pas x86_64.
Tout simplement les binaires de la toulchain sont de type x86_64 que tu essaye de les exécuter sur une machine de type x86 par exemple.

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.