You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2017/02/23 22:51:43 UTC

[36/38] qpid-proton git commit: NO-JIRA: go wrappers re-generated to be compatible with proton-c 0.10

NO-JIRA: go wrappers re-generated to be compatible with proton-c 0.10

Some new definitions had creeped into the wrappers_gen.go that would fail to
build with older versions of proton-c.

Updated genwrap.go:
- -include option generates from installed headers instead of git source
- explicitly include the intended minimum C version
- fail attempts to generate from newer headers

Added test-versions.sh, takes a list of install prefixes where proton is
installed and runs go test on the git go sources against each one.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/c94301d5
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/c94301d5
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/c94301d5

Branch: refs/heads/go1
Commit: c94301d59ce0a9a8863d3bd71919c1acfebce533
Parents: c87b23e
Author: Alan Conway <ac...@redhat.com>
Authored: Thu Feb 23 16:39:14 2017 -0500
Committer: Alan Conway <ac...@redhat.com>
Committed: Thu Feb 23 17:10:22 2017 -0500

----------------------------------------------------------------------
 proton-c/bindings/go/genwrap.go                 | 77 ++++++++++++++++----
 .../go/src/qpid.apache.org/amqp/version.go      |  8 +-
 .../src/qpid.apache.org/proton/wrappers_gen.go  | 39 +---------
 proton-c/bindings/go/test-versions.sh           | 50 +++++++++++++
 4 files changed, 125 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c94301d5/proton-c/bindings/go/genwrap.go
----------------------------------------------------------------------
diff --git a/proton-c/bindings/go/genwrap.go b/proton-c/bindings/go/genwrap.go
index 6885b74..0bf13fa 100644
--- a/proton-c/bindings/go/genwrap.go
+++ b/proton-c/bindings/go/genwrap.go
@@ -22,6 +22,12 @@ under the License.
 // Not run automatically, generated sources are checked in. To update the
 // generated sources run `go run genwrap.go` in this directory.
 //
