mirror of
https://github.com/Z3Prover/z3
synced 2026-04-28 06:43:36 +00:00
Fix Go bindings compilation issues and add to CI
- Fix malformed z3.go with duplicate function body fragments - Fix datatype.go to use Z3_del_constructor and Z3_del_constructor_list instead of non-existent inc_ref/dec_ref functions - Remove non-existent Push/Pop methods from fixedpoint.go - Fix CMake Go bindings targets quoting for proper LDFLAGS handling - Add Go bindings support to ubuntu-cmake CI jobs Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
parent
c454b14c24
commit
bbc1e501ab
4 changed files with 14 additions and 49 deletions
|
|
@ -4,7 +4,7 @@
|
||||||
# Go bindings use CGO and are typically built using the Go toolchain directly.
|
# Go bindings use CGO and are typically built using the Go toolchain directly.
|
||||||
# However, we can set up installation targets here.
|
# However, we can set up installation targets here.
|
||||||
|
|
||||||
if(BUILD_GO_BINDINGS)
|
if(Z3_BUILD_GO_BINDINGS)
|
||||||
message(STATUS "Z3 Go bindings will be installed")
|
message(STATUS "Z3 Go bindings will be installed")
|
||||||
|
|
||||||
# Install Go source files
|
# Install Go source files
|
||||||
|
|
@ -27,26 +27,29 @@ if(BUILD_GO_BINDINGS)
|
||||||
message(STATUS "Found Go: ${GO_EXECUTABLE}")
|
message(STATUS "Found Go: ${GO_EXECUTABLE}")
|
||||||
|
|
||||||
# Custom target to build Go bindings
|
# Custom target to build Go bindings
|
||||||
|
set(CGO_LDFLAGS_VALUE "-L${CMAKE_BINARY_DIR} -lz3")
|
||||||
add_custom_target(go-bindings
|
add_custom_target(go-bindings
|
||||||
COMMAND ${CMAKE_COMMAND} -E env
|
COMMAND ${CMAKE_COMMAND} -E env
|
||||||
CGO_CFLAGS=-I${CMAKE_SOURCE_DIR}/src/api
|
CGO_CFLAGS=-I${CMAKE_SOURCE_DIR}/src/api
|
||||||
CGO_LDFLAGS=-L${CMAKE_BINARY_DIR} -lz3
|
CGO_LDFLAGS=${CGO_LDFLAGS_VALUE}
|
||||||
${GO_EXECUTABLE} build -v
|
${GO_EXECUTABLE} build -v
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
COMMENT "Building Go bindings"
|
COMMENT "Building Go bindings"
|
||||||
DEPENDS libz3
|
DEPENDS libz3
|
||||||
|
VERBATIM
|
||||||
)
|
)
|
||||||
|
|
||||||
# Custom target to test Go examples
|
# Custom target to test Go examples
|
||||||
add_custom_target(test-go-examples
|
add_custom_target(test-go-examples
|
||||||
COMMAND ${CMAKE_COMMAND} -E env
|
COMMAND ${CMAKE_COMMAND} -E env
|
||||||
CGO_CFLAGS=-I${CMAKE_SOURCE_DIR}/src/api
|
CGO_CFLAGS=-I${CMAKE_SOURCE_DIR}/src/api
|
||||||
CGO_LDFLAGS=-L${CMAKE_BINARY_DIR} -lz3
|
CGO_LDFLAGS=${CGO_LDFLAGS_VALUE}
|
||||||
LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}:$ENV{LD_LIBRARY_PATH}
|
LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}:$ENV{LD_LIBRARY_PATH}
|
||||||
PATH=${CMAKE_BINARY_DIR}\;$ENV{PATH}
|
PATH=${CMAKE_BINARY_DIR}$<SEMICOLON>$ENV{PATH}
|
||||||
${GO_EXECUTABLE} run ${CMAKE_SOURCE_DIR}/examples/go/basic_example.go
|
${GO_EXECUTABLE} run ${CMAKE_SOURCE_DIR}/examples/go/basic_example.go
|
||||||
COMMENT "Running Go examples"
|
COMMENT "Running Go examples"
|
||||||
DEPENDS libz3
|
DEPENDS libz3
|
||||||
|
VERBATIM
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
message(STATUS "Go not found - Go bindings can be built manually")
|
message(STATUS "Go not found - Go bindings can be built manually")
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,10 @@ type Constructor struct {
|
||||||
// newConstructor creates a new Constructor and manages its reference count.
|
// newConstructor creates a new Constructor and manages its reference count.
|
||||||
func newConstructor(ctx *Context, ptr C.Z3_constructor) *Constructor {
|
func newConstructor(ctx *Context, ptr C.Z3_constructor) *Constructor {
|
||||||
c := &Constructor{ctx: ctx, ptr: ptr}
|
c := &Constructor{ctx: ctx, ptr: ptr}
|
||||||
C.Z3_constructor_inc_ref(ctx.ptr, ptr)
|
// Note: Z3_constructor doesn't use inc_ref/dec_ref pattern
|
||||||
|
// It uses Z3_del_constructor for cleanup
|
||||||
runtime.SetFinalizer(c, func(cons *Constructor) {
|
runtime.SetFinalizer(c, func(cons *Constructor) {
|
||||||
C.Z3_constructor_dec_ref(cons.ctx.ptr, cons.ptr)
|
C.Z3_del_constructor(cons.ctx.ptr, cons.ptr)
|
||||||
})
|
})
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
@ -90,9 +91,10 @@ type ConstructorList struct {
|
||||||
// newConstructorList creates a new ConstructorList and manages its reference count.
|
// newConstructorList creates a new ConstructorList and manages its reference count.
|
||||||
func newConstructorList(ctx *Context, ptr C.Z3_constructor_list) *ConstructorList {
|
func newConstructorList(ctx *Context, ptr C.Z3_constructor_list) *ConstructorList {
|
||||||
cl := &ConstructorList{ctx: ctx, ptr: ptr}
|
cl := &ConstructorList{ctx: ctx, ptr: ptr}
|
||||||
C.Z3_constructor_list_inc_ref(ctx.ptr, ptr)
|
// Note: Z3_constructor_list doesn't use inc_ref/dec_ref pattern
|
||||||
|
// It uses Z3_del_constructor_list for cleanup
|
||||||
runtime.SetFinalizer(cl, func(list *ConstructorList) {
|
runtime.SetFinalizer(cl, func(list *ConstructorList) {
|
||||||
C.Z3_constructor_list_dec_ref(list.ctx.ptr, list.ptr)
|
C.Z3_del_constructor_list(list.ctx.ptr, list.ptr)
|
||||||
})
|
})
|
||||||
return cl
|
return cl
|
||||||
}
|
}
|
||||||
|
|
@ -152,7 +154,7 @@ func (c *Context) MkDatatypeSorts(names []string, constructorLists [][]*Construc
|
||||||
|
|
||||||
// Clean up constructor lists
|
// Clean up constructor lists
|
||||||
for i := range cLists {
|
for i := range cLists {
|
||||||
C.Z3_constructor_list_dec_ref(c.ptr, cLists[i])
|
C.Z3_del_constructor_list(c.ptr, cLists[i])
|
||||||
}
|
}
|
||||||
|
|
||||||
sorts := make([]*Sort, numTypes)
|
sorts := make([]*Sort, numTypes)
|
||||||
|
|
|
||||||
|
|
@ -195,16 +195,6 @@ func (f *Fixedpoint) GetAssertions() *ASTVector {
|
||||||
return newASTVector(f.ctx, ptr)
|
return newASTVector(f.ctx, ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Push creates a backtracking point
|
|
||||||
func (f *Fixedpoint) Push() {
|
|
||||||
C.Z3_fixedpoint_push(f.ctx.ptr, f.ptr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pop backtracks one backtracking point
|
|
||||||
func (f *Fixedpoint) Pop() {
|
|
||||||
C.Z3_fixedpoint_pop(f.ctx.ptr, f.ptr)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetPredicateRepresentation sets the predicate representation for a given relation
|
// SetPredicateRepresentation sets the predicate representation for a given relation
|
||||||
func (f *Fixedpoint) SetPredicateRepresentation(funcDecl *FuncDecl, kinds []C.Z3_symbol) {
|
func (f *Fixedpoint) SetPredicateRepresentation(funcDecl *FuncDecl, kinds []C.Z3_symbol) {
|
||||||
if len(kinds) == 0 {
|
if len(kinds) == 0 {
|
||||||
|
|
|
||||||
|
|
@ -341,36 +341,6 @@ func (c *Context) MkXor(lhs, rhs *Expr) *Expr {
|
||||||
return newExpr(c, C.Z3_mk_xor(c.ptr, lhs.ptr, rhs.ptr))
|
return newExpr(c, C.Z3_mk_xor(c.ptr, lhs.ptr, rhs.ptr))
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(exprs) == 1 {
|
|
||||||
return exprs[0]
|
|
||||||
}
|
|
||||||
cExprs := make([]C.Z3_ast, len(exprs))
|
|
||||||
for i, e := range exprs {
|
|
||||||
cExprs[i] = e.ptr
|
|
||||||
}
|
|
||||||
return newExpr(c, C.Z3_mk_add(c.ptr, C.uint(len(exprs)), &cExprs[0]))
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(exprs) == 1 {
|
|
||||||
return newExpr(c, C.Z3_mk_unary_minus(c.ptr, exprs[0].ptr))
|
|
||||||
}
|
|
||||||
cExprs := make([]C.Z3_ast, len(exprs))
|
|
||||||
for i, e := range exprs {
|
|
||||||
cExprs[i] = e.ptr
|
|
||||||
}
|
|
||||||
return newExpr(c, C.Z3_mk_sub(c.ptr, C.uint(len(exprs)), &cExprs[0]))
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(exprs) == 1 {
|
|
||||||
return exprs[0]
|
|
||||||
}
|
|
||||||
cExprs := make([]C.Z3_ast, len(exprs))
|
|
||||||
for i, e := range exprs {
|
|
||||||
cExprs[i] = e.ptr
|
|
||||||
}
|
|
||||||
return newExpr(c, C.Z3_mk_mul(c.ptr, C.uint(len(exprs)), &cExprs[0]))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Comparison operations
|
// Comparison operations
|
||||||
|
|
||||||
// MkEq creates an equality.
|
// MkEq creates an equality.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue