Commit cd7ae05d authored by Russ Cox's avatar Russ Cox

cmd/go: local import fixes

1) The -D argument should always be a pseudo-import path,
like _/Users/rsc/foo/bar, never a standard import path,
because we want local imports to always resolve to pseudo-paths.

2) Disallow local imports in non-local packages.  Otherwise
everything works but you get two copies of a package
(the real one and the "local" one) in your binary.

R=golang-dev, bradfitz, yiyu.jgl
CC=golang-dev
https://golang.org/cl/5787055
parent c3954dd5
...@@ -383,6 +383,7 @@ func goFilesPackage(gofiles []string) *Package { ...@@ -383,6 +383,7 @@ func goFilesPackage(gofiles []string) *Package {
bp, err := ctxt.ImportDir(dir, 0) bp, err := ctxt.ImportDir(dir, 0)
pkg := new(Package) pkg := new(Package)
pkg.local = true
pkg.load(&stk, bp, err) pkg.load(&stk, bp, err)
pkg.localPrefix = dirToImportPath(dir) pkg.localPrefix = dirToImportPath(dir)
pkg.ImportPath = "command-line-arguments" pkg.ImportPath = "command-line-arguments"
...@@ -1202,7 +1203,7 @@ func (gcToolchain) pack(b *builder, p *Package, objDir, afile string, ofiles []s ...@@ -1202,7 +1203,7 @@ func (gcToolchain) pack(b *builder, p *Package, objDir, afile string, ofiles []s
func (gcToolchain) ld(b *builder, p *Package, out string, allactions []*action, mainpkg string, ofiles []string) error { func (gcToolchain) ld(b *builder, p *Package, out string, allactions []*action, mainpkg string, ofiles []string) error {
importArgs := b.includeArgs("-L", allactions) importArgs := b.includeArgs("-L", allactions)
return b.run(p.Dir, p.ImportPath, tool(archChar+"l"), "-o", out, importArgs, buildLdflags, mainpkg) return b.run(".", p.ImportPath, tool(archChar+"l"), "-o", out, importArgs, buildLdflags, mainpkg)
} }
func (gcToolchain) cc(b *builder, p *Package, objdir, ofile, cfile string) error { func (gcToolchain) cc(b *builder, p *Package, objdir, ofile, cfile string) error {
...@@ -1284,7 +1285,7 @@ func (tools gccgcToolchain) ld(b *builder, p *Package, out string, allactions [] ...@@ -1284,7 +1285,7 @@ func (tools gccgcToolchain) ld(b *builder, p *Package, out string, allactions []
ldflags = append(ldflags, afile) ldflags = append(ldflags, afile)
} }
ldflags = append(ldflags, cgoldflags...) ldflags = append(ldflags, cgoldflags...)
return b.run(p.Dir, p.ImportPath, "gccgo", "-o", out, buildGccgoflags, ofiles, "-Wl,-(", ldflags, "-Wl,-)") return b.run(".", p.ImportPath, "gccgo", "-o", out, buildGccgoflags, ofiles, "-Wl,-(", ldflags, "-Wl,-)")
} }
func (gccgcToolchain) cc(b *builder, p *Package, objdir, ofile, cfile string) error { func (gccgcToolchain) cc(b *builder, p *Package, objdir, ofile, cfile string) error {
...@@ -1308,6 +1309,9 @@ func (b *builder) gccld(p *Package, out string, flags []string, obj []string) er ...@@ -1308,6 +1309,9 @@ func (b *builder) gccld(p *Package, out string, flags []string, obj []string) er
// gccCmd returns a gcc command line prefix // gccCmd returns a gcc command line prefix
func (b *builder) gccCmd(objdir string) []string { func (b *builder) gccCmd(objdir string) []string {
// NOTE: env.go's mkEnv knows that the first three
// strings returned are "gcc", "-I", objdir (and cuts them off).
// TODO: HOST_CC? // TODO: HOST_CC?
a := []string{"gcc", "-I", objdir, "-g", "-O2"} a := []string{"gcc", "-I", objdir, "-g", "-O2"}
......
...@@ -279,9 +279,8 @@ func (p *Package) load(stk *importStack, bp *build.Package, err error) *Package ...@@ -279,9 +279,8 @@ func (p *Package) load(stk *importStack, bp *build.Package, err error) *Package
p.copyBuild(bp) p.copyBuild(bp)
// The localPrefix is the path we interpret ./ imports relative to. // The localPrefix is the path we interpret ./ imports relative to.
// Now that we've fixed the import path, it's just the import path.
// Synthesized main packages sometimes override this. // Synthesized main packages sometimes override this.
p.localPrefix = p.ImportPath p.localPrefix = dirToImportPath(p.Dir)
if err != nil { if err != nil {
p.Incomplete = true p.Incomplete = true
...@@ -343,6 +342,16 @@ func (p *Package) load(stk *importStack, bp *build.Package, err error) *Package ...@@ -343,6 +342,16 @@ func (p *Package) load(stk *importStack, bp *build.Package, err error) *Package
} }
p1 := loadImport(path, p.Dir, stk, p.build.ImportPos[path]) p1 := loadImport(path, p.Dir, stk, p.build.ImportPos[path])
if p1.local { if p1.local {
if !p.local && p.Error == nil {
p.Error = &PackageError{
ImportStack: stk.copy(),
Err: fmt.Sprintf("local import %q in non-local package", path),
}
pos := p.build.ImportPos[path]
if len(pos) > 0 {
p.Error.Pos = pos[0].String()
}
}
path = p1.ImportPath path = p1.ImportPath
importPaths[i] = path importPaths[i] = path
} }
......
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