github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/go/build/build.go (about)

     1  // Copyright 2011 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package build
     6  
     7  import (
     8  	"github.com/shogo82148/std/go/token"
     9  	"github.com/shogo82148/std/io"
    10  	"github.com/shogo82148/std/io/fs"
    11  )
    12  
    13  // Contextは、ビルドのサポートコンテキストを指定します。
    14  type Context struct {
    15  	GOARCH string
    16  	GOOS   string
    17  	GOROOT string
    18  	GOPATH string
    19  
    20  	// Dirは呼び出し元の作業ディレクトリです。空の文字列の場合、実行中のプロセスのカレントディレクトリが使用されます。モジュールモードでは、これはメインモジュールを特定するために使用されます。
    21  	//
    22  	// Dirが空でない場合、ImportとImportDirに渡されるディレクトリは絶対である必要があります。
    23  	Dir string
    24  
    25  	CgoEnabled  bool
    26  	UseAllFiles bool
    27  	Compiler    string
    28  
    29  	// build、tool、およびrelease タグは、go:build 行の処理時に満たされていると考慮されるビルド制約を指定します。
    30  	// 新しいコンテキストを作成するクライアントは、BuildTags をカスタマイズすることができます。デフォルトは空ですが、ToolTags や ReleaseTags をカスタマイズすることは通常エラーです。
    31  	// ToolTags は、現在の Go ツールチェインの構成に適したビルドタグをデフォルトで持ちます。
    32  	// ReleaseTags は、現在のリリースが互換性のある Go のリリースの一覧をデフォルトで持ちます。
    33  	// BuildTags は、デフォルトのビルドコンテキストでは設定されません。
    34  	// BuildTags、ToolTags、ReleaseTags に加えて、ビルド制約は GOARCH と GOOS の値を満たしたタグとして考慮されます。
    35  	// ReleaseTags の最後の要素は現在のリリースと見なされます。
    36  	BuildTags   []string
    37  	ToolTags    []string
    38  	ReleaseTags []string
    39  
    40  	// InstallSuffixは、インストールディレクトリの名前に使用する接尾辞を指定します。
    41  	// デフォルトでは空ですが、カスタムビルドでは出力を分離する必要がある場合にInstallSuffixを設定できます。
    42  	// たとえば、レースディテクタを使用する場合、goコマンドはInstallSuffix = "race"を使用するため、
    43  	// Linux/386システムでは、通常の「linux_386」の代わりに「linux_386_race」という名前のディレクトリにパッケージが書き込まれます。
    44  	InstallSuffix string
    45  
    46  	// JoinPathはパスフラグメントのシーケンスを1つのパスに結合します。
    47  	// JoinPathがnilの場合、Importはfilepath.Joinを使用します。
    48  	JoinPath func(elem ...string) string
    49  
    50  	// SplitPathList はパスリストを個々のパスのスライスに分割します。
    51  	// SplitPathList が nil の場合、Import は filepath.SplitList を使用します。
    52  	SplitPathList func(list string) []string
    53  
    54  	// IsAbsPathは、パスが絶対パスかどうかを報告します。
    55  	// IsAbsPathがnilの場合、Importはfilepath.IsAbsを使用します。
    56  	IsAbsPath func(path string) bool
    57  
    58  	// IsDirはパスがディレクトリかどうかを報告します。
    59  	// IsDirがnilの場合、Importはos.Statを呼び出し、結果のIsDirメソッドを使用します。
    60  	IsDir func(path string) bool
    61  
    62  	// HasSubdirは、dirがrootの下位ディレクトリであるかどうかを報告します。
    63  	// 複数のレベル下位かもしれません。dirが存在するかどうかを確認しようとはしません。
    64  	// もしそうであれば、HasSubdirはrelをスラッシュで区切られたパスとして設定し、
    65  	// rootに結合してdirと同等のパスを生成することができます。
    66  	// HasSubdirがnilの場合、Importはfilepath.EvalSymlinksを基に実装されたものを使用します。
    67  	HasSubdir func(root, dir string) (rel string, ok bool)
    68  
    69  	// ReadDirはディレクトリの内容を表すfs.FileInfoのスライスを名前でソートして返します。
    70  	// ReadDirがnilの場合、Importはos.ReadDirを使用します。
    71  	ReadDir func(dir string) ([]fs.FileInfo, error)
    72  
    73  	// OpenFileは読み取り用にファイル(ディレクトリではありません)を開きます。
    74  	// OpenFileがnilの場合、Importはos.Openを使用します。
    75  	OpenFile func(path string) (io.ReadCloser, error)
    76  }
    77  
    78  // SrcDirsはパッケージソースルートディレクトリのリストを返します。
    79  // 現在のGoルートとGoパスから引っ張りますが、存在しないディレクトリは省略します。
    80  func (ctxt *Context) SrcDirs() []string
    81  
    82  // Defaultはビルド用のデフォルトのContextです。
    83  // もし設定している場合は、GOARCH、GOOS、GOROOT、およびGOPATHの環境変数を使用します。
    84  // 設定されていない場合は、コンパイルされたコードのGOARCH、GOOS、およびGOROOTが使用されます。
    85  var Default Context = defaultContext()
    86  
    87  // ImportModeはImportメソッドの動作を制御します。
    88  type ImportMode uint
    89  
    90  const (
    91  
    92  	// FindOnlyが設定されている場合、Importはパッケージのソースが含まれるディレクトリを見つけた後に停止します。ディレクトリ内のファイルは読み込まれません。
    93  	FindOnly ImportMode = 1 << iota
    94  
    95  	// AllowBinaryが設定されている場合、対応するソースコードなしでコンパイル済みのパッケージオブジェクトでImportを満たすことができます。
    96  	//
    97  	// 廃止予定:
    98  	// コンパイルのみのパッケージを作成するサポートされる方法は、ファイルの先頭に//go:binary-only-packageコメントを含むソースコードを書くことです。このようなパッケージは、このフラグの設定に関係なく認識されます(ソースコードを持っているので)し、戻り値のパッケージにBinaryOnlyフラグがtrueで設定されます。
    99  	AllowBinary
   100  
   101  	// ImportCommentが設定されている場合、パッケージ文のimportコメントを解析します。
   102  	// もし理解できないコメントが見つかるか、複数のソースファイルで矛盾するコメントが見つかった場合、エラーが返されます。
   103  	// 詳細はgolang.org/s/go14customimportを参照してください。
   104  	ImportComment
   105  
   106  	// デフォルトでは、Importは指定されたソースディレクトリ内のベンダーディレクトリを検索します。
   107  	// GOROOTとGOPATHのルートを検索する前に適用されるベンダーディレクトリを検索します。
   108  	// もしImportがベンダーディレクトリを見つけてパッケージを返す場合、返されるImportPathは完全なパスです。
   109  	// "vendor"までのパス要素を含み、"vendor"自体を含むパッケージのパスです。
   110  	// 例えば、Import("y", "x/subdir", 0)が"x/vendor/y"を見つけた場合、返されるパッケージのImportPathは"x/vendor/y"です。
   111  	// 単純に"y"ではありません。
   112  	// 詳細については、golang.org/s/go15vendorを参照してください。
   113  	//
   114  	// IgnoreVendorを設定すると、ベンダーディレクトリは無視されます。
   115  	//
   116  	// パッケージのImportPathとは異なり、返されるパッケージのImports、TestImports、およびXTestImportsは常にソースファイルからの正確なインポートパスです。
   117  	// Importはこれらのパスを解決したり確認したりする試みはしません。
   118  	IgnoreVendor
   119  )
   120  
   121  // パッケージは、ディレクトリにあるGoパッケージを説明します。
   122  type Package struct {
   123  	Dir           string
   124  	Name          string
   125  	ImportComment string
   126  	Doc           string
   127  	ImportPath    string
   128  	Root          string
   129  	SrcRoot       string
   130  	PkgRoot       string
   131  	PkgTargetRoot string
   132  	BinDir        string
   133  	Goroot        bool
   134  	PkgObj        string
   135  	AllTags       []string
   136  	ConflictDir   string
   137  	BinaryOnly    bool
   138  
   139  	// ソースファイル
   140  	GoFiles           []string
   141  	CgoFiles          []string
   142  	IgnoredGoFiles    []string
   143  	InvalidGoFiles    []string
   144  	IgnoredOtherFiles []string
   145  	CFiles            []string
   146  	CXXFiles          []string
   147  	MFiles            []string
   148  	HFiles            []string
   149  	FFiles            []string
   150  	SFiles            []string
   151  	SwigFiles         []string
   152  	SwigCXXFiles      []string
   153  	SysoFiles         []string
   154  
   155  	// Cgoの指令
   156  	CgoCFLAGS    []string
   157  	CgoCPPFLAGS  []string
   158  	CgoCXXFLAGS  []string
   159  	CgoFFLAGS    []string
   160  	CgoLDFLAGS   []string
   161  	CgoPkgConfig []string
   162  
   163  	// テスト情報
   164  	TestGoFiles  []string
   165  	XTestGoFiles []string
   166  
   167  	// ソースファイル内で見つかったGoディレクティブコメント(//go:zzz...)。
   168  	Directives      []Directive
   169  	TestDirectives  []Directive
   170  	XTestDirectives []Directive
   171  
   172  	// 依存関係情報
   173  	Imports        []string
   174  	ImportPos      map[string][]token.Position
   175  	TestImports    []string
   176  	TestImportPos  map[string][]token.Position
   177  	XTestImports   []string
   178  	XTestImportPos map[string][]token.Position
   179  
   180  	// //go:embed はGoのソースファイル内で見つかるパターンです。
   181  	// 例えば、ソースファイルに次のように記述されている場合、
   182  	//	//go:embed a* b.c
   183  	// このリストはそれぞれの文字列を別々のエントリとして含んでいます。
   184  	// (//go:embedについての詳細はパッケージembedを参照してください。)
   185  	EmbedPatterns        []string
   186  	EmbedPatternPos      map[string][]token.Position
   187  	TestEmbedPatterns    []string
   188  	TestEmbedPatternPos  map[string][]token.Position
   189  	XTestEmbedPatterns   []string
   190  	XTestEmbedPatternPos map[string][]token.Position
   191  }
   192  
   193  // Directiveは、ソースファイル内で見つかるGoのディレクティブコメント(//go:zzz...)です。
   194  type Directive struct {
   195  	Text string
   196  	Pos  token.Position
   197  }
   198  
   199  // IsCommandは、パッケージがインストールされるコマンド(単なるライブラリではない)として
   200  // 考えられるかどうかを報告します。
   201  // "main"という名前のパッケージはコマンドとして扱われます。
   202  func (p *Package) IsCommand() bool
   203  
   204  // ImportDirは、名前付きディレクトリで見つかったGoパッケージを処理する [Import] のようなものです。
   205  func (ctxt *Context) ImportDir(dir string, mode ImportMode) (*Package, error)
   206  
   207  // NoGoErrorは、ビルド可能なGoソースファイルが含まれていないディレクトリを説明するために [Import] で使用されるエラーです。(テストファイル、ビルドタグによって非表示にされたファイルなどは含まれる可能性があります。)
   208  type NoGoError struct {
   209  	Dir string
   210  }
   211  
   212  func (e *NoGoError) Error() string
   213  
   214  type MultiplePackageError struct {
   215  	Dir      string
   216  	Packages []string
   217  	Files    []string
   218  }
   219  
   220  func (e *MultiplePackageError) Error() string
   221  
   222  // Importはimportパスによって指定されたGoパッケージについての詳細を返します。
   223  // srcDirディレクトリを基準として、ローカルなimportパスを解釈します。
   224  // もしパッケージが標準のimportパスを使用してインポート可能なローカルなパッケージの場合、返されるパッケージにはp.ImportPathがそのパスに設定されます。
   225  //
   226  // パッケージを含むディレクトリでは、.go、.c、.h、および.sファイルはパッケージの一部と見なされますが、以下のものは除外されます:
   227  //
   228  //   - パッケージドキュメント内の.goファイル
   229  //   - _または.で始まるファイル(おそらくエディタの一時ファイル)
   230  //   - コンテキストで満たされないビルド制約を持つファイル
   231  //
   232  // エラーが発生した場合、Importは非nilのエラーと部分的な情報を含む非nilの*[Package] を返します。
   233  func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Package, error)
   234  
   235  // MatchFileは、指定されたディレクトリ内の指定された名前のファイルがコンテキストに一致し、そのディレクトリで [ImportDir] によって作成される [Package] に含まれるかどうかを報告します。
   236  //
   237  // MatchFileは、ファイルの名前を考慮し、ctxt.OpenFileを使用してファイルの内容の一部または全部を読み取ることがあります。
   238  func (ctxt *Context) MatchFile(dir, name string) (match bool, err error)
   239  
   240  // Import は Default.Import の略記法です。
   241  func Import(path, srcDir string, mode ImportMode) (*Package, error)
   242  
   243  // ImportDir は Default.ImportDir の省略形です。
   244  func ImportDir(dir string, mode ImportMode) (*Package, error)
   245  
   246  // ToolDirはビルドツールを含むディレクトリです。
   247  var ToolDir = getToolDir()
   248  
   249  // IsLocalImportは、インポートパスがローカルなインポートパス("."、".."、"./foo"、または"../foo"など)であるかどうかを報告します。
   250  func IsLocalImport(path string) bool
   251  
   252  // ArchCharは"?"とエラーを返します。
   253  // Goの以前のバージョンでは、返された文字列はコンパイラとリンカのツール名、デフォルトのオブジェクトファイルの接尾辞、
   254  // およびデフォルトのリンカの出力名に使用されました。Go 1.5以降、これらの文字列はアーキテクチャによって異なりません。
   255  // それらの文字列は、compile、link、.o、およびa.outです。
   256  func ArchChar(goarch string) (string, error)