]> Cypherpunks repositories - gostls13.git/commitdiff
cgo: interpret $CGOPKGDIR as absolute path if rooted
authorRuss Cox <rsc@golang.org>
Mon, 21 Dec 2009 16:31:02 +0000 (08:31 -0800)
committerRuss Cox <rsc@golang.org>
Mon, 21 Dec 2009 16:31:02 +0000 (08:31 -0800)
R=dho
CC=golang-dev
https://golang.org/cl/180099

src/Make.pkg
src/cmd/cgo/main.go
src/cmd/cgo/out.go

index 890f43d490fc534011fb497728fd8dfad84bd92a..b315b2ee1e56bc720d166b4c1d3ec317fa377d3a 100644 (file)
@@ -23,7 +23,11 @@ endif
 TARG_words=$(subst /, ,$(TARG))
 elem=$(word $(words $(TARG_words)),$(TARG_words))
 
-dir=$(patsubst %/$(elem),%,./$(TARG))
+ifeq ($(elem),$(TARG))
+dir=
+else
+dir=$(patsubst %/$(elem),%,$(TARG))
+endif
 
 # ugly hack to deal with whitespaces in $GOROOT
 nullstring :=
index d1b551b555707c9b19c03dbd58f0ee2654d0d0f4..607f26b22c081f65be0203fd07c0b12d1664249e 100644 (file)
@@ -126,8 +126,11 @@ func main() {
                if nerrors > 0 {
                        os.Exit(2)
                }
-
-               p.PackagePath = os.Getenv("CGOPKGPATH") + "/" + p.Package
+               pkg := p.Package
+               if dir := os.Getenv("CGOPKGPATH"); dir != "" {
+                       pkg = dir + "/" + pkg
+               }
+               p.PackagePath = pkg
                p.writeOutput(input)
        }
 
index 8720d6ff7ed1283080002c86bbd9095445b807d7..4c72f4c987820a1c22fbc6832e663edc81891baf 100644 (file)
@@ -24,6 +24,10 @@ func creat(name string) *os.File {
 // (The comments here say 6g and 6c but the code applies to the 8 and 5 tools too.)
 func (p *Prog) writeDefs() {
        pkgroot := os.Getenv("GOROOT") + "/pkg/" + os.Getenv("GOOS") + "_" + os.Getenv("GOARCH")
+       path := p.PackagePath
+       if !strings.HasPrefix(path, "/") {
+               path = pkgroot + "/" + path
+       }
 
        fgo2 := creat("_cgo_gotypes.go")
        fc := creat("_cgo_defun.c")
@@ -46,7 +50,7 @@ func (p *Prog) writeDefs() {
        fmt.Fprintf(fc, cProlog, pkgroot, pkgroot, pkgroot, pkgroot, p.Package, p.Package)
 
        for name, def := range p.Vardef {
-               fmt.Fprintf(fc, "#pragma dynld %s·_C_%s %s \"%s/%s.so\"\n", p.Package, name, name, pkgroot, p.PackagePath)
+               fmt.Fprintf(fc, "#pragma dynld %s·_C_%s %s \"%s.so\"\n", p.Package, name, name, path)
                fmt.Fprintf(fgo2, "var _C_%s ", name)
                printer.Fprint(fgo2, &ast.StarExpr{X: def.Go})
                fmt.Fprintf(fgo2, "\n")
@@ -121,7 +125,7 @@ func (p *Prog) writeDefs() {
 
                // C wrapper calls into gcc, passing a pointer to the argument frame.
                // Also emit #pragma to get a pointer to the gcc wrapper.
-               fmt.Fprintf(fc, "#pragma dynld _cgo_%s _cgo_%s \"%s/%s.so\"\n", name, name, pkgroot, p.PackagePath)
+               fmt.Fprintf(fc, "#pragma dynld _cgo_%s _cgo_%s \"%s.so\"\n", name, name, path)
                fmt.Fprintf(fc, "void (*_cgo_%s)(void*);\n", name)
                fmt.Fprintf(fc, "\n")
                fmt.Fprintf(fc, "void\n")