mirror of
https://github.com/golang/go
synced 2024-11-23 05:00:07 -07:00
cmd/go: don't copy cgo files to objdir when overlay is present
The previous cl (golang.org/cl/262618) copied non-overlaid cgo files to objdir, mostly to get around the issue that otherwise cgo-generated files were written out with the wrong names (they'd get the base path of the overlay file containing the replaced contents, instead of the base path of the path whose contents are being replaced). So that CL it would copy the files to objdir with the base path of the file being replaced to circumvent that. This CL changes cmd/go and cmd/cgo so that instead of copying files, it passes the actual path of the file on disk either of the original file (if it is not overlaid) or its replacement file (if it is) as well as a flag --path_rewrite, newly added to cmd/cgo, that specifies the actual original file path that corresponds to the replaced files. Updates #39958 Change-Id: Ic4aae5ef77fe405011fcdce7f6c162488d13daa2 Reviewed-on: https://go-review.googlesource.com/c/go/+/265758 Trust: Michael Matloob <matloob@golang.org> Run-TryBot: Michael Matloob <matloob@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Jay Conrod <jayconrod@google.com> Reviewed-by: Bryan C. Mills <bcmills@google.com>
This commit is contained in:
parent
189931296f
commit
e3de852f3e
@ -2732,6 +2732,20 @@ OverlayLoop:
|
||||
}
|
||||
}
|
||||
|
||||
// Rewrite overlaid paths in cgo files.
|
||||
// cgo adds //line and #line pragmas in generated files with these paths.
|
||||
var trimpath []string
|
||||
for i := range cgofiles {
|
||||
path := mkAbs(p.Dir, cgofiles[i])
|
||||
if opath, ok := fsys.OverlayPath(path); ok {
|
||||
cgofiles[i] = opath
|
||||
trimpath = append(trimpath, opath+"=>"+path)
|
||||
}
|
||||
}
|
||||
if len(trimpath) > 0 {
|
||||
cgoflags = append(cgoflags, "-trimpath", strings.Join(trimpath, ";"))
|
||||
}
|
||||
|
||||
if err := b.run(a, execdir, p.ImportPath, cgoenv, cfg.BuildToolexec, cgoExe, "-objdir", objdir, "-importpath", p.ImportPath, cgoflags, "--", cgoCPPFLAGS, cgoCFLAGS, cgofiles); err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
36
src/cmd/go/testdata/script/build_overlay.txt
vendored
36
src/cmd/go/testdata/script/build_overlay.txt
vendored
@ -43,6 +43,12 @@ go build -overlay overlay.json -o main_cgo_angle$GOEXE ./cgo_hello_angle
|
||||
exec ./main_cgo_angle$GOEXE
|
||||
stdout '^hello cgo\r?\n'
|
||||
|
||||
go list -compiled -overlay -f '{{range .CompiledGoFiles}}{{. | printf "%s\n"}}{{end}}' ./cgo_hello_replace
|
||||
cp stdout compiled_cgo_sources.txt
|
||||
go run ../print_line_comments.go compiled_cgo_sources.txt
|
||||
stdout $GOPATH/src/m/cgo_hello_replace/cgo_hello_replace.go
|
||||
!stdout $GOPATH/src/m/overlay/hello.c
|
||||
|
||||
# Run same tests but with gccgo.
|
||||
env GO111MODULE=off
|
||||
[!exec:gccgo] stop
|
||||
@ -207,3 +213,33 @@ void say_hello() { puts("hello cgo\n"); fflush(stdout); }
|
||||
|
||||
void say_hello() { puts("hello cgo\n"); fflush(stdout); }
|
||||
|
||||
-- print_line_comments.go --
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func main() {
|
||||
compiledGoFilesArg := os.Args[1]
|
||||
b, err := ioutil.ReadFile(compiledGoFilesArg)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
compiledGoFiles := strings.Split(strings.TrimSpace(string(b)), "\n")
|
||||
for _, f := range compiledGoFiles {
|
||||
b, err := ioutil.ReadFile(f)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
for _, line := range strings.Split(string(b), "\n") {
|
||||
if strings.HasPrefix(line, "#line") || strings.HasPrefix(line, "//line") {
|
||||
fmt.Println(line)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user