--- /dev/null
+import os, sys, commands
+env = Environment(ENV = os.environ)
+
+# figure out a better way to configure this
+if os.environ.has_key('CXX'):
+ env['CXX'] = os.environ['CXX']
+
+if os.environ.has_key('DEBUG'):
+ env['DEBUG'] = os.environ['DEBUG']
+
+if os.environ.has_key('CXXFLAGS'):
+ #env['CXXFLAGS'] = os.environ['CXXFLAGS']
+ env.Append(CXXFLAGS = os.environ['CXXFLAGS'])
+
+if os.environ.has_key('LINKFLAGS'):
+ #env['LDFLAGS'] = os.environ['LDFLAGS']
+ env.Append(LINKFLAGS = os.environ['LINKFLAGS'])
+
+## Boost
+##
+## Note: You need to either set BOOSTROOT to the root of a stock Boost distribution
+## or set BOOST_INCLUDES and BOOST_LIBS if Boost comes with your OS distro e.g. and
+## needs BOOST_INCLUDES=/usr/include/boost and BOOST_LIBS=/usr/lib like Ubuntu.
+##
+if os.environ.has_key('BOOSTROOT'):
+ os.environ['BOOST_ROOT'] = os.environ['BOOSTROOT']
+
+if os.environ.has_key('BOOST_ROOT'):
+ env['BOOST_INCLUDES'] = os.environ['BOOST_ROOT']
+ env['BOOST_LIBS'] = os.path.join(os.environ['BOOST_ROOT'], 'stage', 'lib')
+elif os.environ.has_key('BOOST_INCLUDES') and os.environ.has_key('BOOST_LIBS'):
+ env['BOOST_INCLUDES'] = os.environ['BOOST_INCLUDES']
+ env['BOOST_LIBS'] = os.environ['BOOST_LIBS']
+else:
+ raise SCons.Errors.UserError, "Neither BOOST_ROOT, nor BOOST_INCLUDES + BOOST_LIBS was set!"
+
+## Custom OpenSSL
+if os.environ.has_key('OPENSSL_PATH'):
+ env.Append(CPPPATH = os.path.join(os.environ['OPENSSL_PATH'], 'include'))
+ env.Append(LIBPATH = os.environ['OPENSSL_PATH'])
+
+if os.environ.has_key('WSPP_ENABLE_CPP11'):
+ env['WSPP_ENABLE_CPP11'] = True
+else:
+ env['WSPP_ENABLE_CPP11'] = False
+
+boost_linkshared = False
+
+def boostlibs(libnames,localenv):
+ if localenv['PLATFORM'].startswith('win'):
+ # Win/VC++ supports autolinking. nothing to do.
+ # http://www.boost.org/doc/libs/1_49_0/more/getting_started/windows.html#auto-linking
+ return []
+ else:
+ libs = []
+ prefix = localenv['SHLIBPREFIX'] if boost_linkshared else localenv['LIBPREFIX']
+ suffix = localenv['SHLIBSUFFIX'] if boost_linkshared else localenv['LIBSUFFIX']
+ for name in libnames:
+ lib = File(os.path.join(localenv['BOOST_LIBS'], '%sboost_%s%s' % (prefix, name, suffix)))
+ libs.append(lib)
+ return libs
+
+if env['PLATFORM'].startswith('win'):
+ env.Append(CPPDEFINES = ['WIN32',
+ 'NDEBUG',
+ 'WIN32_LEAN_AND_MEAN',
+ '_WIN32_WINNT=0x0600',
+ '_CONSOLE',
+ 'BOOST_TEST_DYN_LINK',
+ 'NOMINMAX',
+ '_WEBSOCKETPP_CPP11_MEMORY_',
+ '_WEBSOCKETPP_CPP11_FUNCTIONAL_'])
+ arch_flags = '/arch:SSE2'
+ opt_flags = '/Ox /Oi /fp:fast'
+ warn_flags = '/W3 /wd4996 /wd4995 /wd4355'
+ env['CCFLAGS'] = '%s /EHsc /GR /GS- /MD /nologo %s %s' % (warn_flags, arch_flags, opt_flags)
+ env['LINKFLAGS'] = '/INCREMENTAL:NO /MANIFEST /NOLOGO /OPT:REF /OPT:ICF /MACHINE:X86'
+elif env['PLATFORM'] == 'posix':
+ if env.has_key('DEBUG'):
+ env.Append(CCFLAGS = ['-g', '-O0'])
+ else:
+ env.Append(CPPDEFINES = ['NDEBUG'])
+ env.Append(CCFLAGS = ['-O1', '-fomit-frame-pointer'])
+ env.Append(CCFLAGS = ['-Wall'])
+ #env['LINKFLAGS'] = ''
+elif env['PLATFORM'] == 'darwin':
+ if not os.environ.has_key('CXX'):
+ env['CXX'] = "clang++"
+ if env.has_key('DEBUG'):
+ env.Append(CCFLAGS = ['-g', '-O0'])
+ else:
+ env.Append(CPPDEFINES = ['NDEBUG'])
+ env.Append(CCFLAGS = ['-O1', '-fomit-frame-pointer'])
+ env.Append(CCFLAGS = ['-Wall'])
+ #env['LINKFLAGS'] = ''
+
+if env['PLATFORM'].startswith('win'):
+ #env['LIBPATH'] = env['BOOST_LIBS']
+ pass
+else:
+ env.Append(LIBPATH = ['/usr/lib', '/usr/local/lib'])
+
+# Compiler specific warning flags
+if env['CXX'].startswith('g++'):
+ #env.Append(CCFLAGS = ['-Wconversion'])
+ env.Append(CCFLAGS = ['-Wcast-align'])
+ env.Append(CCFLAGS = ['-Wshadow'])
+ env.Append(CCFLAGS = ['-Wunused-parameter'])
+elif env['CXX'].startswith('clang++'):
+ #env.Append(CCFLAGS = ['-Wcast-align'])
+ #env.Append(CCFLAGS = ['-Wglobal-constructors'])
+ #env.Append(CCFLAGS = ['-Wconversion'])
+ env.Append(CCFLAGS = ['-Wno-padded'])
+ env.Append(CCFLAGS = ['-Wshadow'])
+ env.Append(CCFLAGS = ['-Wunused-parameter'])
+
+ env.Append(CCFLAGS = ['-Wsometimes-uninitialized'])
+ env.Append(CCFLAGS = ['-Wuninitialized'])
+
+ #env.Append(CCFLAGS = ['-Weverything'])
+ #env.Append(CCFLAGS = ['-Wno-documentation'])
+ #env.Append(CCFLAGS = ['-Wno-weak-vtables'])
+ #env.Append(CCFLAGS = ['-Wno-global-constructors'])
+ #env.Append(CCFLAGS = ['-Wno-sign-conversion'])
+ #env.Append(CCFLAGS = ['-Wno-exit-time-destructors'])
+
+
+
+
+ # Wpadded
+ # Wsign-conversion
+ #
+
+platform_libs = []
+tls_libs = []
+
+tls_build = False
+
+if env['PLATFORM'] == 'posix':
+ platform_libs = ['pthread', 'rt']
+ tls_libs = ['ssl', 'crypto']
+ tls_build = True
+elif env['PLATFORM'] == 'darwin':
+ tls_libs = ['ssl', 'crypto']
+ tls_build = True
+elif env['PLATFORM'].startswith('win'):
+ # Win/VC++ supports autolinking. nothing to do.
+ pass
+
+## Append WebSocket++ path
+env.Append(CPPPATH = ['#'])
+
+##### Set up C++11 environment
+polyfill_libs = [] # boost libraries used as drop in replacements for incomplete
+ # C++11 STL implementations
+env_cpp11 = env.Clone ()
+
+if env_cpp11['CXX'].startswith('g++'):
+ # TODO: check g++ version
+ GCC_VERSION = commands.getoutput(env_cpp11['CXX'] + ' -dumpversion')
+
+ if GCC_VERSION > "4.4.0":
+ print "C++11 build environment partially enabled"
+ env_cpp11.Append(WSPP_CPP11_ENABLED = "true",CXXFLAGS = ['-std=c++0x'],TOOLSET = ['g++'],CPPDEFINES = ['_WEBSOCKETPP_CPP11_STL_'])
+ else:
+ print "C++11 build environment is not supported on this version of G++"
+elif env_cpp11['CXX'].startswith('clang++'):
+ print "C++11 build environment enabled"
+ env.Append(CXXFLANGS = ['-stdlib=libc++'],LINKFLAGS=['-stdlib=libc++'])
+ env_cpp11.Append(WSPP_CPP11_ENABLED = "true",CXXFLAGS = ['-std=c++0x','-stdlib=libc++'],LINKFLAGS = ['-stdlib=libc++'],TOOLSET = ['clang++'],CPPDEFINES = ['_WEBSOCKETPP_CPP11_STL_'])
+
+ # look for optional second boostroot compiled with clang's libc++ STL library
+ # this prevents warnings/errors when linking code built with two different
+ # incompatible STL libraries.
+ if os.environ.has_key('BOOST_ROOT_CPP11'):
+ env_cpp11['BOOST_INCLUDES'] = os.environ['BOOST_ROOT_CPP11']
+ env_cpp11['BOOST_LIBS'] = os.path.join(os.environ['BOOST_ROOT_CPP11'], 'stage', 'lib')
+ elif os.environ.has_key('BOOST_INCLUDES_CPP11') and os.environ.has_key('BOOST_LIBS_CPP11'):
+ env_cpp11['BOOST_INCLUDES'] = os.environ['BOOST_INCLUDES_CPP11']
+ env_cpp11['BOOST_LIBS'] = os.environ['BOOST_LIBS_CPP11']
+else:
+ print "C++11 build environment disabled"
+
+# if the build system is known to allow the isystem modifier for library include
+# values then use it for the boost libraries. Otherwise just add them to the
+# regular CPPPATH values.
+if env['CXX'].startswith('g++') or env['CXX'].startswith('clang'):
+ env.Append(CPPFLAGS = '-isystem ' + env['BOOST_INCLUDES'])
+else:
+ env.Append(CPPPATH = [env['BOOST_INCLUDES']])
+env.Append(LIBPATH = [env['BOOST_LIBS']])
+
+# if the build system is known to allow the isystem modifier for library include
+# values then use it for the boost libraries. Otherwise just add them to the
+# regular CPPPATH values.
+if env_cpp11['CXX'].startswith('g++') or env_cpp11['CXX'].startswith('clang'):
+ env_cpp11.Append(CPPFLAGS = '-isystem ' + env_cpp11['BOOST_INCLUDES'])
+else:
+ env_cpp11.Append(CPPPATH = [env_cpp11['BOOST_INCLUDES']])
+env_cpp11.Append(LIBPATH = [env_cpp11['BOOST_LIBS']])
+
+releasedir = 'build/release/'
+debugdir = 'build/debug/'
+testdir = 'build/test/'
+builddir = releasedir
+
+Export('env')
+Export('env_cpp11')
+Export('platform_libs')
+Export('boostlibs')
+Export('tls_libs')
+Export('polyfill_libs')
+
+## END OF CONFIG !!
+
+## TARGETS:
+
+if not env['PLATFORM'].startswith('win'):
+ # Unit tests, add test folders with SConscript files to to_test list.
+ to_test = ['utility','http','logger','random','processors','message_buffer','extension','transport/iostream','transport/asio','roles','endpoint','connection','transport'] #,'http','processors','connection'
+
+ for t in to_test:
+ new_tests = SConscript('#/test/'+t+'/SConscript',variant_dir = testdir + t, duplicate = 0)
+ for a in new_tests:
+ new_alias = Alias('test', [a], a.abspath)
+ AlwaysBuild(new_alias)
+
+# Main test application
+#main = SConscript('#/examples/dev/SConscript',variant_dir = builddir + 'dev',duplicate = 0)
+
+# echo_server
+echo_server = SConscript('#/examples/echo_server/SConscript',variant_dir = builddir + 'echo_server',duplicate = 0)
+
+# echo_client
+echo_client = SConscript('#/examples/echo_client/SConscript',variant_dir = builddir + 'echo_client',duplicate = 0)
+
+# echo_server_tls
+if tls_build:
+ echo_server_tls = SConscript('#/examples/echo_server_tls/SConscript',variant_dir = builddir + 'echo_server_tls',duplicate = 0)
+ echo_server_both = SConscript('#/examples/echo_server_both/SConscript',variant_dir = builddir + 'echo_server_both',duplicate = 0)
+
+# broadcast_server
+broadcast_server = SConscript('#/examples/broadcast_server/SConscript',variant_dir = builddir + 'broadcast_server',duplicate = 0)
+
+# testee_server
+testee_server = SConscript('#/examples/testee_server/SConscript',variant_dir = builddir + 'testee_server',duplicate = 0)
+
+# testee_client
+testee_client = SConscript('#/examples/testee_client/SConscript',variant_dir = builddir + 'testee_client',duplicate = 0)
+
+# scratch_client
+scratch_client = SConscript('#/examples/scratch_client/SConscript',variant_dir = builddir + 'scratch_client',duplicate = 0)
+
+# scratch_server
+scratch_server = SConscript('#/examples/scratch_server/SConscript',variant_dir = builddir + 'scratch_server',duplicate = 0)
+
+
+# debug_client
+debug_client = SConscript('#/examples/debug_client/SConscript',variant_dir = builddir + 'debug_client',duplicate = 0)
+
+# debug_server
+debug_server = SConscript('#/examples/debug_server/SConscript',variant_dir = builddir + 'debug_server',duplicate = 0)
+
+# subprotocol_server
+subprotocol_server = SConscript('#/examples/subprotocol_server/SConscript',variant_dir = builddir + 'subprotocol_server',duplicate = 0)
+
+# telemetry_server
+telemetry_server = SConscript('#/examples/telemetry_server/SConscript',variant_dir = builddir + 'telemetry_server',duplicate = 0)
+
+# external_io_service
+external_io_service = SConscript('#/examples/external_io_service/SConscript',variant_dir = builddir + 'external_io_service',duplicate = 0)
+
+if not env['PLATFORM'].startswith('win'):
+ # iostream_server
+ iostream_server = SConscript('#/examples/iostream_server/SConscript',variant_dir = builddir + 'iostream_server',duplicate = 0)
+
+ # telemetry_client
+ telemetry_client = SConscript('#/examples/telemetry_client/SConscript',variant_dir = builddir + 'telemetry_client',duplicate = 0)
+
+ # print_server
+ print_server = SConscript('#/examples/print_server/SConscript',variant_dir = builddir + 'print_server',duplicate = 0)