]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: -buildmode=c-archive support
authorDavid Crawshaw <crawshaw@golang.org>
Fri, 10 Apr 2015 13:11:03 +0000 (09:11 -0400)
committerDavid Crawshaw <crawshaw@golang.org>
Mon, 13 Apr 2015 13:21:20 +0000 (13:21 +0000)
Change-Id: I469254384b0f4e5b5f08a18658934e19259935f9
Reviewed-on: https://go-review.googlesource.com/8718
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/go/build.go
src/cmd/go/doc.go
src/cmd/go/help.go

index e9347525a6235567f8f357ebbff220c3142a0db6..2bb9924995af267e339828a701e18288f3ca155b 100644 (file)
@@ -286,22 +286,48 @@ func (v *stringsFlag) String() string {
        return "<stringsFlag>"
 }
 
-var pkgFilter = func(p *Package) bool { return true }
+func pkgsMain(pkgs []*Package) (res []*Package) {
+       for _, p := range pkgs {
+               if p.Name == "main" {
+                       res = append(res, p)
+               }
+       }
+       return res
+}
+
+func pkgsNotMain(pkgs []*Package) (res []*Package) {
+       for _, p := range pkgs {
+               if p.Name != "main" {
+                       res = append(res, p)
+               }
+       }
+       return res
+}
+
+var pkgsFilter = func(pkgs []*Package) []*Package { return pkgs }
 
 func buildModeInit() {
        var codegenArg, ldBuildmode string
        switch buildBuildmode {
        case "archive":
-               pkgFilter = func(p *Package) bool { return p.Name != "main" }
+               pkgsFilter = pkgsNotMain
+       case "c-archive":
+               pkgsFilter = func(p []*Package) []*Package {
+                       if len(p) != 1 || p[0].Name != "main" {
+                               fatalf("-buildmode=c-archive requires exactly one main package")
+                       }
+                       return p
+               }
+               exeSuffix = ".a"
+               ldBuildmode = "c-archive"
        case "c-shared":
-               pkgFilter = func(p *Package) bool { return p.Name == "main" }
+               pkgsFilter = pkgsMain
                platform := goos + "/" + goarch
                switch platform {
                case "linux/amd64":
                case "android/arm":
                default:
-                       fmt.Fprintf(os.Stderr, "go %s: -buildmode=c-shared not supported on %s\n", platform)
-                       os.Exit(2)
+                       fatalf("-buildmode=c-shared not supported on %s\n", platform)
                }
                if goarch == "amd64" {
                        codegenArg = "-shared"
@@ -310,7 +336,7 @@ func buildModeInit() {
        case "default":
                ldBuildmode = "exe"
        case "exe":
-               pkgFilter = func(p *Package) bool { return p.Name == "main" }
+               pkgsFilter = pkgsMain
                ldBuildmode = "exe"
        default:
                fatalf("buildmode=%s not supported", buildBuildmode)
@@ -385,10 +411,8 @@ func runBuild(cmd *Command, args []string) {
        }
 
        a := &action{}
-       for _, p := range packages(args) {
-               if pkgFilter(p) {
-                       a.deps = append(a.deps, b.action(modeBuild, depMode, p))
-               }
+       for _, p := range pkgsFilter(packages(args)) {
+               a.deps = append(a.deps, b.action(modeBuild, depMode, p))
        }
        b.do(a)
 }
@@ -409,7 +433,7 @@ See also: go build, go get, go clean.
 
 func runInstall(cmd *Command, args []string) {
        raceInit()
-       pkgs := packagesForBuild(args)
+       pkgs := pkgsFilter(packagesForBuild(args))
 
        for _, p := range pkgs {
                if p.Target == "" && (!p.Standard || p.ImportPath != "unsafe") {
@@ -429,9 +453,6 @@ func runInstall(cmd *Command, args []string) {
        a := &action{}
        var tools []*action
        for _, p := range pkgs {
-               if !pkgFilter(p) {
-                       continue
-               }
                // If p is a tool, delay the installation until the end of the build.
                // This avoids installing assemblers/compilers that are being executed
                // by other steps in the build.
index e880a238c800c68151b9793447d17fda30131971..a9dfe4355d91376b3d32026b4ec4ba8f753c2379 100644 (file)
@@ -657,6 +657,12 @@ are:
                Build the listed non-main packages into .a files. Packages named
                main are ignored.
 
+       -buildmode=c-archive
+               Build the listed main package, plus all packages it imports,
+               into a C archive file. The only callable symbols will be those
+               functions marked as exported. Requires exactly one main package
+               to be listed.
+
        -buildmode=c-shared
                Build the listed main packages, plus all packages that they
                import, into C shared libraries. The only callable symbols will
index dafebd0141060e2981f3f6f466440502ea56b842..254d08a906cde4ed91b3a96b32552d429783a4c2 100644 (file)
@@ -376,6 +376,12 @@ are:
                Build the listed non-main packages into .a files. Packages named
                main are ignored.
 
+       -buildmode=c-archive
+               Build the listed main package, plus all packages it imports,
+               into a C archive file. The only callable symbols will be those
+               functions marked as exported. Requires exactly one main package
+               to be listed.
+
        -buildmode=c-shared
                Build the listed main packages, plus all packages that they
                import, into C shared libraries. The only callable symbols will