...
Run Format

Package build

import "go/build"
Overview
Index

Overview ▾

buildパッケージはGoのパッケージの情報を収集します。

Go Path

GoのパスはGoのソースコードが入ったディレクトリツリーのリストです。 標準のGoのツリー内に見つからなかったインポートはここから探されます。 デフォルトのパスはGOPATH環境変数の値で、 OSに応じたパスのリストとして解釈されます(Unixならばコロン区切りの文字列、 Windowsならばセミコロン区切りの文字列、Plan 9ならばリスト)。

Goのパスにあるそれぞれのディレクトリはあらかじめ決められた構造を持ちます:

src/ディレクトリにはソースコードが入ります。 'src'以下のパスがインポートするパスや実行ファイルの名前になります。

pkg/ディレクトリにはインストールされたパッケージオブジェクトが入ります。 Goのツリーでは、ターゲットとするOSとアーキテクチャのペアごとにサブディレクトリ (pkg/GOOS_GOARCH)が作られます。

DIRがGoのパスにあるディレクトリとすると、 DIR/src/foo/barは"foo/bar"としてインポートされ、 "DIR/pkg/GOOS_GOARCH/foo/bar.a"としてコンパイルされます。 (gccgoの場合は"DIR/pkg/gccgo/foo/libbar.a")

bin/ディレクトリにはコンパイル済みのコマンドが入ります。 各コマンドはソースディレクトリに基づいて名前が付けられますが、 パス全体ではなく、最後の要素だけが使われます。 つまり、DIR/src/foo/quuxはDIR/bin/quuxになるのであって、 DIR/bin/foo/quuxにはなりません。 DIR/binをPATHに加えればインストールされたコマンドを使えるようにするために、 fooは取り除かれます。

以下はディレクトリレイアウトの例です:

GOPATH=/home/user/gocode

/home/user/gocode/
    src/
        foo/
            bar/               (barパッケージのgoコード)
                x.go
            quux/              (mainパッケージのgoコード)
                y.go
    bin/
        quux                   (インストールされたコマンド)
    pkg/
        linux_amd64/
            foo/
                bar.a          (インストールされたパッケージオブジェクト)

Build Constraints

ビルド制約はビルドタグとしても知られており、 以下に示す文字列で始まる行コメントです。

// +build

この後にそのファイルがパッケージに含められる条件を列挙します。 制約はGoに限らずあらゆる種類のソースコードに記載できますが、 ファイルの先頭付近に存在する必要があり、 空行や他の行コメントよりも先に存在する必要があります。 まとめると、Goのファイルではビルド制約はパッケージ文より前に存在しなければならないということになります。

パッケージドキュメントとビルド制約を識別するために、 ビルド制約の前に空行を1行入れる必要があります。

ビルド制約は、スペースで区切るとOR条件になり、 カンマで区切るとAND条件になります。 それぞれの語は英数字の単語で、先頭に!を付けると否定になります。 以下にビルド制約の例を示します:

// +build linux,386 darwin,!cgo

これは以下のような論理式を意味します。

(linux AND 386) OR (darwin AND (NOT cgo))

ひとつのファイルは複数のビルド制約を持つことができます。 全体としての制約は個々の制約をANDで組み合わせたものになります。 以下のようなビルド制約があるとします:

// +build linux darwin
// +build 386

これは以下のような論理式を意味します:

(linux OR darwin) AND 386

以下の条件は毎回のビルドで満たされます:

- runtime.GOOSで示される対象OS
- runtime.GOARCHで示される対象アーキテクチャ
- "gc"あるいは"gccgo"のどちらかの使われているコンパイラ
- ctxt.CgoEnabledがtrueの場合、"cgo"
- Goのバージョンが1.1の場合、"go1.1"
- Goのバージョンが1.2の場合、"go1.2"
- Goのバージョンが1.3の場合、"go1.3"
- ctxt.BuildTagsに列挙された追加の条件

ファイル名から拡張子と(あれば)_test接尾詞を除いたものが、 以下のパターンのいずれかにマッチする場合:

*_GOOS
*_GOARCH
*_GOOS_GOARCH

(例: source_windows_amd64.go)または以下のリテラルである場合:

GOOS
GOARCH

(例: windows.go) GOOSとGOARCHはそれぞれ既知のOSとアーキテクチャの値を取り、 ファイルはそれらの語が示すビルド制約を暗黙的に持つものとして扱われます。

ファイルをビルドしないようにするには以下のようにします:

// +build ignore

