mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 12:08:18 +00:00
c++ example
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
5135eecc2d
commit
be97785253
10
examples/c++/README
Normal file
10
examples/c++/README
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
Small example using the c++ bindings.
|
||||||
|
To build the example execute
|
||||||
|
make examples
|
||||||
|
in the build directory.
|
||||||
|
|
||||||
|
This command will create the executable cpp_example.
|
||||||
|
On Windows, you can just execute it.
|
||||||
|
On OSX and Linux, you must install z3 first using
|
||||||
|
sudo make install
|
||||||
|
OR update LD_LIBRARY_PATH (Linux) or DYLD_LIBRARY_PATH (OSX) with the build directory. You need that to be able to find the Z3 shared library.
|
|
@ -1,24 +0,0 @@
|
||||||
This directory contains scripts to build the test application using
|
|
||||||
Microsoft C compiler, or g++.
|
|
||||||
|
|
||||||
1) Using Microsoft C compiler
|
|
||||||
|
|
||||||
Use 'build.cmd' to build the test application using Microsoft C
|
|
||||||
compiler.
|
|
||||||
|
|
||||||
Remark: The Microsoft C compiler (cl) must be in your path,
|
|
||||||
or you can use the Visual Studio Command Prompt.
|
|
||||||
|
|
||||||
The script 'exec.cmd' adds the bin directory to the path. So,
|
|
||||||
example.exe can find z3.dll.
|
|
||||||
|
|
||||||
2) Using gcc
|
|
||||||
|
|
||||||
You must install Z3 before running this example.
|
|
||||||
To install Z3, execute the following command in the Z3 root directory.
|
|
||||||
|
|
||||||
sudo make install
|
|
||||||
|
|
||||||
Use 'build.sh' to build the test application using g++.
|
|
||||||
It generates the executable 'example'.
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
cl /EHsc /I ..\..\include /I . ..\..\bin\z3.lib example.cpp
|
|
|
@ -1 +0,0 @@
|
||||||
cl /W3 /EHsc /I ..\lib ..\debug\z3_dbg.lib example.cpp
|
|
|
@ -1,9 +0,0 @@
|
||||||
if g++ -fopenmp -o example example.cpp -lz3; then
|
|
||||||
echo "Example was successfully compiled."
|
|
||||||
echo "To run example, execute:"
|
|
||||||
echo " ./example"
|
|
||||||
else
|
|
||||||
echo "You must install Z3 before compiling this example."
|
|
||||||
echo "To install Z3, execute the following command in the Z3 root directory."
|
|
||||||
echo " sudo make install"
|
|
||||||
fi
|
|
|
@ -1,5 +0,0 @@
|
||||||
@echo off
|
|
||||||
SETLOCAL
|
|
||||||
set PATH=..\..\bin;%PATH%
|
|
||||||
example.exe
|
|
||||||
ENDLOCAL
|
|
|
@ -71,7 +71,10 @@ add_dll('api_dll', ['api', 'sat', 'extra_cmds'], 'api/dll',
|
||||||
dll_name='libz3',
|
dll_name='libz3',
|
||||||
export_files=API_files)
|
export_files=API_files)
|
||||||
add_dot_net_dll('dotnet', ['api_dll'], 'bindings/dotnet', dll_name='Microsoft.Z3', assembly_info_dir='Properties')
|
add_dot_net_dll('dotnet', ['api_dll'], 'bindings/dotnet', dll_name='Microsoft.Z3', assembly_info_dir='Properties')
|
||||||
|
add_hlib('cpp', 'bindings/c++', includes2install=['z3++.h'])
|
||||||
set_z3py_dir('bindings/python')
|
set_z3py_dir('bindings/python')
|
||||||
|
# Examples
|
||||||
|
add_cpp_example('cpp_example', 'c++')
|
||||||
|
|
||||||
update_version(4, 2, 0, 0)
|
update_version(4, 2, 0, 0)
|
||||||
mk_auto_src()
|
mk_auto_src()
|
||||||
|
|
|
@ -21,6 +21,15 @@ PYTHON_PACKAGE_DIR=distutils.sysconfig.get_python_lib()
|
||||||
BUILD_DIR='build'
|
BUILD_DIR='build'
|
||||||
REV_BUILD_DIR='..'
|
REV_BUILD_DIR='..'
|
||||||
SRC_DIR='src'
|
SRC_DIR='src'
|
||||||
|
EXAMPLE_DIR='examples'
|
||||||
|
# Required Components
|
||||||
|
Z3_DLL_COMPONENT='api_dll'
|
||||||
|
PATTERN_COMPONENT='pattern'
|
||||||
|
UTIL_COMPONENT='util'
|
||||||
|
API_COMPONENT='api'
|
||||||
|
DOTNET_COMPONENT='dotnet'
|
||||||
|
CPP_COMPONENT='cpp'
|
||||||
|
#####################
|
||||||
IS_WINDOW=False
|
IS_WINDOW=False
|
||||||
VERBOSE=True
|
VERBOSE=True
|
||||||
DEBUG_MODE=False
|
DEBUG_MODE=False
|
||||||
|
@ -339,6 +348,9 @@ class Component:
|
||||||
def mk_uninstall(self, out):
|
def mk_uninstall(self, out):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def is_example(self):
|
||||||
|
return False
|
||||||
|
|
||||||
class LibComponent(Component):
|
class LibComponent(Component):
|
||||||
def __init__(self, name, path, deps, includes2install):
|
def __init__(self, name, path, deps, includes2install):
|
||||||
Component.__init__(self, name, path, deps)
|
Component.__init__(self, name, path, deps)
|
||||||
|
@ -373,6 +385,14 @@ class LibComponent(Component):
|
||||||
for include in self.includes2install:
|
for include in self.includes2install:
|
||||||
out.write('\t@rm -f $(PREFIX)/include/%s\n' % include)
|
out.write('\t@rm -f $(PREFIX)/include/%s\n' % include)
|
||||||
|
|
||||||
|
# "Library" containing only .h files. This is just a placeholder for includes files to be installed.
|
||||||
|
class HLibComponent(LibComponent):
|
||||||
|
def __init__(self, name, path, includes2install):
|
||||||
|
LibComponent.__init__(self, name, path, [], includes2install)
|
||||||
|
|
||||||
|
def mk_makefile(self, out):
|
||||||
|
return
|
||||||
|
|
||||||
# Auxiliary function for sort_components
|
# Auxiliary function for sort_components
|
||||||
def comp_components(c1, c2):
|
def comp_components(c1, c2):
|
||||||
id1 = get_component(c1).id
|
id1 = get_component(c1).id
|
||||||
|
@ -551,7 +571,41 @@ class DotNetDLLComponent(Component):
|
||||||
|
|
||||||
def has_assembly_info(self):
|
def has_assembly_info(self):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
class ExampleComponent(Component):
|
||||||
|
def __init__(self, name, path):
|
||||||
|
Component.__init__(self, name, path, [])
|
||||||
|
self.ex_dir = '%s/%s' % (EXAMPLE_DIR, path)
|
||||||
|
self.to_ex_dir = '%s/%s' % (REV_BUILD_DIR, self.ex_dir)
|
||||||
|
|
||||||
|
def is_example(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
class CppExampleComponent(ExampleComponent):
|
||||||
|
def __init__(self, name, path):
|
||||||
|
ExampleComponent.__init__(self, name, path)
|
||||||
|
|
||||||
|
def mk_makefile(self, out):
|
||||||
|
dll_name = get_component(Z3_DLL_COMPONENT).dll_name
|
||||||
|
dll = '%s$(SO_EXT)' % dll_name
|
||||||
|
exefile = '%s$(EXE_EXT)' % self.name
|
||||||
|
out.write('%s: %s' % (exefile, dll))
|
||||||
|
for cppfile in get_cpp_files(self.ex_dir):
|
||||||
|
out.write(' ')
|
||||||
|
out.write('%s/%s' % (self.to_ex_dir, cppfile))
|
||||||
|
out.write('\n')
|
||||||
|
out.write('\t$(LINK) $(LINK_OUT_FLAG)%s $(LINK_FLAGS)' % exefile)
|
||||||
|
# Add include dir components
|
||||||
|
out.write(' -I%s' % get_component(API_COMPONENT).to_src_dir)
|
||||||
|
out.write(' -I%s' % get_component(CPP_COMPONENT).to_src_dir)
|
||||||
|
for cppfile in get_cpp_files(self.ex_dir):
|
||||||
|
out.write(' ')
|
||||||
|
out.write('%s/%s' % (self.to_ex_dir, cppfile))
|
||||||
|
out.write(' ')
|
||||||
|
out.write(dll)
|
||||||
|
out.write(' $(LINK_EXTRA_FLAGS)\n')
|
||||||
|
if exefile.strip(' ') != self.name:
|
||||||
|
out.write('_ex_%s: %s\n\n' % (self.name, exefile))
|
||||||
|
|
||||||
def reg_component(name, c):
|
def reg_component(name, c):
|
||||||
global _Id, _Components, _ComponentNames, _Name2Component
|
global _Id, _Components, _ComponentNames, _Name2Component
|
||||||
|
@ -567,6 +621,10 @@ def add_lib(name, deps=[], path=None, includes2install=[]):
|
||||||
c = LibComponent(name, path, deps, includes2install)
|
c = LibComponent(name, path, deps, includes2install)
|
||||||
reg_component(name, c)
|
reg_component(name, c)
|
||||||
|
|
||||||
|
def add_hlib(name, path=None, includes2install=[]):
|
||||||
|
c = HLibComponent(name, path, includes2install)
|
||||||
|
reg_component(name, c)
|
||||||
|
|
||||||
def add_exe(name, deps=[], path=None, exe_name=None, install=True):
|
def add_exe(name, deps=[], path=None, exe_name=None, install=True):
|
||||||
c = ExeComponent(name, exe_name, path, deps, install)
|
c = ExeComponent(name, exe_name, path, deps, install)
|
||||||
reg_component(name, c)
|
reg_component(name, c)
|
||||||
|
@ -579,6 +637,10 @@ def add_dot_net_dll(name, deps=[], path=None, dll_name=None, assembly_info_dir=N
|
||||||
c = DotNetDLLComponent(name, dll_name, path, deps, assembly_info_dir)
|
c = DotNetDLLComponent(name, dll_name, path, deps, assembly_info_dir)
|
||||||
reg_component(name, c)
|
reg_component(name, c)
|
||||||
|
|
||||||
|
def add_cpp_example(name, path=None):
|
||||||
|
c = CppExampleComponent(name, path)
|
||||||
|
reg_component(name, c)
|
||||||
|
|
||||||
# Copy configuration correct file to BUILD_DIR
|
# Copy configuration correct file to BUILD_DIR
|
||||||
def cp_config_mk():
|
def cp_config_mk():
|
||||||
if IS_WINDOW:
|
if IS_WINDOW:
|
||||||
|
@ -639,6 +701,12 @@ def mk_makefile():
|
||||||
out.write('\n\t@echo Z3 was successfully built.\n')
|
out.write('\n\t@echo Z3 was successfully built.\n')
|
||||||
out.write("\t@echo Use the following command to install Z3 at prefix $(PREFIX).\n")
|
out.write("\t@echo Use the following command to install Z3 at prefix $(PREFIX).\n")
|
||||||
out.write('\t@echo " sudo make install"\n')
|
out.write('\t@echo " sudo make install"\n')
|
||||||
|
# Generate :examples rule
|
||||||
|
out.write('examples:')
|
||||||
|
for c in _Components:
|
||||||
|
if c.is_example():
|
||||||
|
out.write(' _ex_%s' % c.name)
|
||||||
|
out.write('\n\t@echo Z3 examples were successfully built.\n')
|
||||||
# Generate components
|
# Generate components
|
||||||
for c in _Components:
|
for c in _Components:
|
||||||
c.mk_makefile(out)
|
c.mk_makefile(out)
|
||||||
|
@ -676,7 +744,7 @@ def mk_auto_src():
|
||||||
# TODO: delete after src/ast/pattern/expr_pattern_match
|
# TODO: delete after src/ast/pattern/expr_pattern_match
|
||||||
# database.smt ==> database.h
|
# database.smt ==> database.h
|
||||||
def mk_pat_db():
|
def mk_pat_db():
|
||||||
c = get_component('pattern')
|
c = get_component(PATTERN_COMPONENT)
|
||||||
fin = open('%s/database.smt2' % c.src_dir, 'r')
|
fin = open('%s/database.smt2' % c.src_dir, 'r')
|
||||||
fout = open('%s/database.h' % c.src_dir, 'w')
|
fout = open('%s/database.h' % c.src_dir, 'w')
|
||||||
fout.write('char const * g_pattern_database =\n')
|
fout.write('char const * g_pattern_database =\n')
|
||||||
|
@ -695,7 +763,7 @@ def update_version(major, minor, build, revision):
|
||||||
|
|
||||||
# Update files with the version number
|
# Update files with the version number
|
||||||
def mk_version_dot_h(major, minor, build, revision):
|
def mk_version_dot_h(major, minor, build, revision):
|
||||||
c = get_component('util')
|
c = get_component(UTIL_COMPONENT)
|
||||||
fout = open('%s/version.h' % c.src_dir, 'w')
|
fout = open('%s/version.h' % c.src_dir, 'w')
|
||||||
fout.write('// automatically generated file.\n')
|
fout.write('// automatically generated file.\n')
|
||||||
fout.write('#define Z3_MAJOR_VERSION %s\n' % major)
|
fout.write('#define Z3_MAJOR_VERSION %s\n' % major)
|
||||||
|
@ -873,7 +941,7 @@ def mk_bindings(api_files):
|
||||||
mk_z3consts_py(api_files)
|
mk_z3consts_py(api_files)
|
||||||
mk_z3consts_donet(api_files)
|
mk_z3consts_donet(api_files)
|
||||||
new_api_files = []
|
new_api_files = []
|
||||||
api = get_component('api')
|
api = get_component(API_COMPONENT)
|
||||||
for api_file in api_files:
|
for api_file in api_files:
|
||||||
api_file_path = api.find_file(api_file, api.name)
|
api_file_path = api.find_file(api_file, api.name)
|
||||||
new_api_files.append('%s/%s' % (api_file_path.src_dir, api_file))
|
new_api_files.append('%s/%s' % (api_file_path.src_dir, api_file))
|
||||||
|
@ -896,7 +964,7 @@ def mk_z3consts_py(api_files):
|
||||||
z3consts = open('%s/z3consts.py' % Z3PY_SRC_DIR, 'w')
|
z3consts = open('%s/z3consts.py' % Z3PY_SRC_DIR, 'w')
|
||||||
z3consts.write('# Automatically generated file\n\n')
|
z3consts.write('# Automatically generated file\n\n')
|
||||||
|
|
||||||
api_dll = get_component('api_dll')
|
api_dll = get_component(Z3_DLL_COMPONENT)
|
||||||
|
|
||||||
for api_file in api_files:
|
for api_file in api_files:
|
||||||
api_file_c = api_dll.find_file(api_file, api_dll.name)
|
api_file_c = api_dll.find_file(api_file, api_dll.name)
|
||||||
|
@ -968,7 +1036,7 @@ def mk_z3consts_donet(api_files):
|
||||||
openbrace_pat = re.compile("{ *")
|
openbrace_pat = re.compile("{ *")
|
||||||
closebrace_pat = re.compile("}.*;")
|
closebrace_pat = re.compile("}.*;")
|
||||||
|
|
||||||
dotnet = get_component('dotnet')
|
dotnet = get_component(DOTNET_COMPONENT)
|
||||||
|
|
||||||
DeprecatedEnums = { 'Z3_search_failure' }
|
DeprecatedEnums = { 'Z3_search_failure' }
|
||||||
z3consts = open('%s/Enumerations.cs' % dotnet.src_dir, 'w')
|
z3consts = open('%s/Enumerations.cs' % dotnet.src_dir, 'w')
|
||||||
|
|
Loading…
Reference in a new issue