Commit 1992ab7e authored by Russ Cox's avatar Russ Cox

cmd/go: move internal/load.PluginPath to internal/work

It uses the build ID, which is soon to be internal to package work.
Luckily it is also only called from package work.

Change-Id: I5e6662cfe667bdc9190f086be733105ad65a3191
Reviewed-on: https://go-review.googlesource.com/70670
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarDavid Crawshaw <crawshaw@golang.org>
parent a607b3b4
...@@ -332,6 +332,7 @@ var builddeps = map[string][]string{ ...@@ -332,6 +332,7 @@ var builddeps = map[string][]string{
"cmd/go/internal/str", // cmd/go/internal/work "cmd/go/internal/str", // cmd/go/internal/work
"cmd/internal/buildid", // cmd/go/internal/work "cmd/internal/buildid", // cmd/go/internal/work
"container/heap", // cmd/go/internal/work "container/heap", // cmd/go/internal/work
"crypto/sha1", // cmd/go/internal/work
"crypto/sha256", // cmd/go/internal/work "crypto/sha256", // cmd/go/internal/work
"debug/elf", // cmd/go/internal/work "debug/elf", // cmd/go/internal/work
"encoding/json", // cmd/go/internal/work "encoding/json", // cmd/go/internal/work
......
...@@ -1689,29 +1689,6 @@ func pkgInputFiles(p *Package) []string { ...@@ -1689,29 +1689,6 @@ func pkgInputFiles(p *Package) []string {
) )
} }
// PluginPath computes the package path for a plugin main package.
//
// This is typically the import path of the main package p, unless the
// plugin is being built directly from source files. In that case we
// combine the package build ID with the contents of the main package
// source files. This allows us to identify two different plugins
// built from two source files with the same name.
func PluginPath(p *Package) string {
if p.ImportPath != "command-line-arguments" {
return p.ImportPath
}
h := sha1.New()
fmt.Fprintf(h, "build ID: %s\n", p.Internal.BuildID)
for _, file := range str.StringList(p.GoFiles, p.CgoFiles, p.SFiles) {
data, err := ioutil.ReadFile(filepath.Join(p.Dir, file))
if err != nil {
base.Fatalf("go: %s", err)
}
h.Write(data)
}
return fmt.Sprintf("plugin/unnamed-%x", h.Sum(nil))
}
// computeBuildID computes the build ID for p, leaving it in p.Internal.BuildID. // computeBuildID computes the build ID for p, leaving it in p.Internal.BuildID.
// Build ID is a hash of the information we want to detect changes in. // Build ID is a hash of the information we want to detect changes in.
// See the long comment in isStale for details. // See the long comment in isStale for details.
......
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
"bufio" "bufio"
"bytes" "bytes"
"container/heap" "container/heap"
"crypto/sha1"
"crypto/sha256" "crypto/sha256"
"debug/elf" "debug/elf"
"encoding/json" "encoding/json"
...@@ -2501,7 +2502,7 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg []byte, a ...@@ -2501,7 +2502,7 @@ func (gcToolchain) gc(b *Builder, a *Action, archive string, importcfg []byte, a
pkgpath := p.ImportPath pkgpath := p.ImportPath
if cfg.BuildBuildmode == "plugin" { if cfg.BuildBuildmode == "plugin" {
pkgpath = load.PluginPath(p) pkgpath = pluginPath(p)
} else if p.Name == "main" { } else if p.Name == "main" {
pkgpath = "main" pkgpath = "main"
} }
...@@ -2814,6 +2815,29 @@ func setextld(ldflags []string, compiler []string) []string { ...@@ -2814,6 +2815,29 @@ func setextld(ldflags []string, compiler []string) []string {
return ldflags return ldflags
} }
// pluginPath computes the package path for a plugin main package.
//
// This is typically the import path of the main package p, unless the
// plugin is being built directly from source files. In that case we
// combine the package build ID with the contents of the main package
// source files. This allows us to identify two different plugins
// built from two source files with the same name.
func pluginPath(p *load.Package) string {
if p.ImportPath != "command-line-arguments" {
return p.ImportPath
}
h := sha1.New()
fmt.Fprintf(h, "build ID: %s\n", p.Internal.BuildID)
for _, file := range str.StringList(p.GoFiles, p.CgoFiles, p.SFiles) {
data, err := ioutil.ReadFile(filepath.Join(p.Dir, file))
if err != nil {
base.Fatalf("go: %s", err)
}
h.Write(data)
}
return fmt.Sprintf("plugin/unnamed-%x", h.Sum(nil))
}
func (gcToolchain) ld(b *Builder, root *Action, out, importcfg, mainpkg string) error { func (gcToolchain) ld(b *Builder, root *Action, out, importcfg, mainpkg string) error {
cxx := len(root.Package.CXXFiles) > 0 || len(root.Package.SwigCXXFiles) > 0 cxx := len(root.Package.CXXFiles) > 0 || len(root.Package.SwigCXXFiles) > 0
for _, a := range root.Deps { for _, a := range root.Deps {
...@@ -2829,7 +2853,7 @@ func (gcToolchain) ld(b *Builder, root *Action, out, importcfg, mainpkg string) ...@@ -2829,7 +2853,7 @@ func (gcToolchain) ld(b *Builder, root *Action, out, importcfg, mainpkg string)
ldflags = append(ldflags, "-s", "-w") ldflags = append(ldflags, "-s", "-w")
} }
if cfg.BuildBuildmode == "plugin" { if cfg.BuildBuildmode == "plugin" {
ldflags = append(ldflags, "-pluginpath", load.PluginPath(root.Package)) ldflags = append(ldflags, "-pluginpath", pluginPath(root.Package))
} }
// TODO(rsc): This is probably wrong - see golang.org/issue/22155. // TODO(rsc): This is probably wrong - see golang.org/issue/22155.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment