boost_env = env.Clone()
-modules = ['thread','program_options']
+modules = ['thread','program_options', 'system', 'date_time']
target_os = env.get('TARGET_OS')
target_arch = env.get('TARGET_ARCH')
+src_dir = env.get('SRC_DIR')
+
+boost_version = '1.60.0'
+
+# TODO: Remove coupling between build scripts and 1_58_0 version for Android
+if target_os in ['android']:
+ boost_version = '1.58.0'
-boost_version = '1.57.0'
boost_base_name = 'boost_'+string.replace(boost_version,'.','_')
-boost_arch_name = boost_base_name+'.zip'
+boost_arch_name = boost_base_name+'.tar.bz2'
+boost_b2_name = boost_base_name+os.sep+'b2'
boost_url = 'http://downloads.sourceforge.net/project/boost/boost/'+boost_version+'/'+boost_arch_name+'?r=&ts=1421801329&use_mirror=iweb'
-host_os = sys.platform
-
-if host_os == 'linux2' :
- boost_bootstrap = boost_base_name+os.sep+'bootstrap.sh'
- boost_b2_name = boost_base_name+os.sep+'b2'
-else :
- msg="Host platform (%s) is currently not supported for boost builds" % host_os
- raise SCons.Errors.EnvironmentError(msg)
-
-# Download source code
-boost_zip = boost_env.Download(boost_arch_name, boost_url)
-
-# Unpack source code
-if not os.path.exists(boost_bootstrap):
- boost_env.UnpackAll(boost_bootstrap, boost_zip)
-
-# Fix android x86_64 build error due to missing asm/page.h
-if target_os == 'android':
- file_object = open(boost_base_name + '/boost/thread/pthread/thread_data.hpp', 'r+')
- try:
- content = file_object.read()
- idx = content.find('#include <asm/page.h>')
- if idx > 0 :
- if content[idx -1] != '/' :
- content = content.replace('#include <asm/page.h>', '//#include <asm/page.h>')
- file_object.seek(0)
- file_object.write(content)
- finally:
- file_object.close( )
-
-# Run bootstrap.sh
-if not os.path.exists(boost_b2_name):
- boost_env.Configure(boost_base_name, './bootstrap.sh')
-
-cmd = None
-
-# Windows...
-if boost_env["PLATFORM"] in ["win32"] :
- if boost_env.WhereIs("cmd") :
- # TODO: Add Windows Support
- cmd = None
-
-# read the tools on *nix systems and sets the default parameters
-elif boost_env["PLATFORM"] in ["darwin", "linux", "posix"] :
- if boost_env.WhereIs("sh") :
- cmd = ['./b2']
-
-if not cmd :
- raise SCons.Errors.StopError("Boost build system not supported on this platform [%s]" % (boost_env["PLATFORM"]))
-
-# We need to be in the target's directory
-cwd = boost_base_name
-
-# Gather all of the path, bin and flags
-version = boost_env.get('VERSION','')
-tool_path = os.path.dirname(boost_env['CXX'])
-cxx_bin = os.path.basename(boost_env['CXX'])
-ar_bin = os.path.basename(boost_env['AR'])
-ranlib_bin = os.path.basename(boost_env['RANLIB'])
-cflags = list(boost_env['CFLAGS'])
-ccflags = list(boost_env['CCFLAGS'])
-cxxflags = list(boost_env['CXXFLAGS'])
-
-try:
- cxxflags.remove('-fno-rtti')
-except ValueError:
- pass
-try:
- cxxflags.remove('-fno-exceptions')
-except ValueError:
- pass
-
-# Write a user-config for this variant
-user_config_name = os.path.join(cwd, 'tools', 'build', 'src', 'user-config.jam')
-user_config_file = open(user_config_name, 'w')
-user_config_file.write('import os ;\n')
-user_config_file.write('using gcc :')
-user_config_file.write(' '+version+' :')
-#user_config_file.write(' :')
-#user_config_file.write(' '+os.path.basename(toolchain['CXX']['BIN'])+' :\n')
-user_config_file.write(' '+cxx_bin+' :\n')
-user_config_file.write(' <archiver>'+ar_bin+'\n')
-user_config_file.write(' <ranlib>'+ranlib_bin+'\n')
-for value in boost_env['CPPDEFINES'] :
- if len(value) > 1 :
- user_config_file.write(' <compileflags>-D'+value[0]+'='+value[1]+'\n')
+boost_dir = os.path.join(src_dir,'extlibs','boost','boost')
+boost_bootstrap = os.path.join(boost_dir,'bootstrap.bat')
+
+if 'linux' == target_os :
+ # Check for Boost libraries in /usr/boost
+ print 'TODO: Perform platform check for linux'
+ raise SCons.Errors.EnvironmentError('Unsupported platform')
+
+elif target_os in ['windows']:
+ boost_zip_file = os.path.join(src_dir,'extlibs','boost',boost_arch_name)
+
+ if not os.path.exists(boost_bootstrap):
+
+ # Download if necessary
+ if os.path.exists(boost_zip_file):
+ boost_zip = boost_zip_file
+ else:
+ print '*** Downloading Boost zip file (> 100MB). Please wait... ***'
+ boost_zip = env.Download(boost_zip_file, boost_url)
+
+ # Unzip boost
+ print '*** Unpacking boost %s zip file ... ***' % boost_version
+ env.UnpackAll(boost_dir, boost_zip)
+
+ # Rename from boost_1_60_0 -> boost
+ os.rename(boost_base_name, 'boost')
+
+ # Sanity check, in case the above method didn't work
+ if not os.path.exists(boost_bootstrap):
+ print '''
+*********************************** Error: ****************************************
+* Please download boost from the following website:
+*
+* ''' + boost_url + '''
+*
+* and extract the contents directly into
+*
+* ''' + boost_dir + '''
+*
+* such that this build system can find:
+*
+* ''' + boost_bootstrap + '''
+*
+***********************************************************************************
+'''
+ Exit(1)
+
+elif target_os in ['android']:
+ env.Tool('URLDownload', toolpath=['../../tools/scons'])
+ env.Tool('UnpackAll', toolpath=['../../tools/scons'])
+ env.Tool('BoostBootstrap', toolpath=['../../tools/scons'])
+ env.Tool('BoostBuild', toolpath=['../../tools/scons'])
+
+ host_os = sys.platform
+
+ if host_os == 'linux2' :
+ boost_bootstrap = boost_base_name+os.sep+'bootstrap.sh'
else :
- user_config_file.write(' <compileflags>-D'+value[0]+'\n')
-for value in boost_env['CPPPATH'] :
- user_config_file.write(' <compileflags>-I'+value+'\n')
-for flag in ccflags :
- user_config_file.write(' <compileflags>'+flag+'\n')
-for flag in cflags :
- user_config_file.write(' <cflags>'+flag+'\n')
-for flag in cxxflags :
- user_config_file.write(' <cxxflags>'+flag+'\n')
-user_config_file.write(' ;\n')
-user_config_file.close();
-
-# Ensure that the toolchain is in the PATH
-penv = os.environ.copy()
-penv["PATH"] = tool_path + ":" + env['ENV'].get('PATH', '') + ':' + penv["PATH"]
-
-build_path = os.path.join('build', target_os, target_arch)
-
-cmd.append('-q')
-cmd.append('target-os=linux')
-cmd.append('link=static')
-cmd.append('threading=multi')
-cmd.append('--layout=system')
-cmd.append('--build-type=minimal')
-cmd.append('--prefix='+ build_path + os.sep + 'install_tmp')
-cmd.append('--build-dir='+build_path)
-for module in modules :
- cmd.append('--with-'+module)
-cmd.append('headers')
-cmd.append('install')
-
-# build it now (we need the shell, because some programs need it)
-devnull = open(os.devnull, "wb")
-print "Building boost [%s] on the source [%s]" % (cmd, boost_b2_name)
-handle = subprocess.Popen(cmd, env=penv, cwd=cwd)#, stdout=devnull )
-
-if handle.wait() <> 0 :
- raise SCons.Errors.BuildError( "Building boost [%s] on the source [%s]" % (cmd, boost_b2_name) )
-
-# Use Copy instead of InstallXXX to make sure boost is installed immediately
-Execute(Copy(os.path.join(env.get('SRC_DIR'), 'deps', target_os, 'include'),
- os.path.join(boost_base_name, build_path, 'install_tmp', 'include')))
-
-Execute(Copy(os.path.join(env.get('SRC_DIR'), 'deps', target_os, 'lib', target_arch),
- os.path.join(boost_base_name, build_path, 'install_tmp', 'lib')))
+ msg="Host platform (%s) is currently not supported for boost builds" % host_os
+ raise SCons.Errors.EnvironmentError(msg)
+
+ if not os.path.exists(boost_arch_name) and not os.path.exists(boost_base_name):
+ boost_arch_name = env.URLDownload(boost_arch_name, boost_url)
+
+ if not os.path.exists(boost_base_name):
+ boost_arch_name = env.UnpackAll(boost_bootstrap, boost_arch_name)
+
+ boost_b2 = env.BoostBootstrap(boost_b2_name, boost_arch_name)
+
+ dep_sys_root = env['DEP_SYS_ROOT']
+ dep_src_dir = dep_sys_root + os.sep + 'include'
+ dep_lib_dir = dep_sys_root + os.sep + 'lib'
+
+ boost_targets = [
+ os.path.join(dep_src_dir, 'boost', 'config.hpp'),
+ os.path.join(dep_src_dir, 'boost', 'variant.hpp'),
+ os.path.join(dep_src_dir, 'boost', 'program_options.hpp'),
+ os.path.join(dep_src_dir, 'boost', 'thread.hpp'),
+ os.path.join(dep_src_dir, 'boost', 'date_time.hpp'),
+ os.path.join(dep_src_dir, 'libboost_thread.a'),
+ os.path.join(dep_src_dir, 'libboost_date_time.a'),
+ os.path.join(dep_src_dir, 'libboost_atomic.a'),
+ os.path.join(dep_src_dir, 'libboost_system.a'),
+ os.path.join(dep_src_dir, 'libboost_program_options.a')
+ ]
+
+ boost_build = env.BoostBuild(boost_targets, boost_b2, PREFIX=dep_sys_root, MODULES=modules)