Compiler et utiliser Google Go sur CPU ARM

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 :

  1. Exemple d’une application web que j’ai fait tourné sur mon Synology.
  2. Configuration du pare-feu du Synology pour un accès depuis mon poste à l’application.
  3. Comment faire une cross-compilation de Google go.
  4. Comment compiler Google go sur le Synology.
  5. 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.
Exemple d'une application web avec Google Go

Exemple d'une application web avec Google Go (wiki)

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 :

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

Configuration du firewall du Synology pour l'application web avec Google Go

Configuration du firewall du Synology

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

 

3 réflexions au sujet de « Compiler et utiliser Google Go sur CPU ARM »

  1. CoolRaoul

    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)

    Répondre

Laisser un commentaire

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