Cross Comstack Allez sur OSX?

J’essaie de comstackr une application go sur OSX pour créer des binarys pour Windows et Linux. J’ai lu tout ce que je pouvais trouver sur le net. L’exemple le plus proche que j’ai trouvé a été publié (à part de nombreuses discussions inachevées sur la liste de diffusion):

http://solovyov.net/en/2012/03/09/cross-compiling-go/

pourtant cela ne fonctionne pas sur mon installation. Je suis allé 1.0.2. Comme 1.0.2 est assez récent, il me semble que tous les exemples ci-dessus ne s’appliquent pas à cette version.

Essayé de faire ./make.bash --no-clean avec ENV vars mis à 386 / windows, il ne va pas, mais il construit pour mon installation qui est darwin/amd64 et ignore complètement ce qui est défini dans ENV qui suppose construire un compilateur différent.

Est-ce que tout conseille comment cela peut être fait (si cela peut être fait du tout)?

Avec Go 1.5, ils semblent avoir amélioré le processus de compilation croisée, ce qui signifie qu’il est maintenant intégré. Non ./make.bash -ing ou brew requirejs. Le processus est décrit ici, sauf pour les TLDR (comme moi): vous définissez GOARCH les variables d’environnement GOOS et GOARCH et exécutez la construction go.

Pour les copieurs-copieurs encore plus paresseux (comme moi), faites quelque chose comme ça si vous êtes sur un système * nix:

 env GOOS=linux GOARCH=arm go build -v github.com/path/to/your/app 

Vous avez même appris l’astuce env , qui vous permet de définir des variables d’environnement pour cette commande uniquement, complètement gratuitement.

Merci à gentil et patient aide de golang-noix, recette suit:

1) Il faut comstackr le compilateur Go pour différentes plates-formes et architectures cibles. Ceci est fait depuis l’installation du dossier src. Dans mon cas, l’installation se trouve dans /usr/local/go pour comstackr un compilateur dont vous avez besoin pour make utilitaire. Avant de faire cela, vous devez connaître certaines réserves.

Lors de la compilation croisée, il existe un problème avec la bibliothèque CGO. Il est donc nécessaire de désactiver la bibliothèque CGO.

La compilation est effectuée en changeant l’emplacement vers le répertoire source, car la compilation doit être effectuée dans ce dossier.

 cd /usr/local/go/src 

puis comstackz le compilateur Go:

 sudo GOOS=windows GOARCH=386 CGO_ENABLED=0 ./make.bash --no-clean 

Vous devez répéter cette étape pour chaque système d’exploitation et chaque architecture que vous souhaitez comstackr en modifiant les parameters GOOS et GOARCH.

Si vous travaillez en mode utilisateur comme je le fais, sudo est nécessaire car go comstackr est dans le répertoire système, sinon vous devez être connecté en tant que super utilisateur. Sur Mac, vous devrez peut-être activer / configurer l’access SU (il n’est pas disponible par défaut), mais si vous avez réussi à l’installer, vous avez probablement déjà un access root.

2) Une fois tous les compilateurs croisés créés, vous pouvez comstackr votre application en utilisant les parameters suivants:

 GOOS=windows GOARCH=386 go build -o appname.exe appname.go GOOS=linux GOARCH=386 CGO_ENABLED=0 go build -o appname.linux appname.go 

Changez GOOS et GOARCH pour les cibles que vous souhaitez construire.

Si vous rencontrez un problème avec CGO, incluez CGO_ENABLED = 0 dans la ligne de commande, notez également que les fichiers binarys pour Linux et Mac n’ont aucune extension, vous pouvez donc append une extension pour avoir des fichiers différents. -o switch ordonne d’aller faire un fichier de sortie similaire aux anciens compilateurs pour c / c ++ ainsi appname.linux ci-dessus peut être toute autre extension.

Si vous utilisez Homebrew sous OS X, vous avez une solution plus simple:

 $ brew install go --with-cc-common # Linux, Darwin, and Windows 

ou..

 $ brew install go --with-cc-all # All the cross-comstackrs 

Utilisez la reinstall si vous êtes déjà installé.

Vous pouvez le faire assez facilement avec Docker, donc pas de librairie supplémentaire requirejse. Il suffit de lancer cette commande:

 docker run --rm -it -v "$GOPATH":/go -w /go/src/github.com/iron-io/ironcli golang:1.4.2-cross sh -c ' for GOOS in darwin linux windows; do for GOARCH in 386 amd64; do echo "Building $GOOS-$GOARCH" export GOOS=$GOOS export GOARCH=$GOARCH go build -o bin/ironcli-$GOOS-$GOARCH done done ' 

Vous pouvez trouver plus de détails dans cet article: https://medium.com/iron-io-blog/how-to-cross-comstack-go-programs-using-docker-beaa102a316d

pour les personnes nécessitant l’activation de CGO et la compilation croisée à partir de fenêtres de ciblage OSX

J’avais besoin de CGO lors de la compilation de windows depuis mon mac depuis que j’avais importé le https://github.com/mattn/go-sqlite3 et qu’il en avait besoin. Comstackr selon d’autres réponses m’a donné et erreur:

 /usr/local/go/src/runtime/cgo/gcc_windows_amd64.c:8:10: fatal error: 'windows.h' file not found 

Si vous êtes comme moi et que vous devez comstackr avec CGO. C’est ce que j’ai fait:

1. Nous allons comstackr les fenêtres avec une bibliothèque dépendant de CGO. Nous avons d’abord besoin d’un compilateur croisé installé comme mingw-w64

 brew install mingw-w64 

Cela l’installera probablement ici /usr/local/opt/mingw-w64/bin/ .

2. Tout comme les autres réponses, nous devons d’abord append notre Windows Arch à notre chaîne d’outils Go Comstackr. Comstackr un compilateur a besoin d’un compilateur (phrase étrange) comstackr aller comstackr a besoin d’un compilateur pré-construit séparé. Nous pouvons télécharger un binary préconfiguré ou le comstackr à partir d’un source, par exemple: ~/Documents/go now, nous pouvons améliorer notre compilateur Go, mais avec CGO_ENABLED=1 et notre compilateur séparé GOROOT_BOOTSTRAP (Pooya est mon nom d’utilisateur) ):

 cd /usr/local/go/src sudo GOOS=windows GOARCH=amd64 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean sudo GOOS=windows GOARCH=386 CGO_ENABLED=1 GOROOT_BOOTSTRAP=/Users/Pooya/Documents/go ./make.bash --no-clean 

3. Maintenant, tout en compilant notre code Go, utilisez mingw pour comstackr nos fenêtres de ciblage de fichiers avec CGO activé:

 GOOS="windows" GOARCH="386" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/i686-w64-mingw32-gcc" go build hello.go GOOS="windows" GOARCH="amd64" CGO_ENABLED="1" CC="/usr/local/opt/mingw-w64/bin/x86_64-w64-mingw32-gcc" go build hello.go