(他の条件に関係なく“ignore”は効果を発揮します。)

ファイルをcgoだけを使ってLinuxとOS X上だけでビルドするには以下のようにします:

// +build linux,cgo darwin,cgo

このようなファイルはたいてい他のシステム用のデフォルトの振る舞いを実装したファイルとペアになっており、 そちらのファイルには以下のような制約が必要になるでしょう:

// +build !linux,!darwin !cgo

dns_windows.goというファイル名を付けると、 Windows向けにパッケージをビルドしたときだけそのファイルが含まれるようになります。 同様に、math_386.sは32ビットのx86向けにパッケージをビルドしたときだけ含まれます。

本ドキュメントは以下のドキュメントを翻訳しています: https://code.google.com/p/go/source/browse/src/pkg/go/build/doc.go?r=f15ad332ce135a5b23bfb7d521594afe9fd42f8b

Variables

var ToolDir = filepath.Join(runtime.GOROOT(), "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH)

ToolDir is the directory containing build tools.

func ArchChar

func ArchChar(goarch string) (string, error)

ArchChar returns the architecture character for the given goarch. For example, ArchChar("amd64") returns "6".

func IsLocalImport

func IsLocalImport(path string) bool

IsLocalImport reports whether the import path is a local import path, like ".", "..", "./foo", or "../foo".

type Context

type Context struct {
    GOARCH      string // target architecture
    GOOS        string // target operating system
    GOROOT      string // Go root
    GOPATH      string // Go path
    CgoEnabled  bool   // whether cgo can be used
    UseAllFiles bool   // use files regardless of +build lines, file names
    Compiler    string // compiler to assume when computing target paths

    // The build and release tags specify build constraints
    // that should be considered satisfied when processing +build lines.
    // Clients creating a new context may customize BuildTags, which
    // defaults to empty, but it is usually an error to customize ReleaseTags,
    // which defaults to the list of Go releases the current release is compatible with.
    // In addition to the BuildTags and ReleaseTags, build constraints
    // consider the values of GOARCH and GOOS as satisfied tags.
    BuildTags   []string
    ReleaseTags []string

    // The install suffix specifies a suffix to use in the name of the installation
    // directory. By default it is empty, but custom builds that need to keep
    // their outputs separate can set InstallSuffix to do so. For example, when
    // using the race detector, the go command uses InstallSuffix = "race", so
    // that on a Linux/386 system, packages are written to a directory named
    // "linux_386_race" instead of the usual "linux_386".
    InstallSuffix string

    // JoinPath joins the sequence of path fragments into a single path.
    // If JoinPath is nil, Import uses filepath.Join.
    JoinPath func(elem ...string) string

    // SplitPathList splits the path list into a slice of individual paths.
    // If SplitPathList is nil, Import uses filepath.SplitList.
    SplitPathList func(list string) []string

    // IsAbsPath reports whether path is an absolute path.
    // If IsAbsPath is nil, Import uses filepath.IsAbs.
    IsAbsPath func(path string) bool

    // IsDir reports whether the path names a directory.
    // If IsDir is nil, Import calls os.Stat and uses the result's IsDir method.
    IsDir func(path string) bool

    // HasSubdir reports whether dir is a subdirectory of
    // (perhaps multiple levels below) root.
    // If so, HasSubdir sets rel to a slash-separated path that
    // can be joined to root to produce a path equivalent to dir.
    // If HasSubdir is nil, Import uses an implementation built on
    // filepath.EvalSymlinks.
    HasSubdir func(root, dir string) (rel string, ok bool)

    // ReadDir returns a slice of os.FileInfo, sorted by Name,
    // describing the content of the named directory.
    // If ReadDir is nil, Import uses ioutil.ReadDir.
    ReadDir func(dir string) (fi []os.FileInfo, err error)

    // OpenFile opens a file (not a directory) for reading.
    // If OpenFile is nil, Import uses os.Open.
    OpenFile func(path string) (r io.ReadCloser, err error)
}

A Context specifies the supporting context for a build.

var Default Context = defaultContext()

Default is the default Context for builds. It uses the GOARCH, GOOS, GOROOT, and GOPATH environment variables if set, or else the compiled code's GOARCH, GOOS, and GOROOT.

func (*Context) Import

func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Package, error)

Import returns details about the Go package named by the import path, interpreting local import paths relative to the srcDir directory. If the path is a local import path naming a package that can be imported using a standard import path, the returned package will set p.ImportPath to that path.