+// WARNING: generating code from the wrong proton header file versions
+// will break compatibility guarantees. This program will attempt to detect
+// such errors. If you are deliberately changing the compatibility requirements
+// update the variable minVersion below.
+//
+
 package main
 
 import (
@@ -37,12 +43,61 @@ import (
 	"text/template"
 )
 
-var includeProton = "../../include/proton"
-var outpath = "src/qpid.apache.org/proton/wrappers_gen.go"
+var minVersion = "0.10" // The minimum version of proton-c that the Go binding can use
+var include = flag.String("include", "../../include", "Directory containing proton/*.h include files")
+
+var versionH = regexp.MustCompile("(?s:PN_VERSION_MAJOR ([0-9]+).*PN_VERSION_MINOR ([0-9]+))")
+var versionTxt = regexp.MustCompile("^[0-9]+\\.[0-9]+")
 
 func main() {
 	flag.Parse()
-	out, err := os.Create(outpath)
+	genVersion()
+	genWrappers()
+}
+
+func getVersion() string {
+	_, err := ioutil.ReadFile(path.Join(*include, "proton/version.h.in"))
+	if err == nil {
+		// We are using the headers in git sources, get the version.txt
+		vt, err := ioutil.ReadFile(path.Join(*include, "../../version.txt"))
+		panicIf(err)
+		return versionTxt.FindString(string(vt))
+	}
+	vh, err := ioutil.ReadFile(path.Join(*include, "proton/version.h"))
+	if err == nil {
+		// We are using installed headers
+		return strings.Join(versionH.FindStringSubmatch(string(vh))[1:], ".")
+	}
+	panic(err)
+}
+
+func genVersion() {
+	version := getVersion()
+	if minVersion != version {
+		panic(fmt.Errorf("Generating from wrong version %v, expected %v", version, minVersion))
+	}
+	out, err := os.Create("src/qpid.apache.org/amqp/version.go")
+	panicIf(err)
+	defer out.Close()
+	splitVersion := strings.Split(minVersion, ".")
+	fmt.Fprintf(out, copyright+`
+
+package amqp
+
+// Version check for proton library.
+// Done here because this is the lowest-level dependency for all the proton Go packages.
+
+// #include <proton/version.h>
+// #if PN_VERSION_MAJOR == %s && PN_VERSION_MINOR < %s
+// #error packages qpid.apache.org/... require Proton-C library version 0.10 or greater
+// #endif
+import "C"
+`, splitVersion[0], splitVersion[1])
+}
+
+func genWrappers() {
+	outPath := "src/qpid.apache.org/proton/wrappers_gen.go"
+	out, err := os.Create(outPath)
 	panicIf(err)
 	defer out.Close()
 
@@ -56,11 +111,13 @@ import (
   "unsafe"
 )
 
-// #include <proton/types.h>
-// #include <proton/error.h>
 // #include <proton/condition.h>
+// #include <proton/error.h>
 // #include <proton/event.h>
+// #include <proton/types.h>
 // #include <stdlib.h>
+import "C"
+
 `)
 	for _, api := range apis {
 		fmt.Fprintf(out, "// #include <proton/%s.h>\n", api)
@@ -79,13 +136,7 @@ import (
 		apiWrapFns(api, header, out)
 	}
 	out.Close()
-
-	// Run gofmt.
-	cmd := exec.Command("gofmt", "-w", outpath)
-	cmd.Stdout = os.Stdout
-	cmd.Stderr = os.Stderr
-	err = cmd.Run()
-	if err != nil {
+	if err := exec.Command("gofmt", "-w", outPath).Run(); err != nil {
 		fmt.Fprintf(os.Stderr, "gofmt: %s", err)
 		os.Exit(1)
 	}
@@ -161,7 +212,7 @@ func panicIf(err error) {
 }
 
 func readHeader(name string) string {
-	s, err := ioutil.ReadFile(path.Join(includeProton, name+".h"))
+	s, err := ioutil.ReadFile(path.Join(*include, "proton", name+".h"))
 	panicIf(err)
 	return string(s)
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c94301d5/proton-c/bindings/go/src/qpid.apache.org/amqp/version.go
----------------------------------------------------------------------
diff --git a/proton-c/bindings/go/src/qpid.apache.org/amqp/version.go b/proton-c/bindings/go/src/qpid.apache.org/amqp/version.go
index cefa904..bf33d2b 100644
--- a/proton-c/bindings/go/src/qpid.apache.org/amqp/version.go
+++ b/proton-c/bindings/go/src/qpid.apache.org/amqp/version.go
@@ -17,13 +17,19 @@ specific language governing permissions and limitations
 under the License.
 */
 
+//
+// NOTE: DO NOT EDIT. This file was generated by genwrap.go from the proton header files.
+// Update the generator and re-run if you need to modify this code.
+//
+
+
 package amqp
 
 // Version check for proton library.
 // Done here because this is the lowest-level dependency for all the proton Go packages.
 
 // #include <proton/version.h>
-// #if PN_VERSION_MINOR < 10
+// #if PN_VERSION_MAJOR == 0 && PN_VERSION_MINOR < 10
 // #error packages qpid.apache.org/... require Proton-C library version 0.10 or greater
 // #endif
 import "C"

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c94301d5/proton-c/bindings/go/src/qpid.apache.org/proton/wrappers_gen.go
----------------------------------------------------------------------
diff --git a/proton-c/bindings/go/src/qpid.apache.org/proton/wrappers_gen.go b/proton-c/bindings/go/src/qpid.apache.org/proton/wrappers_gen.go
index a6c6635..0db04c8 100644
--- a/proton-c/bindings/go/src/qpid.apache.org/proton/wrappers_gen.go
+++ b/proton-c/bindings/go/src/qpid.apache.org/proton/wrappers_gen.go
@@ -29,11 +29,13 @@ import (
 	"unsafe"
 )
 
-// #include <proton/types.h>
-// #include <proton/error.h>
 // #include <proton/condition.h>
+// #include <proton/error.h>
 // #include <proton/event.h>
+// #include <proton/types.h>
 // #include <stdlib.h>
+import "C"
+
 // #include <proton/session.h>
 // #include <proton/link.h>
 // #include <proton/delivery.h>
@@ -78,13 +80,6 @@ const (
 	ETransportHeadClosed    EventType = C.PN_TRANSPORT_HEAD_CLOSED
 	ETransportTailClosed    EventType = C.PN_TRANSPORT_TAIL_CLOSED
 	ETransportClosed        EventType = C.PN_TRANSPORT_CLOSED
-	EConnectionWake         EventType = C.PN_CONNECTION_WAKE
-	EListenerAccept         EventType = C.PN_LISTENER_ACCEPT
-	EListenerClose          EventType = C.PN_LISTENER_CLOSE
-	EProactorInterrupt      EventType = C.PN_PROACTOR_INTERRUPT
-	EProactorTimeout        EventType = C.PN_PROACTOR_TIMEOUT
-	EProactorInactive       EventType = C.PN_PROACTOR_INACTIVE
-	EListenerOpen           EventType = C.PN_LISTENER_OPEN
 )
 
 func (e EventType) String() string {
@@ -150,20 +145,6 @@ func (e EventType) String() string {
 		return "TransportTailClosed"
 	case C.PN_TRANSPORT_CLOSED:
 		return "TransportClosed"
-	case C.PN_CONNECTION_WAKE:
-		return "ConnectionWake"
-	case C.PN_LISTENER_ACCEPT:
-		return "ListenerAccept"
-	case C.PN_LISTENER_CLOSE:
-		return "ListenerClose"
-	case C.PN_PROACTOR_INTERRUPT:
-		return "ProactorInterrupt"
-	case C.PN_PROACTOR_TIMEOUT:
-		return "ProactorTimeout"
-	case C.PN_PROACTOR_INACTIVE:
-		return "ProactorInactive"
-	case C.PN_LISTENER_OPEN:
-		return "ListenerOpen"
 	}
 	return "Unknown"
 }
@@ -373,15 +354,6 @@ func (l Link) SetDrain(drain bool) {
 func (l Link) Draining() bool {
 	return bool(C.pn_link_draining(l.pn))
 }
-func (l Link) MaxMessageSize() uint64 {
-	return uint64(C.pn_link_max_message_size(l.pn))
-}
-func (l Link) SetMaxMessageSize(size uint64) {
-	C.pn_link_set_max_message_size(l.pn, C.uint64_t(size))
-}
-func (l Link) RemoteMaxMessageSize() uint64 {
-	return uint64(C.pn_link_remote_max_message_size(l.pn))
-}
 
 // Wrappers for declarations in delivery.h
 
@@ -529,9 +501,6 @@ func (c Condition) RedirectHost() string {
 func (c Condition) RedirectPort() int {
 	return int(C.pn_condition_redirect_port(c.pn))
 }
-func (c Condition) Copy(src Condition) int {
-	return int(C.pn_condition_copy(c.pn, src.pn))
-}
 
 // Wrappers for declarations in terminus.h
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/c94301d5/proton-c/bindings/go/test-versions.sh
----------------------------------------------------------------------
diff --git a/proton-c/bindings/go/test-versions.sh b/proton-c/bindings/go/test-versions.sh
new file mode 100755
index 0000000..0022ce3
--- /dev/null
+++ b/proton-c/bindings/go/test-versions.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+#
+# Takes a list of install prefixes and tests the go source under the current directory
+# against the proton install in each prefix.
+#
+# NOTE: This script will fail if it finds proton headers or libraries installed in standard
+# places or on the existing paths, to avoid possible confusion.
+#
+
+for VAR in LD_LIBRARY_PATH LIBRARY_PATH C_INCLUDE_PATH; do
+    declare OLD_${VAR}=${!VAR};
+done
+
+prefix() {
+    prefix=$1
+    export LD_LIBRARY_PATH="$prefix/lib64:$prefix/lib:$OLD_LD_LIBRARY_PATH"
+    export LIBRARY_PATH="$prefix/lib64:$prefix/lib:$OLD_LIBRARY_PATH"
+    export C_INCLUDE_PATH="$prefix/include:$OLD_C_INCLUDE_PATH"
+}
+
+TEMP=$(mktemp -d)
+trap "rm -rf $TEMP"  EXIT
+set -o pipefail
+
+cat > $TEMP/test.c  <<EOF
+#include <proton/connection.h>
+int main(int c, char **a) { return 0; }
+EOF
+cc $TEMP/test.c 2> /dev/null && {
+    echo "cc found proton in include path"; cc -E | grep proton/connection.h | head -n1; exit 1; } 1>&2
+
+cat > $TEMP/test.c  <<EOF
+int main(int c, char **a) { return 0; }
+EOF
+cc -lqpid-proton $TEMPC 2>/dev/null && { echo "cc found proton in library path" 1>&2 ; exit 1; }
+
+for P in "$@"; do
+    (
+        case $P in
+            /*) ;;
+            *) P=$PWD/$P;;
+        esac
+        test -d $P || { echo "no such directory: $P"; continue; }
+        echo ==== $P
+        prefix $P
+        export GOPATH=$PWD
+        git clean -dfx
+        go test qpid.apache.org/...
+    )
+done


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org