Truc du jour: quand les configurations d'exécution make ne trouvent pas Go

Dialogue du greffon "Makefile support" dans GoLand
Crédit image: Victor Kropp

Le problème

Dans une configuration d’exécution (GoLand 2018.3 EAP) make, les tâches trouvées depuis le Makefile trouvent bien le binaire go sur macOS, mais pas sur Ubuntu, provoquant des erreurs d’exécution comme celle-ci:

1
2
3
client/test.wasm: client/main.go
	# Building WASM
	GOARCH=wasm GOOS=js go build -o client/test.wasm client/main.go
1
2
3
/usr/bin/make -f (un chemin)/Makefile client/test.wasm
/bin/sh: 1: go: not found
make: *** [client/test.wasm] Error 127

En avant pour la correction…

Le diagnostic

Sur la ligne de commande, que donne la même instruction ?

1
GOARCH=wasm GOOS=js go build -o client/test.wasm client/main.go`

Aucune erreur, la compilation se passe bien: c’est donc un problème de chemin dans GoLand ou dans le greffon pour Make. Vérifions dans le Makefile:

1
2
3
4
client/test.wasm: client/main.go
	# "${PATH}"
	# Building WASM
	GOARCH=wasm GOOS=js go build -o client/test.wasm client/main.go
1
2
3
# Building WASM
make: *** [client/test.wasm] Error 127
# "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"

Donc, au moins sur cette version, la variable PATH n’est pas prise en compte. Corrigeons cela.

La solution

Évidemment, il serait possible de simplement ajouter le répertoire des binaires Go aux diverses tâches Make (donc dans le Makefile) des cibles de cette configuration d’exécution, mais puisque ce n’est pas nécessaire dans d’autres environnements, mieux vaut simplement rappeler à GoLand d’ajouter ce chemin à la configuration d’exécution.

  1. Exécuter echo $PATH en ligne de commande.
  2. Modifier la configuration d’exécution
  3. Modifier le champ Environment variables
  4. Ajouter une définition pour la variable d’environnement PATH, copiée/collée depuis le résultat de la première commande
  5. Appliquer les changements et fermer le dialogue

Bizarreries

Comme à l’accoutumée, make a son charme propre, et requiert que le nom de la variable soit utilisé entre accolades pour être reconnu, au lieu d’utiliser un simple $PATH.

Tenter de modifier la variable PATH en ajoutant simplement quelque chose comme $PATH:/usr/local/go/bin ou ${PATH}:/usr/local/go/bin au lieu d’en coller la valeur ne fonctionne pas:

  • dans le premier cas, make reçoit le résultat de l’évaluation de $P, et lui concatène la chaîne ATH, de sorte que les autres binaires situées dans des répertoires autres que /usr/local/go/bin sont inaccessibles
  • dans le second, make détecte une variable se référençant elle-même, et abandonne la tâche