...

Text file src/cmd/go/testdata/script/toolexec.txt

Documentation: cmd/go/testdata/script

     1[short] skip
     2
     3# Build our simple toolexec program.
     4go build ./cmd/mytool
     5
     6# Use an ephemeral build cache so that our toolexec output is not cached
     7# for any stale standard-library dependencies.
     8#
     9# TODO(#27628): This should not be necessary.
    10env GOCACHE=$WORK/gocache
    11
    12# Build the main package with our toolexec program. For each action, it will
    13# print the tool's name and the TOOLEXEC_IMPORTPATH value. We expect to compile
    14# each package once, and link the main package once.
    15# Don't check the entire output at once, because the order in which the tools
    16# are run is irrelevant here.
    17# Finally, note that asm and cgo are run twice.
    18
    19go build -toolexec=$PWD/mytool
    20[GOARCH:amd64] stderr -count=2 '^asm'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main/withasm"$'
    21stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main/withasm"$'
    22[cgo] stderr -count=2 '^cgo'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main/withcgo"$'
    23[cgo] stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main/withcgo"$'
    24stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main"$'
    25stderr -count=1 '^link'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main"$'
    26
    27# Test packages are a little bit trickier.
    28# We have four variants of test/main, as reported by 'go list -test':
    29#
    30#    test/main                        - the regular non-test package
    31#    test/main.test                   - the generated test program
    32#    test/main [test/main.test]       - the test package for foo_test.go
    33#    test/main_test [test/main.test]  - the test package for foo_separate_test.go
    34#
    35# As such, TOOLEXEC_IMPORTPATH must see the same strings, to be able to uniquely
    36# identify each package being built as reported by 'go list -f {{.ImportPath}}'.
    37# Note that these are not really "import paths" anymore, but that naming is
    38# consistent with 'go list -json' at least.
    39
    40go test -toolexec=$PWD/mytool
    41
    42stderr -count=2 '^# test/main\.test$'
    43stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main\.test"$'
    44stderr -count=1 '^link'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main\.test"$'
    45
    46stderr -count=1 '^# test/main \[test/main\.test\]$'
    47stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main \[test/main\.test\]"$'
    48
    49stderr -count=1 '^# test/main_test \[test/main\.test\]$'
    50stderr -count=1 '^compile'${GOEXE}' TOOLEXEC_IMPORTPATH="test/main_test \[test/main\.test\]"$'
    51
    52-- go.mod --
    53module test/main
    54-- foo.go --
    55// Simple package so we can test a program build with -toolexec.
    56// With a dummy import, to test different TOOLEXEC_IMPORTPATH values.
    57// Includes dummy uses of cgo and asm, to cover those tools as well.
    58package main
    59
    60import (
    61	_ "test/main/withasm"
    62	_ "test/main/withcgo"
    63)
    64
    65func main() {}
    66-- foo_test.go --
    67package main
    68
    69import "testing"
    70
    71func TestFoo(t *testing.T) {}
    72-- foo_separate_test.go --
    73package main_test
    74
    75import "testing"
    76
    77func TestSeparateFoo(t *testing.T) {}
    78-- withcgo/withcgo.go --
    79package withcgo
    80
    81// int fortytwo()
    82// {
    83//     return 42;
    84// }
    85import "C"
    86-- withcgo/stub.go --
    87package withcgo
    88
    89// Stub file to ensure we build without cgo too.
    90-- withasm/withasm.go --
    91package withasm
    92
    93// Note that we don't need to declare the Add func at all.
    94-- withasm/withasm_amd64.s --
    95TEXT ·Add(SB),$0-24
    96	MOVQ a+0(FP), AX
    97	ADDQ b+8(FP), AX
    98	MOVQ AX, ret+16(FP)
    99	RET
   100-- cmd/mytool/main.go --
   101package main
   102
   103import (
   104	"fmt"
   105	"os"
   106	"os/exec"
   107	"path/filepath"
   108)
   109
   110func main() {
   111	tool, args := os.Args[1], os.Args[2:]
   112	toolName := filepath.Base(tool)
   113	if len(args) > 0 && args[0] == "-V=full" {
   114		// We can't alter the version output.
   115	} else {
   116		// Print which tool we're running, and on what package.
   117		fmt.Fprintf(os.Stdout, "%s TOOLEXEC_IMPORTPATH=%q\n", toolName, os.Getenv("TOOLEXEC_IMPORTPATH"))
   118	}
   119
   120	// Simply run the tool.
   121	cmd := exec.Command(tool, args...)
   122	cmd.Stdout = os.Stdout
   123	cmd.Stderr = os.Stderr
   124	if err := cmd.Run(); err != nil {
   125		fmt.Fprintln(os.Stderr, err)
   126		os.Exit(1)
   127	}
   128}

View as plain text