]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: reject -buildmode=plugin if package is not main
authorAlexander Menzhinsky <amenzhinsky@gmail.com>
Thu, 13 Apr 2017 21:15:26 +0000 (16:15 -0500)
committerIan Lance Taylor <iant@golang.org>
Mon, 5 Jun 2017 02:35:47 +0000 (02:35 +0000)
Fixes #17625

Change-Id: I09319b888b547c631a50dbfab9255cc08e8a2426
Reviewed-on: https://go-review.googlesource.com/40691
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/go/go_test.go
src/cmd/go/internal/work/build.go

index 4b9a4eece85edb8f3859d5376b75f2e31bddcfb9..788b8daa0eb8f4a661f248b9d472603919ab8879 100644 (file)
@@ -2214,6 +2214,20 @@ func TestCoverageImportMainLoop(t *testing.T) {
        tg.grepStderr("not an importable package", "did not detect import main")
 }
 
+func TestPluginNonMain(t *testing.T) {
+       wd, err := os.Getwd()
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       pkg := filepath.Join(wd, "testdata", "testdep", "p2")
+
+       tg := testgo(t)
+       defer tg.cleanup()
+
+       tg.runFail("build", "-buildmode=plugin", pkg)
+}
+
 func TestTestEmpty(t *testing.T) {
        if !canRace {
                t.Skip("no race detector")
index 1cd2138087bd47f4ee250bf91ba6185c68db43e4..c6dd6799a294506ad0ecf86fd3fd969392892dd4 100644 (file)
@@ -255,6 +255,13 @@ func pkgsNotMain(pkgs []*load.Package) (res []*load.Package) {
        return res
 }
 
+func oneMainPkg(pkgs []*load.Package) []*load.Package {
+       if len(pkgs) != 1 || pkgs[0].Name != "main" {
+               base.Fatalf("-buildmode=%s requires exactly one main package", cfg.BuildBuildmode)
+       }
+       return pkgs
+}
+
 var pkgsFilter = func(pkgs []*load.Package) []*load.Package { return pkgs }
 
 func BuildModeInit() {
@@ -265,12 +272,7 @@ func BuildModeInit() {
        case "archive":
                pkgsFilter = pkgsNotMain
        case "c-archive":
-               pkgsFilter = func(p []*load.Package) []*load.Package {
-                       if len(p) != 1 || p[0].Name != "main" {
-                               base.Fatalf("-buildmode=c-archive requires exactly one main package")
-                       }
-                       return p
-               }
+               pkgsFilter = oneMainPkg
                switch platform {
                case "darwin/arm", "darwin/arm64":
                        codegenArg = "-shared"
@@ -347,7 +349,7 @@ func BuildModeInit() {
                }
                ldBuildmode = "shared"
        case "plugin":
-               pkgsFilter = pkgsMain
+               pkgsFilter = oneMainPkg
                if gccgo {
                        codegenArg = "-fPIC"
                } else {
@@ -454,9 +456,10 @@ func runBuild(cmd *base.Command, args []string) {
                return
        }
 
+       pkgs = pkgsFilter(load.Packages(args))
+
        var a *Action
        if cfg.BuildBuildmode == "shared" {
-               pkgs := pkgsFilter(load.Packages(args))
                if libName, err := libname(args, pkgs); err != nil {
                        base.Fatalf("%s", err.Error())
                } else {
@@ -464,7 +467,7 @@ func runBuild(cmd *base.Command, args []string) {
                }
        } else {
                a = &Action{}
-               for _, p := range pkgsFilter(load.Packages(args)) {
+               for _, p := range pkgs {
                        a.Deps = append(a.Deps, b.Action(ModeBuild, depMode, p))
                }
        }