Golang på BSD

Golang skrevs det om i Slashdot för ett litet tag sedan. Just då tänkte jag inte mycket på det förutom att källkoden inkluderade lib9 från Plan9.

Idag började vi dock prata om Erlang på IRC vilket fick mig att tänka på Golang på grund av likheterna i namnet. ;)

Så jag bestämde mig för att installera det på en labmaskin och testa. Jag har labmaskiner i VMware så är inte så begränsad av OS, men jag har mycket annat på en viss FreeBSD VM så jag körde på den trots att Golang sas endast stödja Linux och OS X.

Först installerade jag devel/mercurial som root.

cd /usr/ports/devel/mercurial
make install clean

Sen hämtade jag Golang.

rehash
cd ~
setenv GOROOT $HOME/go
setenv GOARCH amd64
setenv GOOS freebsd
setenv GOBIN $HOME/bin
mkdir $HOME/go $HOME/bin
hg clone -r release https://go.googlecode.com/hg/ $GOROOT

Det är nu saker börjar gå fel.

Dokumentationen säger att jag ska gå till $GOROOT/src och köra all.bash. Filändelsen tyder på vad shebang-raden bekräftar, filen är skriven med Bash som tolk.

Alla riktiga BSD-nissar förstår ju självklart att Bash inte finns installerat på FreeBSD som standard. No big deal?

Vad som nu gjorde att jag spenderade de resterande 15 minuterna med att våldföra mig på golang, både verbalt och kommandobaserat, istället för att bara installera Bash var ren och skär princip!

Funktionerna som Bourne Shell (sh) fyller är definierade av POSIX-standarden, om jag minns rätt. Open Group som numera sköter det skriver på sin webbsida hur skalet ska fungera och namnet på skalet. Bourne Shell fyller dessa kriterier på alla POSIX system jag använt. Linux, OS X och framförallt BSD.

Ändå valde någon att skriva installationen av Golang i Bash.

Detta förbryllar mig men jag tänkte att jag gör ett försök på att göra om filerna till Bourne Shell och kollar om det är något som kan portas.

Så jag börjar med lite regex som byter ut alla shebang rader med Bash mot sh. Observera: golang kräver också GNU Bison och GNU Make som förmodligen inte finns förinstallerade på ert BSD-system, dock simpelt att installera från ports.

cd $HOME/go/src
find . -name "*.bash" -type f -exec perl -pi -e 's/env bash/env sh/' {} \;
find . -name "*.bash" -type f -exec perl -pi -e 's/^\s*bash/sh/' {} \;
find . -name "*.sh" -type f -exec perl -pi -e 's/env bash/env sh/' {} \;
perl -pi -e 's/env bash/env sh/' cmd/gotest/gotest
grep -Hnr 'env bash' *
./all.bash

Tittar ni på de tre raderna med find och Perl ser ni direkt att golang distributionen är väldigt förvirrande. Jag upptäckte ytterligare förvirrande saker när jag körde find . -name "*.sh" -type f -exec head -1 {} \; där man ser att dom gjort Perl-scripts med .sh filändelse.

Nu vet ju alla att filändelse betyder lite i UNIX men dom är så noga med att döpa majoriteten av sina filer till .bash och glömmer samtidigt bort vissa medans andra är perl och döpa till .sh. Det saknas struktur i detta projektet.

Jag lyckades nu kompilera hela paketet så det gick att använda, dock ett felmeddelande mot slutet av kompileringen som jag inte kunde återskapa när jag manuellt körde kommandona från makefilen.

Felet kommer från archive/tar paketet.

Nu vet ni hur man installerar Golang på BSD, jag ska försöka mig på att testa de olika biblioteken nu så jag bekräftar att hela installationen faktiskt fungerar.

vim

En liten extra notis, för att få .go filer att fungera i vim kan ni kopiera $GOROOT/misc/vim/go.vim filen till $HOME/.vim/syntax.

Redigera sedan $HOME/.vim/filetype.vim och lägg till Go nånstans, i min ser det ut så här.

" Gkrellmrc
au BufNewFile,BufRead gkrellmrc,gkrellmrc_? setf gkrellmrc
 
" Google Golang
au BufNewFile,BufRead *.go setf go
 
" GP scripts (2.0 and onward)
au BufNewFile,BufRead *.gp          setf gp


Kommentarer

IRC

Och var kan man hitta swehack på IRC numer? Varken freequest, smashthestack eller irc.swehack.se fungerar!

//sniker

du hittar mig på freequest

du hittar mig på freequest genom en whois på namnet nocturnal. annars finns det ingen mer swehack på irc vad jag känner till. vi var ju dock inte först att använda det namnet så man vet aldrig vad du hittar på andra nätverk.