]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: add -exportheader option
authorIan Lance Taylor <iant@golang.org>
Thu, 7 May 2015 00:53:17 +0000 (17:53 -0700)
committerIan Lance Taylor <iant@golang.org>
Thu, 7 May 2015 05:03:23 +0000 (05:03 +0000)
The -exportheader option tells cgo to generate a header file declaring
expoted functions.  The header file is only created if there are, in
fact, some exported functions, so it also serves as a signal as to
whether there were any.

In future CLs the go tool will use this option to install header files
for packages that use cgo and export functions.

Change-Id: I5b04357d453a9a8f0e70d37f8f18274cf40d74c9
Reviewed-on: https://go-review.googlesource.com/9796
Reviewed-by: David Crawshaw <crawshaw@golang.org>
src/cmd/cgo/doc.go
src/cmd/cgo/main.go
src/cmd/cgo/out.go

index df16ae3c7f439172277c2ec5695655f9c40938fe..1a2595b76643aa3ab3c6f67d72d885021cedd977 100644 (file)
@@ -242,6 +242,10 @@ The following options are available when running cgo directly:
        -importpath string
                The import path for the Go package. Optional; used for
                nicer comments in the generated files.
+       -exportheader file
+               If there are any exported functions, write the
+               generated export declarations to file.
+               C code can #include this to see the declarations.
        -gccgo
                Generate output for the gccgo compiler rather than the
                gc compiler.
index 3d2f7df8b9f1ae0ebd0c9b142a3bdc0cabd78848..3b9ccae9635ab7482519f845aaf0430bd3d338ff 100644 (file)
@@ -169,6 +169,7 @@ var godefs = flag.Bool("godefs", false, "for bootstrap: write Go definitions for
 
 var objDir = flag.String("objdir", "", "object directory")
 var importPath = flag.String("importpath", "", "import path of package being built (for comments in generated files)")
+var exportHeader = flag.String("exportheader", "", "where to write export header if any exported functions")
 
 var gccgo = flag.Bool("gccgo", false, "generate files for use with gccgo")
 var gccgoprefix = flag.String("gccgoprefix", "", "-fgo-prefix option used with gccgo")
index 513b0ed001ff230f8cbabe3e0749e1d29ef3818f..30f828c4e919f494cd07f37f2690d5b314dc6cc5 100644 (file)
@@ -166,10 +166,33 @@ func (p *Package) writeDefs() {
                }
        }
 
+       fgcc := creat(*objDir + "_cgo_export.c")
+       fgcch := creat(*objDir + "_cgo_export.h")
        if *gccgo {
-               p.writeGccgoExports(fgo2, fm)
+               p.writeGccgoExports(fgo2, fm, fgcc, fgcch)
        } else {
-               p.writeExports(fgo2, fm)
+               p.writeExports(fgo2, fm, fgcc, fgcch)
+       }
+       if err := fgcc.Close(); err != nil {
+               fatalf("%s", err)
+       }
+       if err := fgcch.Close(); err != nil {
+               fatalf("%s", err)
+       }
+
+       if *exportHeader != "" && len(p.ExpFunc) > 0 {
+               fexp := creat(*exportHeader)
+               fgcch, err := os.Open(*objDir + "_cgo_export.h")
+               if err != nil {
+                       fatalf("%s", err)
+               }
+               _, err = io.Copy(fexp, fgcch)
+               if err != nil {
+                       fatalf("%s", err)
+               }
+               if err = fexp.Close(); err != nil {
+                       fatalf("%s", err)
+               }
        }
 
        init := gccgoInit.String()
@@ -634,10 +657,7 @@ func (p *Package) packedAttribute() string {
 
 // Write out the various stubs we need to support functions exported
 // from Go so that they are callable from C.
-func (p *Package) writeExports(fgo2, fm io.Writer) {
-       fgcc := creat(*objDir + "_cgo_export.c")
-       fgcch := creat(*objDir + "_cgo_export.h")
-
+func (p *Package) writeExports(fgo2, fm, fgcc, fgcch io.Writer) {
        p.writeExportHeader(fgcch)
 
        fmt.Fprintf(fgcc, "/* Created by cgo - DO NOT EDIT. */\n")
@@ -829,10 +849,7 @@ func (p *Package) writeExports(fgo2, fm io.Writer) {
 }
 
 // Write out the C header allowing C code to call exported gccgo functions.
-func (p *Package) writeGccgoExports(fgo2, fm io.Writer) {
-       fgcc := creat(*objDir + "_cgo_export.c")
-       fgcch := creat(*objDir + "_cgo_export.h")
-
+func (p *Package) writeGccgoExports(fgo2, fm, fgcc, fgcch io.Writer) {
        gccgoSymbolPrefix := p.gccgoSymbolPrefix()
 
        p.writeExportHeader(fgcch)