diff --git a/src/cmd/go/internal/work/init.go b/src/cmd/go/internal/work/init.go index 078c24822fc..9091f986368 100644 --- a/src/cmd/go/internal/work/init.go +++ b/src/cmd/go/internal/work/init.go @@ -86,7 +86,11 @@ func instrumentInit() { func buildModeInit() { gccgo := cfg.BuildToolchainName == "gccgo" var codegenArg string - platform := cfg.Goos + "/" + cfg.Goarch + + // Configure the build mode first, then verify that it is supported. + // That way, if the flag is completely bogus we will prefer to error out with + // "-buildmode=%s not supported" instead of naming the specific platform. + switch cfg.BuildBuildmode { case "archive": pkgsFilter = pkgsNotMain @@ -95,20 +99,18 @@ func buildModeInit() { if gccgo { codegenArg = "-fPIC" } else { - switch platform { - case "darwin/arm", "darwin/arm64": - codegenArg = "-shared" - default: - switch cfg.Goos { - case "dragonfly", "freebsd", "illumos", "linux", "netbsd", "openbsd", "solaris": - if platform == "linux/ppc64" { - base.Fatalf("-buildmode=c-archive not supported on %s\n", platform) - } - // Use -shared so that the result is - // suitable for inclusion in a PIE or - // shared library. + switch cfg.Goos { + case "darwin": + switch cfg.Goarch { + case "arm", "arm64": codegenArg = "-shared" } + + case "dragonfly", "freebsd", "illumos", "linux", "netbsd", "openbsd", "solaris": + // Use -shared so that the result is + // suitable for inclusion in a PIE or + // shared library. + codegenArg = "-shared" } } cfg.ExeSuffix = ".a" @@ -118,27 +120,25 @@ func buildModeInit() { if gccgo { codegenArg = "-fPIC" } else { - switch platform { - case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/ppc64le", "linux/s390x", - "android/amd64", "android/arm", "android/arm64", "android/386", - "freebsd/amd64": + switch cfg.Goos { + case "linux", "android", "freebsd": codegenArg = "-shared" - case "darwin/amd64", "darwin/386": - case "windows/amd64", "windows/386": + case "windows": // Do not add usual .exe suffix to the .dll file. cfg.ExeSuffix = "" - default: - base.Fatalf("-buildmode=c-shared not supported on %s\n", platform) } } ldBuildmode = "c-shared" case "default": - switch platform { - case "android/arm", "android/arm64", "android/amd64", "android/386": + switch cfg.Goos { + case "android": codegenArg = "-shared" ldBuildmode = "pie" - case "darwin/arm", "darwin/arm64": - codegenArg = "-shared" + case "darwin": + switch cfg.Goarch { + case "arm", "arm64": + codegenArg = "-shared" + } fallthrough default: ldBuildmode = "exe" @@ -161,18 +161,8 @@ func buildModeInit() { } if gccgo { codegenArg = "-fPIE" - } else { - switch platform { - case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/s390x", - "android/amd64", "android/arm", "android/arm64", "android/386", - "freebsd/amd64": - codegenArg = "-shared" - case "darwin/amd64": - codegenArg = "-shared" - case "aix/ppc64": - default: - base.Fatalf("-buildmode=pie not supported on %s\n", platform) - } + } else if cfg.Goos != "aix" { + codegenArg = "-shared" } ldBuildmode = "pie" case "shared": @@ -180,11 +170,6 @@ func buildModeInit() { if gccgo { codegenArg = "-fPIC" } else { - switch platform { - case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/s390x": - default: - base.Fatalf("-buildmode=shared not supported on %s\n", platform) - } codegenArg = "-dynlink" } if cfg.BuildO != "" { @@ -196,14 +181,6 @@ func buildModeInit() { if gccgo { codegenArg = "-fPIC" } else { - switch platform { - case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/s390x", "linux/ppc64le", - "android/amd64", "android/arm", "android/arm64", "android/386": - case "darwin/amd64": - case "freebsd/amd64": - default: - base.Fatalf("-buildmode=plugin not supported on %s\n", platform) - } codegenArg = "-dynlink" } cfg.ExeSuffix = ".so" @@ -211,16 +188,19 @@ func buildModeInit() { default: base.Fatalf("buildmode=%s not supported", cfg.BuildBuildmode) } + + if !sys.BuildModeSupported(cfg.BuildToolchainName, cfg.BuildBuildmode, cfg.Goos, cfg.Goarch) { + base.Fatalf("-buildmode=%s not supported on %s/%s\n", cfg.BuildBuildmode, cfg.Goos, cfg.Goarch) + } + if cfg.BuildLinkshared { + if !sys.BuildModeSupported(cfg.BuildToolchainName, "shared", cfg.Goos, cfg.Goarch) { + base.Fatalf("-linkshared not supported on %s/%s\n", cfg.Goos, cfg.Goarch) + } if gccgo { codegenArg = "-fPIC" } else { - switch platform { - case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/s390x": - forcedAsmflags = append(forcedAsmflags, "-D=GOBUILDMODE_shared=1") - default: - base.Fatalf("-linkshared not supported on %s\n", platform) - } + forcedAsmflags = append(forcedAsmflags, "-D=GOBUILDMODE_shared=1") codegenArg = "-dynlink" forcedGcflags = append(forcedGcflags, "-linkshared") // TODO(mwhudson): remove -w when that gets fixed in linker. diff --git a/src/cmd/internal/sys/supported.go b/src/cmd/internal/sys/supported.go index 78aa825a786..02f833e945e 100644 --- a/src/cmd/internal/sys/supported.go +++ b/src/cmd/internal/sys/supported.go @@ -47,11 +47,6 @@ func MustLinkExternal(goos, goarch string) bool { // BuildModeSupported reports whether goos/goarch supports the given build mode // using the given compiler. func BuildModeSupported(compiler, buildmode, goos, goarch string) bool { - // This function mirrors the logic in cmd/go/internal/work.buildModeInit. - // - // TODO(bcmills): Refactor buildModeInit to use this function so that the two - // don't get out of sync. - if compiler == "gccgo" { return true }