[short] skip # Test building in overlays. # TODO(#39958): add a test case where the destination file in the replace map # isn't a go file. Either completely exclude that case in fs.IsDirWithGoFiles # if the compiler doesn't allow it, or test that it works all the way. # TODO(#39958): add a test that both gc and gccgo assembly files can include .h # files. # The main package (m) is contained in an overlay. It imports m/dir2 which has one # file in an overlay and one file outside the overlay, which in turn imports m/dir, # which only has source files in the overlay. cd m ! go build . go build -overlay overlay.json -o main$GOEXE . exec ./main$goexe stdout '^hello$' go build -overlay overlay.json -o print_abspath$GOEXE ./printpath exec ./print_abspath$GOEXE stdout $WORK[/\\]gopath[/\\]src[/\\]m[/\\]printpath[/\\]main.go go vet -overlay overlay.json ./printpath go build -overlay overlay.json -o print_trimpath$GOEXE -trimpath ./printpath exec ./print_trimpath$GOEXE stdout ^m[/\\]printpath[/\\]main.go go build -overlay overlay.json -o print_trimpath_two_files$GOEXE printpath/main.go printpath/other.go exec ./print_trimpath_two_files$GOEXE stdout $WORK[/\\]gopath[/\\]src[/\\]m[/\\]printpath[/\\]main.go stdout $WORK[/\\]gopath[/\\]src[/\\]m[/\\]printpath[/\\]other.go go build -overlay overlay.json -o main_call_asm$GOEXE ./call_asm exec ./main_call_asm$GOEXE ! stdout . # Change the contents of a file in the overlay and ensure that makes the target stale env OLD_GOCACHE=$GOCACHE env GOCACHE=$WORK/cache # use a fresh cache so that multiple runs of the test don't interfere go build -x -overlay overlay.json ./test_cache stderr '(compile|gccgo)( |\.exe).*test_cache.go' go build -x -overlay overlay.json ./test_cache ! stderr '(compile|gccgo)( |\.exe).*test_cache.go' # cached cp overlay/test_cache_different.go overlay/test_cache.go go build -x -overlay overlay.json ./test_cache stderr '(compile|gccgo)( |\.exe).*test_cache.go' # not cached env CACHE=$OLD_GOCACHE -- m/go.mod -- // TODO(matloob): how do overlays work with go.mod (especially if mod=readonly) module m go 1.16 -- m/dir2/h.go -- package dir2 func PrintMessage() { printMessage() } -- m/dir/foo.txt -- The build action code currently expects the package directory to exist, so it can run the compiler in that directory. TODO(matloob): Remove this requirement. -- m/printpath/about.txt -- the actual code is in the overlay -- m/overlay.json -- { "Replace": { "f.go": "overlay/f.go", "dir/g.go": "overlay/dir_g.go", "dir2/i.go": "overlay/dir2_i.go", "printpath/main.go": "overlay/printpath.go", "printpath/other.go": "overlay2/printpath2.go", "call_asm/asm_gc.s": "overlay/asm_gc.s", "call_asm/asm_gccgo.s": "overlay/asm_gccgo.s", "test_cache/main.go": "overlay/test_cache.go" } } -- m/overlay/f.go -- package main import "m/dir2" func main() { dir2.PrintMessage() } -- m/call_asm/main.go -- package main func foo() // There will be a "missing function body" error if the assembly file isn't found. func main() { foo() } -- m/overlay/dir_g.go -- package dir import "fmt" func PrintMessage() { fmt.Println("hello") } -- m/overlay/printpath.go -- package main import ( "fmt" "path/filepath" "runtime" ) func main() { _, file, _, _ := runtime.Caller(0) // Since https://golang.org/cl/214286, the runtime's debug paths are // slash-separated regardless of platform, so normalize them to system file // paths. fmt.Println(filepath.FromSlash(file)) } -- m/overlay2/printpath2.go -- package main import ( "fmt" "path/filepath" "runtime" ) func init() { _, file, _, _ := runtime.Caller(0) fmt.Println(filepath.FromSlash(file)) } -- m/overlay/dir2_i.go -- package dir2 import "m/dir" func printMessage() { dir.PrintMessage() } -- m/overlay/asm_gc.s -- // +build gc TEXT ·foo(SB),0,$0 RET -- m/overlay/asm_gccgo.s -- // +build gccgo .globl main.foo .text main.foo: ret -- m/overlay/test_cache.go -- package foo import "fmt" func bar() { fmt.Println("something") } -- m/overlay/test_cache_different.go -- package foo import "fmt" func bar() { fmt.Println("different") }