In the directory containing the package, .go, .c, .h, and .s files are considered part of the package except for:

- .go files in package documentation
- files starting with _ or . (likely editor temporary files)
- files with build constraints not satisfied by the context

If an error occurs, Import returns a non-nil error and a non-nil *Package containing partial information.

func (*Context) ImportDir

func (ctxt *Context) ImportDir(dir string, mode ImportMode) (*Package, error)

ImportDir is like Import but processes the Go package found in the named directory.

func (*Context) MatchFile

func (ctxt *Context) MatchFile(dir, name string) (match bool, err error)

MatchFile reports whether the file with the given name in the given directory matches the context and would be included in a Package created by ImportDir of that directory.

MatchFile considers the name of the file and may use ctxt.OpenFile to read some or all of the file's content.

func (*Context) SrcDirs

func (ctxt *Context) SrcDirs() []string

SrcDirs returns a list of package source root directories. It draws from the current Go root and Go path but omits directories that do not exist.

type ImportMode

type ImportMode uint

An ImportMode controls the behavior of the Import method.

const (
    // If FindOnly is set, Import stops after locating the directory
    // that should contain the sources for a package.  It does not
    // read any files in the directory.
    FindOnly ImportMode = 1 << iota

    // If AllowBinary is set, Import can be satisfied by a compiled
    // package object without corresponding sources.
    AllowBinary

    // If ImportComment is set, parse import comments on package statements.
    // Import returns an error if it finds a comment it cannot understand
    // or finds conflicting comments in multiple source files.
    // See golang.org/s/go14customimport for more information.
    ImportComment
)

type NoGoError

type NoGoError struct {
    Dir string
}

NoGoError is the error used by Import to describe a directory containing no buildable Go source files. (It may still contain test files, files hidden by build tags, and so on.)

func (*NoGoError) Error

func (e *NoGoError) Error() string

type Package

type Package struct {
    Dir           string   // directory containing package sources
    Name          string   // package name
    ImportComment string   // path in import comment on package statement
    Doc           string   // documentation synopsis
    ImportPath    string   // import path of package ("" if unknown)
    Root          string   // root of Go tree where this package lives
    SrcRoot       string   // package source root directory ("" if unknown)
    PkgRoot       string   // package install root directory ("" if unknown)
    BinDir        string   // command install directory ("" if unknown)
    Goroot        bool     // package found in Go root
    PkgObj        string   // installed .a file
    AllTags       []string // tags that can influence file selection in this directory
    ConflictDir   string   // this directory shadows Dir in $GOPATH

    // Source files
    GoFiles        []string // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles)
    CgoFiles       []string // .go source files that import "C"
    IgnoredGoFiles []string // .go source files ignored for this build
    CFiles         []string // .c source files
    CXXFiles       []string // .cc, .cpp and .cxx source files
    MFiles         []string // .m (Objective-C) source files
    HFiles         []string // .h, .hh, .hpp and .hxx source files
    SFiles         []string // .s source files
    SwigFiles      []string // .swig files
    SwigCXXFiles   []string // .swigcxx files
    SysoFiles      []string // .syso system object files to add to archive

    // Cgo directives
    CgoCFLAGS    []string // Cgo CFLAGS directives
    CgoCPPFLAGS  []string // Cgo CPPFLAGS directives
    CgoCXXFLAGS  []string // Cgo CXXFLAGS directives
    CgoLDFLAGS   []string // Cgo LDFLAGS directives
    CgoPkgConfig []string // Cgo pkg-config directives

    // Dependency information
    Imports   []string                    // imports from GoFiles, CgoFiles
    ImportPos map[string][]token.Position // line information for Imports

    // Test information
    TestGoFiles    []string                    // _test.go files in package
    TestImports    []string                    // imports from TestGoFiles
    TestImportPos  map[string][]token.Position // line information for TestImports
    XTestGoFiles   []string                    // _test.go files outside package
    XTestImports   []string                    // imports from XTestGoFiles
    XTestImportPos map[string][]token.Position // line information for XTestImports
}

A Package describes the Go package found in a directory.

func Import

func Import(path, srcDir string, mode ImportMode) (*Package, error)

Import is shorthand for Default.Import.

func ImportDir

func ImportDir(dir string, mode ImportMode) (*Package, error)

ImportDir is shorthand for Default.ImportDir.

func (*Package) IsCommand

func (p *Package) IsCommand() bool

IsCommand reports whether the package is considered a command to be installed (not just a library). Packages named "main" are treated as commands.