mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 12:08:18 +00:00
improving clang++ support
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
3e8d3db290
commit
ad3aa96726
2
README
2
README
|
@ -40,7 +40,7 @@ Remark: clang does not support OpenMP yet.
|
||||||
|
|
||||||
autoconf
|
autoconf
|
||||||
./configure CXX=clang++
|
./configure CXX=clang++
|
||||||
python scripts/mk_make.py --noomp
|
python scripts/mk_make.py
|
||||||
cd build
|
cd build
|
||||||
make
|
make
|
||||||
|
|
||||||
|
|
47
configure.ac
47
configure.ac
|
@ -83,7 +83,7 @@ fi
|
||||||
###################
|
###################
|
||||||
# Sets CXX
|
# Sets CXX
|
||||||
AC_LANG([C++])
|
AC_LANG([C++])
|
||||||
AC_PROG_CXX(g++ false)
|
AC_PROG_CXX(g++ clang++ false)
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
if test $CXX = "false"; then
|
if test $CXX = "false"; then
|
||||||
AC_MSG_ERROR([C++ compiler was not found])
|
AC_MSG_ERROR([C++ compiler was not found])
|
||||||
|
@ -99,8 +99,21 @@ AC_PROG_GREP
|
||||||
# Sets SED
|
# Sets SED
|
||||||
AC_PROG_SED
|
AC_PROG_SED
|
||||||
|
|
||||||
# Sets OPENMP_CFLAGS
|
AS_IF([test "$CXX" = "g++"], [
|
||||||
m4_ifdef([AC_OPENMP], [AC_OPENMP])
|
# Enable OpenMP
|
||||||
|
CXXFLAGS+=" -fopenmp"
|
||||||
|
LDFLAGS+=" -fopenmp"
|
||||||
|
SLIBEXTRAFLAGS+=" -fopenmp"
|
||||||
|
# Use -mfpmath=sse
|
||||||
|
CXXFLAGS+=" -mfpmath=sse"
|
||||||
|
],
|
||||||
|
[test "$CXX" = "clang++"], [
|
||||||
|
# OpenMP is not supported in clang++
|
||||||
|
CXXFLAGS+=" -D _NO_OMP_"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
AC_MSG_ERROR([Unsupported compiler: $CXX])
|
||||||
|
])
|
||||||
|
|
||||||
AR=ar
|
AR=ar
|
||||||
AC_SUBST(AR)
|
AC_SUBST(AR)
|
||||||
|
@ -115,30 +128,25 @@ host_os=`uname -s`
|
||||||
AS_IF([test "$host_os" = "Darwin"], [
|
AS_IF([test "$host_os" = "Darwin"], [
|
||||||
PLATFORM=osx
|
PLATFORM=osx
|
||||||
SO_EXT=.dylib
|
SO_EXT=.dylib
|
||||||
LDFLAGS=
|
SLIBFLAGS+="-dynamiclib"
|
||||||
SLIBFLAGS="-dynamiclib"
|
|
||||||
SLIBEXTRAFLAGS=""
|
|
||||||
COMP_VERSIONS="-compatibility_version \$(Z3_VERSION) -current_version \$(Z3_VERSION)"
|
COMP_VERSIONS="-compatibility_version \$(Z3_VERSION) -current_version \$(Z3_VERSION)"
|
||||||
STATIC_FLAGS=
|
STATIC_FLAGS=
|
||||||
], [test "$host_os" = "Linux"], [
|
], [test "$host_os" = "Linux"], [
|
||||||
PLATFORM=linux
|
PLATFORM=linux
|
||||||
SO_EXT=.so
|
SO_EXT=.so
|
||||||
LDFLAGS=-lrt
|
SLIBFLAGS+="-shared"
|
||||||
SLIBFLAGS="-shared"
|
|
||||||
SLIBEXTRAFLAGS=
|
|
||||||
COMP_VERSIONS=
|
COMP_VERSIONS=
|
||||||
STATIC_FLAGS=-static
|
STATIC_FLAGS=-static
|
||||||
CXXFLAGS+=" -fno-strict-aliasing"
|
CXXFLAGS+=" -fno-strict-aliasing"
|
||||||
if test "$CXX" = "clang++"; then
|
if test "$CXX" = "clang++"; then
|
||||||
|
# More flags for clang++ for Linux
|
||||||
CXXFLAGS+=" -Wno-unknown-pragmas -Wno-overloaded-virtual -Wno-unused-value"
|
CXXFLAGS+=" -Wno-unknown-pragmas -Wno-overloaded-virtual -Wno-unused-value"
|
||||||
SLIBEXTRAFLAGS+=" -lrt"
|
|
||||||
fi
|
fi
|
||||||
|
SLIBEXTRAFLAGS+=" -lrt"
|
||||||
], [test "${host_os:0:6}" = "CYGWIN"], [
|
], [test "${host_os:0:6}" = "CYGWIN"], [
|
||||||
PLATFORM=win
|
PLATFORM=win
|
||||||
SO_EXT=.dll
|
SO_EXT=.dll
|
||||||
LDFLAGS=
|
SLIBFLAGS+="-shared"
|
||||||
SLIBFLAGS="-shared"
|
|
||||||
SLIBEXTRAFLAGS=
|
|
||||||
COMP_VERSIONS=
|
COMP_VERSIONS=
|
||||||
CXXFLAGS+=" -D_CYGWIN -fno-strict-aliasing"
|
CXXFLAGS+=" -D_CYGWIN -fno-strict-aliasing"
|
||||||
],
|
],
|
||||||
|
@ -146,11 +154,6 @@ AS_IF([test "$host_os" = "Darwin"], [
|
||||||
AC_MSG_ERROR([Unknown host platform: $host_os])
|
AC_MSG_ERROR([Unknown host platform: $host_os])
|
||||||
])
|
])
|
||||||
|
|
||||||
# Only add -mfpmath=sse if g++
|
|
||||||
if test "$CXX" = "g++"; then
|
|
||||||
CXXFLAGS+=" -mfpmath=sse"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_SUBST(SLIBFLAGS)
|
AC_SUBST(SLIBFLAGS)
|
||||||
AC_SUBST(LDFLAGS)
|
AC_SUBST(LDFLAGS)
|
||||||
AC_SUBST(SLIBEXTRAFLAGS)
|
AC_SUBST(SLIBEXTRAFLAGS)
|
||||||
|
@ -189,22 +192,18 @@ AC_OUTPUT(scripts/config-debug.mk scripts/config-release.mk)
|
||||||
#
|
#
|
||||||
###################
|
###################
|
||||||
|
|
||||||
MKMAKE_OPT=
|
|
||||||
if test "$CXX" = "clang++"; then
|
|
||||||
MKMAKE_OPT="--noomp"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Python is available, give user the option to generate the make files wherever they want
|
# Python is available, give user the option to generate the make files wherever they want
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
Z3 was configured with success.
|
Z3 was configured with success.
|
||||||
Host platform: $PLATFORM
|
Host platform: $PLATFORM
|
||||||
|
Compiler: $CXX
|
||||||
Arithmetic: $ARITH
|
Arithmetic: $ARITH
|
||||||
Python: $PYTHON
|
Python: $PYTHON
|
||||||
Prefix: $prefix
|
Prefix: $prefix
|
||||||
64-bit: $IS_X64
|
64-bit: $IS_X64
|
||||||
|
|
||||||
To build and install Z3, execute:
|
To build and install Z3, execute:
|
||||||
python scripts/mk_make.py $MKMAKE_OPT
|
python scripts/mk_make.py
|
||||||
cd build
|
cd build
|
||||||
make
|
make
|
||||||
sudo make install
|
sudo make install
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
CC=cl
|
CC=cl
|
||||||
CXX=cl
|
CXX=cl
|
||||||
CXXFLAGS=/c /Zi /nologo /W3 /WX- /Od /Oy- /D WIN32 /D _AMD64_ /D _DEBUG /D Z3DEBUG /D _CONSOLE /D _TRACE /D _WINDOWS /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze-
|
CXXFLAGS=/c /Zi /nologo /openmp /W3 /WX- /Od /Oy- /D WIN32 /D _AMD64_ /D _DEBUG /D Z3DEBUG /D _CONSOLE /D _TRACE /D _WINDOWS /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze-
|
||||||
CXX_OUT_FLAG=/Fo
|
CXX_OUT_FLAG=/Fo
|
||||||
OBJ_EXT=.obj
|
OBJ_EXT=.obj
|
||||||
LIB_EXT=.lib
|
LIB_EXT=.lib
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
CC=cl
|
CC=cl
|
||||||
CXX=cl
|
CXX=cl
|
||||||
CXXFLAGS=/c /Zi /nologo /W3 /WX- /Od /Oy- /D WIN32 /D _DEBUG /D Z3DEBUG /D _CONSOLE /D _TRACE /D _WINDOWS /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze- /arch:SSE2
|
CXXFLAGS=/c /Zi /nologo /openmp /W3 /WX- /Od /Oy- /D WIN32 /D _DEBUG /D Z3DEBUG /D _CONSOLE /D _TRACE /D _WINDOWS /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze- /arch:SSE2
|
||||||
CXX_OUT_FLAG=/Fo
|
CXX_OUT_FLAG=/Fo
|
||||||
OBJ_EXT=.obj
|
OBJ_EXT=.obj
|
||||||
LIB_EXT=.lib
|
LIB_EXT=.lib
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
CC=cl
|
CC=cl
|
||||||
CXX=cl
|
CXX=cl
|
||||||
CXXFLAGS=/c /Zi /nologo /W3 /WX- /O2 /D _EXTERNAL_RELEASE /D WIN32 /D NDEBUG /D _LIB /D _WINDOWS /D _AMD64_ /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /TP
|
CXXFLAGS=/c /Zi /nologo /openmp /W3 /WX- /O2 /D _EXTERNAL_RELEASE /D WIN32 /D NDEBUG /D _LIB /D _WINDOWS /D _AMD64_ /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /TP
|
||||||
CXX_OUT_FLAG=/Fo
|
CXX_OUT_FLAG=/Fo
|
||||||
OBJ_EXT=.obj
|
OBJ_EXT=.obj
|
||||||
LIB_EXT=.lib
|
LIB_EXT=.lib
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
CC=cl
|
CC=cl
|
||||||
CXX=cl
|
CXX=cl
|
||||||
CXXFLAGS=/nologo /c /Zi /W3 /WX- /O2 /Oy- /D _EXTERNAL_RELEASE /D WIN32 /D NDEBUG /D _CONSOLE /D _WINDOWS /D ASYNC_COMMANDS /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze- /arch:SSE2
|
CXXFLAGS=/nologo /c /Zi /openmp /W3 /WX- /O2 /Oy- /D _EXTERNAL_RELEASE /D WIN32 /D NDEBUG /D _CONSOLE /D _WINDOWS /D ASYNC_COMMANDS /Gm- /EHsc /MD /GS /fp:precise /Zc:wchar_t /Zc:forScope /Gd /analyze- /arch:SSE2
|
||||||
CXX_OUT_FLAG=/Fo
|
CXX_OUT_FLAG=/Fo
|
||||||
OBJ_EXT=.obj
|
OBJ_EXT=.obj
|
||||||
LIB_EXT=.lib
|
LIB_EXT=.lib
|
||||||
|
|
|
@ -40,7 +40,6 @@ Z3PY_SRC_DIR=None
|
||||||
VS_PROJ = False
|
VS_PROJ = False
|
||||||
TRACE = False
|
TRACE = False
|
||||||
DOTNET_ENABLED=False
|
DOTNET_ENABLED=False
|
||||||
OMP = True
|
|
||||||
|
|
||||||
VER_MAJOR=None
|
VER_MAJOR=None
|
||||||
VER_MINOR=None
|
VER_MINOR=None
|
||||||
|
@ -121,12 +120,11 @@ def display_help():
|
||||||
print " -v, --vsproj generate Visual Studio Project Files."
|
print " -v, --vsproj generate Visual Studio Project Files."
|
||||||
print " -t, --trace enable tracing in release mode."
|
print " -t, --trace enable tracing in release mode."
|
||||||
print " -n, --nodotnet do not generate Microsoft.Z3.dll make rules."
|
print " -n, --nodotnet do not generate Microsoft.Z3.dll make rules."
|
||||||
print " --noomp disable support for openmp."
|
|
||||||
exit(0)
|
exit(0)
|
||||||
|
|
||||||
# Parse configuration option for mk_make script
|
# Parse configuration option for mk_make script
|
||||||
def parse_options():
|
def parse_options():
|
||||||
global VERBOSE, DEBUG_MODE, IS_WINDOWS, VS_X64, ONLY_MAKEFILES, SHOW_CPPS, VS_PROJ, TRACE, DOTNET_ENABLED, OMP
|
global VERBOSE, DEBUG_MODE, IS_WINDOWS, VS_X64, ONLY_MAKEFILES, SHOW_CPPS, VS_PROJ, TRACE, DOTNET_ENABLED
|
||||||
options, remainder = getopt.gnu_getopt(sys.argv[1:], 'b:dsxhmcvtn', ['build=',
|
options, remainder = getopt.gnu_getopt(sys.argv[1:], 'b:dsxhmcvtn', ['build=',
|
||||||
'debug',
|
'debug',
|
||||||
'silent',
|
'silent',
|
||||||
|
@ -136,8 +134,7 @@ def parse_options():
|
||||||
'showcpp',
|
'showcpp',
|
||||||
'vsproj',
|
'vsproj',
|
||||||
'trace',
|
'trace',
|
||||||
'nodotnet',
|
'nodotnet'
|
||||||
'noomp'
|
|
||||||
])
|
])
|
||||||
for opt, arg in options:
|
for opt, arg in options:
|
||||||
if opt in ('-b', '--build'):
|
if opt in ('-b', '--build'):
|
||||||
|
@ -164,8 +161,6 @@ def parse_options():
|
||||||
TRACE = True
|
TRACE = True
|
||||||
elif opt in ('-n', '--nodotnet'):
|
elif opt in ('-n', '--nodotnet'):
|
||||||
DOTNET_ENABLED = False
|
DOTNET_ENABLED = False
|
||||||
elif opt in ('--noomp'):
|
|
||||||
OMP = False
|
|
||||||
else:
|
else:
|
||||||
raise MKException("Invalid command line option '%s'" % opt)
|
raise MKException("Invalid command line option '%s'" % opt)
|
||||||
|
|
||||||
|
@ -347,17 +342,6 @@ class Component:
|
||||||
extra_opt = '/D _TRACE'
|
extra_opt = '/D _TRACE'
|
||||||
else:
|
else:
|
||||||
extra_opt = '-D _TRACE'
|
extra_opt = '-D _TRACE'
|
||||||
if not OMP:
|
|
||||||
if IS_WINDOWS:
|
|
||||||
extra_opt = '%s /D _NO_OMP_' % extra_opt
|
|
||||||
else:
|
|
||||||
extra_opt = '%s -D _NO_OMP_' % extra_opt
|
|
||||||
else:
|
|
||||||
if IS_WINDOWS:
|
|
||||||
extra_opt = '%s /openmp' % extra_opt
|
|
||||||
else:
|
|
||||||
extra_opt = '%s -fopenmp' % extra_opt
|
|
||||||
|
|
||||||
out.write('\t@$(CXX) $(CXXFLAGS) %s $(%s) $(CXX_OUT_FLAG)%s %s\n' % (extra_opt, include_defs, objfile, srcfile))
|
out.write('\t@$(CXX) $(CXXFLAGS) %s $(%s) $(CXX_OUT_FLAG)%s %s\n' % (extra_opt, include_defs, objfile, srcfile))
|
||||||
|
|
||||||
def mk_makefile(self, out):
|
def mk_makefile(self, out):
|
||||||
|
@ -492,10 +476,7 @@ class ExeComponent(Component):
|
||||||
for dep in deps:
|
for dep in deps:
|
||||||
c_dep = get_component(dep)
|
c_dep = get_component(dep)
|
||||||
out.write(' %s/%s$(LIB_EXT)' % (c_dep.build_dir, c_dep.name))
|
out.write(' %s/%s$(LIB_EXT)' % (c_dep.build_dir, c_dep.name))
|
||||||
extra_flags = ''
|
out.write(' $(LINK_EXTRA_FLAGS)\n')
|
||||||
if OMP and not IS_WINDOWS:
|
|
||||||
extra_flags = '-fopenmp'
|
|
||||||
out.write(' $(LINK_EXTRA_FLAGS) %s\n' % extra_flags)
|
|
||||||
out.write('%s: %s\n\n' % (self.name, exefile))
|
out.write('%s: %s\n\n' % (self.name, exefile))
|
||||||
|
|
||||||
def require_install_tactics(self):
|
def require_install_tactics(self):
|
||||||
|
@ -571,10 +552,7 @@ class DLLComponent(Component):
|
||||||
if not dep in self.reexports:
|
if not dep in self.reexports:
|
||||||
c_dep = get_component(dep)
|
c_dep = get_component(dep)
|
||||||
out.write(' %s/%s$(LIB_EXT)' % (c_dep.build_dir, c_dep.name))
|
out.write(' %s/%s$(LIB_EXT)' % (c_dep.build_dir, c_dep.name))
|
||||||
extra_flags= ''
|
out.write(' $(SLINK_EXTRA_FLAGS)')
|
||||||
if OMP and not IS_WINDOWS:
|
|
||||||
extra_flags = '-fopenmp'
|
|
||||||
out.write(' $(SLINK_EXTRA_FLAGS) %s' % extra_flags)
|
|
||||||
if IS_WINDOWS:
|
if IS_WINDOWS:
|
||||||
out.write(' /DEF:%s/%s.def' % (self.to_src_dir, self.name))
|
out.write(' /DEF:%s/%s.def' % (self.to_src_dir, self.name))
|
||||||
out.write('\n')
|
out.write('\n')
|
||||||
|
@ -701,10 +679,7 @@ class CppExampleComponent(ExampleComponent):
|
||||||
out.write('%s.lib' % dll_name)
|
out.write('%s.lib' % dll_name)
|
||||||
else:
|
else:
|
||||||
out.write(dll)
|
out.write(dll)
|
||||||
extra_flags = ''
|
out.write(' $(LINK_EXTRA_FLAGS)\n')
|
||||||
if OMP and not IS_WINDOWS:
|
|
||||||
extra_flags = '-fopenmp'
|
|
||||||
out.write(' $(LINK_EXTRA_FLAGS) %s\n' % extra_flags)
|
|
||||||
out.write('_ex_%s: %s\n\n' % (self.name, exefile))
|
out.write('_ex_%s: %s\n\n' % (self.name, exefile))
|
||||||
|
|
||||||
class CExampleComponent(CppExampleComponent):
|
class CExampleComponent(CppExampleComponent):
|
||||||
|
|
Loading…
Reference in a new issue