MacPortsでインストールしたgolangのコードにちょっと手を加えてbuildしてみる

MacPortsでインストールしたgolangのコードにちょっと手を加えてbuildしてみる

golang で今使っている go コマンド自体のソースコードを見る方法が意外と楽に提供されているのでmemo。

現在の go コマンドが利用しているソースコードの位置を調べる

go tool dist env で表示されている GOROOT の中を覗けば良い。

 $ go tool dist env
CC="clang"
CC_FOR_TARGET="clang"
GOROOT="/opt/local/go"
GOBIN="/opt/local/go/bin"
GOARCH="amd64"
GOOS="darwin"
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOTOOLDIR="/opt/local/go/pkg/tool/darwin_amd64"
GOCHAR="6"

build方法

今使っている go コマンド自体のbuildは以下の様にする

$ cd /opt/local/go
$ cd src
$ sudo su 
# . ./all.bash

どうせ今のmac自体を自分しか使わないというのであれば chown で権限書き換えちゃって作業しても良いような気がする。

ちょっとだけ変更を加えてみる

build/build.goでimportPathに追加している部分を表示してみる。

diff --git a/go/build/build.go b/go/build/build.go
index dd9e429..4688502 100644
--- a/go/build/build.go
+++ b/go/build/build.go
@@ -733,6 +733,7 @@ Found:
                    testImported[path] = append(testImported[path], fset.Position(spec.Pos()))
                } else {
                    pos := fset.Position(spec.Pos())
+                   fmt.Printf("path:%s, filename:%s, line: %d\n", path, pos.Filename, pos.Line);
                    imported[path] = append(imported[path], fset.Position(spec.Pos()))
                }
                if path == "C" {

手元の環境では コンパイラclang を使うように環境変数を渡してあげないとダメだった。 テストなども全部走るので後で何が行われるか把握して省略できるところ省略していきたい。

$ pwd
/opt/local/go/src
$ CC=clang ./all.bash
# Building C bootstrap tool.
cmd/dist
... snip
ok      unicode/utf16   0.007s
ok      unicode/utf8    0.011s
?       unsafe  [no test files]

例えばこの時 hello.go のようなものを go run なり go build をするとimportのタイミングで読んでいるファイルが見えるようになる。

$ cat /tmp/hello.go
package main

import "fmt"

func main() {
    fmt.Printf("hello world\n")
}
path:fmt, filename:/tmp/hello.go, line: 3
path:math, filename:/opt/local/go/src/fmt/format.go, line: 8
path:strconv, filename:/opt/local/go/src/fmt/format.go, line: 9
... snip
path:errors, filename:/opt/local/go/src/strconv/atoi.go, line: 7
path:math, filename:/opt/local/go/src/strconv/ftoa.go, line: 13
path:unicode/utf8, filename:/opt/local/go/src/strconv/quote.go, line: 10
hello world