// GetTestDeps is for download (part of "go get") and indicates
// that test dependencies should be fetched too.
GetTestDeps
+
+ // The remainder are internal modes for calls to loadImport.
+
+ // cmdlinePkg is for a package mentioned on the command line.
+ cmdlinePkg
+
+ // cmdlinePkgLiteral is for a package mentioned on the command line
+ // without using any wildcards or meta-patterns.
+ cmdlinePkgLiteral
)
// LoadImport scans the directory named by path, which must be an import path,
return p
}
+ setCmdline := func(p *Package) {
+ if mode&cmdlinePkg != 0 {
+ p.Internal.CmdlinePkg = true
+ }
+ if mode&cmdlinePkgLiteral != 0 {
+ p.Internal.CmdlinePkgLiteral = true
+ }
+ }
+
importPath := bp.ImportPath
p := packageCache[importPath]
if p != nil {
stk.Push(path)
p = reusePackage(p, stk)
stk.Pop()
+ setCmdline(p)
} else {
p = new(Package)
p.Internal.Local = build.IsLocalImport(path)
p.ImportPath = importPath
packageCache[importPath] = p
+ setCmdline(p)
+
// Load package.
// loadPackageData may return bp != nil even if an error occurs,
// in order to return partial information.
if pkg == "" {
panic(fmt.Sprintf("ImportPaths returned empty package for pattern %s", m.Pattern()))
}
- p := loadImport(ctx, opts, pre, pkg, base.Cwd(), nil, &stk, nil, 0)
- p.Match = append(p.Match, m.Pattern())
- p.Internal.CmdlinePkg = true
+ mode := cmdlinePkg
if m.IsLiteral() {
// Note: do not set = m.IsLiteral unconditionally
// because maybe we'll see p matching both
// a literal and also a non-literal pattern.
- p.Internal.CmdlinePkgLiteral = true
+ mode |= cmdlinePkgLiteral
}
+ p := loadImport(ctx, opts, pre, pkg, base.Cwd(), nil, &stk, nil, mode)
+ p.Match = append(p.Match, m.Pattern())
if seenPkg[p] {
continue
}
--- /dev/null
+# This test requires external linking. Assume that if cgo is supported
+# then external linking works.
+[!cgo] skip 'links and runs binaries'
+
+# Only run on Unix systems that support -static.
+[GOOS:windows] skip
+[GOOS:plan9] skip
+
+# Ordinary build should work.
+go build
+exec ./hello
+stdout Hello
+
+# Building with -linkmode=external should not say anything about
+# runtime/cgo (issue #31544).
+go build -ldflags=-linkmode=external
+! stderr runtime/cgo
+exec ./hello
+stdout Hello
+
+# Building with -linkmode=external -extldflags=-static should work.
+go build -ldflags='-linkmode=external -extldflags=-static'
+! stderr runtime/cgo
+exec ./hello
+stdout Hello
+
+-- go.mod --
+module hello
+
+go 1.20
+-- hello.go --
+package main
+
+import "fmt"
+
+func main() {
+ fmt.Println("Hello, world")
+}