J’ai testé Google Go sur mon Synology (CPU ARM). Voici des instructions de compilation, un exemple et mes impressions sur ce langage très intéressant. Go étant multiplateforme, vous pourrez utiliser cet exemple sur Windows, Linux…
Je présenterai Google Go dans d’autres billets. Disons en bref qu’il s’agit d’un nouveau langage conçu dans le but d’être performant, simple et adapté aux applications modernes. Il permet d’écrire très simplement des applications web, des drivers tout comme des logiciels de calcul distribué. Il est livré avec une bibliothèque complète qui, de base, permet d’accomplir pas mal de tâches.
Le plan de l’article :
- Exemple d’une application web que j’ai fait tourné sur mon Synology.
- Configuration du pare-feu du Synology pour un accès depuis mon poste à l’application.
- Comment faire une cross-compilation de Google go.
- Comment compiler Google go sur le Synology.
- Liens et téléchargement de l’exemple.
Exemple d’application
Si vous suivez les explications de cet article, vous serez capable de lancer une application web qui est un wiki minimaliste. Nous compilerons les sources que je vous fournirai. Le résultat sera un exécutable monolithique de moins de 4Mo (pas de liens vers des bibliothèques externes) contenant :
- Un serveur Web.
- Un moteur de template HTML.
- Une application web.
Je suis parti du code source fourni sur le Wiki officiel et j’y ai ajouté un serveur de contenu statique (pour prouver que l’on peut embarquer facilement la partie cliente avec Jquery UI et CKEditor) :
func main() { http.HandleFunc("/view/", makeHandler(viewHandler)) http.HandleFunc("/edit/", makeHandler(editHandler)) http.HandleFunc("/save/", makeHandler(saveHandler)) http.Handle("/", http.FileServer(http.Dir("static/"))) http.ListenAndServe(":9999", nil) }
Il y a d’autres légères modifications, telles que :
- Les articles sont stockés dans le sous-répertoire data.
- Les templates HTML sont stockés dans le sous-répertoire tmpl.
- Le contenu statique dans le sous-répertoire static.
- Le serveur web démarre sur le port 9999.
Si vous êtes curieux et que vous avez installé le paquet binutils, comme expliqué dans deux autres posts :
- Il n’y a pas d’utilitaire ldd sur mon Syno !
- Dopez votre Synology avec des centaines d’applications Linux
La commande readelf -d wiki montrera qu’il n’y a pas de bibliothèque liée. Tandis que la commande objdump -x wiki |more vous donnera une idée de la structure du binaire.
Une fois que vous aurez compilé (avec go compile wiki.go), il n’y a plus qu’à lancer cette application wiki.
Configuration du pare-feu Synology
Pour rappel, il faut configurer le pare-feu du Synology si vous souhaitez accéder à l’application depuis un autre ordinateur (votre bureau, par exemple). Faire comme illustré dans cette copie d’écran et ne pas oublier de sauvegarder pour que les règles puissent prendre effet (pas besoin de redémarrer).
Mais comment installer Go ?
On peut faire une cross compilation comme cela est expliqué dans un autre post ou compiler sur Synology (ça prend 15 minutes et il faut installer plusieurs logiciels avec ipkg).
Dans les deux cas, il faudra installer mercurial pour la commande hg dont go se sert pour récupérer des packages tiers. Quatre articles à relire avant de commencer :
Si vous avez déjà installé ipkg, mais mis à jour entre-temps le DSM, je vous conseille de jeter un coup d’oeil à cet article avant d’installer mercurial et/ou les autres outils nécessaires à la compilation (cf. README) :
Cross compilation
Mon post sur la cross-compilation a été écrit à l’époque du DSM 3.0, donc pensez à télécharger la bonne version de la toolchain sur Sourceforge.
En plus des exports indiqués dans le post précédent, mettez à jour les variables spécifiques à Go :
export USE_GO_TOOL=false export GOARCH=arm export GOHOSTARCH=arm export GOOS=linux export GOHOSTOS=linux
Puis lancez la commande :
./make.bash
Pas la peine de faire un ./all.bash puisque les tests ne pourront pas être lancés durant un cross build.
Compiler sur le Synology
Il faut préparer l’environnement comme suit avant de lancer la commande de compilation (./make.bash) :
export GOARCH=arm export GOARM=5 export USE_GO_TOOL=false export GOOS=linux
Sans quoi vous rencontrerez cette erreur à l’étape de compilation cmd/go :
This program can only be run on EABI kernels
À l’issue de la configuration, les données d’installation sont affichées (voir le README pour changer la cible que vous pouvez aussi copier dans optware) :
Installed Go for linux/arm in /volume1/homes/admin/go Installed commands in /volume1/homes/admin/go/bin
Utiliser Go
On prépare les variables (mettre à jour le fichier profile pour une utilisation permanente) :
export GOROOT=/volume1/homes/admin/go export GOBIN=$GOROOT/bin export PATH=$PATH:$GOBIN
Je répète que Go nécessite mercurial (pour la commande hg, voir mon post sur l’utilisation d’ipkg pour installer le paquet mercurial). Par exemple pour récupérer le toolkit web Gorilla :
go get code.google.com/p/gorilla/mux
Go fait appel à la commande hg qui échouera si elle n’est pas installée.
Premiers pas
Récupérez mon application de test et faites-vous la main dessus (go compile…).
Liens utiles
- Télécharger l’application exemple.
- Page du projet Google Go.
- Exemple de projet de grande ampleur : Vitess pour Youtube.
- Wikibook en français (peut-être pas tout à fait à jour, mais bien pour démarrer).
- Brève sur Linuxfr à propos du langage Go.
3 réponses sur « Compiler et utiliser Google Go sur CPU ARM »
Tu écris : « voir le README pour changer la cible que
vous pouvez aussi copier dans optware »
J’ai lu le README mais je n’ai pas trouvé d’instruction précises (par exemple quels sont les fichiers à déplacer exactement en plus du contenu de « bin »?)
Il semble qu’il faille définir aussi « GOROOT_FINAL » avant le build si on veut déplacer le résultat du build (cf http://golang.org/doc/install/source#environment)
Pour la liste des fichiers copiés, regardes le zip pour Linux. Parce qu’ils disent simplement (pour le zip Linux) de le dézipper entièrement vers /usr/local/go/ (http://golang.org/doc/install#freebsd_linux).
merci benjamin