From c690afd69d23b4c4b5576ebac234e631f7d22a5e Mon Sep 17 00:00:00 2001 From: Philippe Coval Date: Wed, 21 Jun 2017 19:25:46 +0200 Subject: [PATCH] build: Reformat build_common SConscripts (follow) [Mats Wichmann] build: Reformat all of the build_common SConscripts to be more Pythonic There are not intended to be any functional changes. The help variable definitions are split into multi-line, in anticipation of later improving the descriptions and using keyword-argument style to make the purpose of other args more clear. Also included two files at the top level in this set, as they seem to have the same intent as build_common. In build_common/android/SConscript, an identical 4-line stanza, beginning: elif cmp(flags[0:9], 'PLATFORM=') == 0: # get target platform: android-x appears three times, the second and third were dropped in this change. [Philippe Coval] Port from master to 1.3-rel to help mergeback Conflicts: build_common/SConscript build_common/android/SConscript build_common/windows/SConscript Change-Id: I0077e7350754fef25e75621fdb4a41cf00000002 Signed-off-by: Mats Wichmann Reviewed-on: https://gerrit.iotivity.org/gerrit/20545 Tested-by: jenkins-iotivity Reviewed-by: George Nash Reviewed-by: Phil Coval Origin: master Bug: https://jira.iotivity.org/browse/IOT-1745 Signed-off-by: Phil Coval Reviewed-on: https://gerrit.iotivity.org/gerrit/21073 Reviewed-by: Ziran Sun Reviewed-by: Dan Mihai --- build_common/SConscript | 566 ++++++++++++++++++++++++++-------------- build_common/android/SConscript | 259 +++++++++--------- 2 files changed, 511 insertions(+), 314 deletions(-) diff --git a/build_common/SConscript b/build_common/SConscript index 08cef23..3503837 100755 --- a/build_common/SConscript +++ b/build_common/SConscript @@ -13,26 +13,36 @@ host_target_map = { 'linux': ['linux', 'android', 'arduino', 'yocto', 'tizen'], 'windows': ['windows', 'android', 'arduino'], 'darwin': ['darwin', 'ios', 'android', 'arduino'], - 'msys_nt' :['msys_nt'], + 'msys_nt': ['msys_nt'], } # Map of os and allowed archs (os: allowed archs) os_arch_map = { - 'linux': ['x86', 'x86_64', 'arm', 'arm-v7a', 'armeabi-v7a', 'arm64', 'mips', 'mipsel', 'mips64', 'mips64el', 'i386', 'powerpc', 'sparc', 'aarch64'], + 'linux': [ + 'x86', 'x86_64', 'arm', 'arm-v7a', 'armeabi-v7a', 'arm64', 'mips', + 'mipsel', 'mips64', 'mips64el', 'i386', 'powerpc', 'sparc', 'aarch64' + ], 'tizen': ['x86', 'x86_64', 'arm', 'arm-v7a', 'armeabi-v7a', 'arm64'], - 'android': ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'arm64-v8a'], + 'android': [ + 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', + 'arm64-v8a' + ], 'windows': ['x86', 'amd64', 'arm'], - 'msys_nt':['x86', 'x86_64'], + 'msys_nt': ['x86', 'x86_64'], 'darwin': ['i386', 'x86_64'], 'ios': ['i386', 'x86_64', 'armv7', 'armv7s', 'arm64'], 'arduino': ['avr', 'arm'], - 'yocto': ['i586', 'i686', 'x86_64', 'arm', 'aarch64', 'powerpc', 'powerpc64', 'mips', 'mipsel'], + 'yocto': [ + 'i586', 'i686', 'x86_64', 'arm', 'aarch64', 'powerpc', 'powerpc64', + 'mips', 'mipsel' + ], } host = platform.system().lower() -# the host string contains version of windows. 6.3, 6.4, 10.0 which is 8.0, 8.1, and 10 respectively. -# Let's canonicalize the msys_nt-XX.X system name by stripping version off. +# the host string contains internal version of Windows: 6.3, 6.4, 10.0 +# which are externally known as 8.0, 8.1, and 10 respectively. +# Canonicalize the msys_nt-XX.X system name by stripping version off. if 'msys_nt' in host: host = 'msys_nt' @@ -43,10 +53,10 @@ if host not in host_target_map: ###################################################################### # Get build options (the optins from command line) ###################################################################### -target_os = ARGUMENTS.get('TARGET_OS', host).lower() # target os +target_os = ARGUMENTS.get('TARGET_OS', host).lower() # target os if target_os not in host_target_map[host]: - print "\nError: '%s' host cannot build for '%s' target.\navailable targets: %s\n" % (host, target_os, host_target_map[host]) + print "\nError: Unsupported target os: %s (available: %s)\n" % (target_os, host_target_map[host]) Exit(1) if target_os == 'android': @@ -56,7 +66,7 @@ else: if target_os == 'windows': default_arch = default_arch.lower() -target_arch = ARGUMENTS.get('TARGET_ARCH', default_arch) # target arch +target_arch = ARGUMENTS.get('TARGET_ARCH', default_arch) # target arch # True if binary needs to be installed on board. (Might need root permissions) # set to 'no', 'false' or 0 for only compilation @@ -71,15 +81,17 @@ if ARGUMENTS.get('TEST'): logging_default = False else: release_mode = False - if ARGUMENTS.get('RELEASE', True) in ['y', 'yes', 'true', 't', '1', 'on', 'all', True]: + if ARGUMENTS.get('RELEASE', True) in [ + 'y', 'yes', 'true', 't', '1', 'on', 'all', True + ]: release_mode = True logging_default = (release_mode == False) # targets that do not support the DTLS build (SECURED=1 build option) -targets_without_dtls_support = ['arduino']; +targets_without_dtls_support = ['arduino'] if ARGUMENTS.get('SECURED') == '1' and target_os in targets_without_dtls_support: - print "\nError: DTLS not supported on target os: %s MUST build with SECURED=0\n" % (target_os) - Exit(1) + print "\nError: DTLS not supported on target %s, MUST build with SECURED=0\n" % (target_os) + Exit(1) ###################################################################### # Common build options (release, target os, target arch) @@ -88,68 +100,200 @@ targets_disallow_multitransport = ['arduino'] help_vars = Variables() -help_vars.Add('PROJECT_VERSION', 'The version of IoTivity', project_version) - -help_vars.Add(BoolVariable('VERBOSE', 'Show compilation', False)) -help_vars.Add(BoolVariable('RELEASE', 'Build for release?', True)) # set to 'no', 'false' or 0 for debug -help_vars.Add(EnumVariable('TARGET_OS', 'Target platform', host, host_target_map[host])) - - -help_vars.Add(BoolVariable('WITH_RA', 'Build with Remote Access module', False)) -help_vars.Add(BoolVariable('WITH_TCP', 'Build with TCP adapter', False)) -help_vars.Add(BoolVariable('WITH_PROXY', 'Build with CoAP-HTTP Proxy', True)) -help_vars.Add(ListVariable('WITH_MQ', 'Build with MQ publisher/broker', 'OFF', ['OFF', 'SUB', 'PUB', 'BROKER'])) -help_vars.Add(BoolVariable('WITH_CLOUD', 'Build including AccountManager class and Cloud Client sample', False)) -help_vars.Add(ListVariable('RD_MODE', 'Resource Directory build mode', 'CLIENT', ['CLIENT', 'SERVER'])) - -help_vars.Add(BoolVariable('SIMULATOR', 'Build with simulator module', False)) - -help_vars.Add(BoolVariable('WITH_RA_IBB', 'Build with Remote Access module(workssys)', False)) - +help_vars.Add('PROJECT_VERSION', + 'The version of IoTivity', + project_version) + +help_vars.Add( + BoolVariable('VERBOSE', + 'Show compilation', + False)) +help_vars.Add( + BoolVariable('RELEASE', + 'Build for release?', + True)) # set to 'no', 'false' or 0 for debug +help_vars.Add( + EnumVariable('TARGET_OS', + 'Target platform', + host, + allowed_values=host_target_map[host])) + +help_vars.Add( + BoolVariable('WITH_RA', + 'Build with Remote Access module', + False)) +help_vars.Add( + BoolVariable('WITH_TCP', + 'Build with TCP adapter', + False)) +help_vars.Add( + BoolVariable('WITH_PROXY', + 'Build with CoAP-HTTP Proxy', + True)) +help_vars.Add( + ListVariable('WITH_MQ', + 'Build with MQ publisher/broker', + 'OFF', + ['OFF', 'SUB', 'PUB', 'BROKER'])) +help_vars.Add( + BoolVariable('WITH_CLOUD', + 'Build including AccountManager class and Cloud Client sample', + False)) +help_vars.Add( + ListVariable('RD_MODE', + 'Resource Directory build mode', + 'CLIENT', + ['CLIENT', 'SERVER'])) +help_vars.Add( + BoolVariable('SIMULATOR', + 'Build with simulator module', + False)) +help_vars.Add( + BoolVariable('WITH_RA_IBB', + 'Build with Remote Access module(workssys)', + False)) if target_os in targets_disallow_multitransport: - help_vars.Add(ListVariable('TARGET_TRANSPORT', 'Target transport', 'IP', ['BT', 'BLE', 'IP', 'NFC'])) + help_vars.Add( + ListVariable('TARGET_TRANSPORT', + 'Target transport', + 'IP', + ['BT', 'BLE', 'IP', 'NFC'])) else: - help_vars.Add(ListVariable('TARGET_TRANSPORT', 'Target transport', 'ALL', ['ALL', 'BT', 'BLE', 'IP', 'NFC'])) + help_vars.Add( + ListVariable('TARGET_TRANSPORT', + 'Target transport', + 'ALL', + ['ALL', 'BT', 'BLE', 'IP', 'NFC'])) + +help_vars.Add( + EnumVariable('TARGET_ARCH', + 'Target architecture', + default_arch, + allowed_values=os_arch_map[target_os])) -help_vars.Add(EnumVariable('TARGET_ARCH', 'Target architecture', default_arch, os_arch_map[target_os])) if target_os in targets_without_dtls_support: - help_vars.Add(EnumVariable('SECURED', 'Build with DTLS', '0', allowed_values=('0', '1'))) + help_vars.Add( + EnumVariable('SECURED', + 'Build with DTLS', + '0', + allowed_values=('0', '1'))) else: - help_vars.Add(EnumVariable('SECURED', 'Build with DTLS', '1', allowed_values=('0', '1'))) -help_vars.Add(EnumVariable('MULTIPLE_OWNER', 'Enable multiple owner', '1', allowed_values=('0', '1'))) -help_vars.Add(EnumVariable('EXC_PROV_SUPPORT', 'Except OCPMAPI library(libocpmapi.so)', '0', allowed_values=('0', '1'))) -help_vars.Add(EnumVariable('TEST', 'Run unit tests', '0', allowed_values=('0', '1'))) -help_vars.Add(BoolVariable('LOGGING', 'Enable stack logging', logging_default)) -help_vars.Add(EnumVariable('LOG_LEVEL', 'Enable stack logging level', 'DEBUG', allowed_values=('DEBUG', 'INFO', 'ERROR', 'WARNING', 'FATAL'))) -help_vars.Add(BoolVariable('UPLOAD', 'Upload binary ? (For Arduino)', require_upload)) -help_vars.Add(EnumVariable('ROUTING', 'Enable routing', 'EP', allowed_values=('GW', 'EP'))) -help_vars.Add(EnumVariable('BUILD_SAMPLE', 'Build with sample', 'ON', allowed_values=('ON', 'OFF'))) -help_vars.AddVariables(('DEVICE_NAME', 'Network display name for device (For Arduino)', device_name, None, None),) -help_vars.Add(PathVariable('ANDROID_NDK', 'Android NDK path', None, PathVariable.PathAccept)) -help_vars.Add(PathVariable('ANDROID_HOME', 'Android SDK path', None, PathVariable.PathAccept)) -help_vars.Add(PathVariable('ANDROID_GRADLE', 'Gradle binary file', None, PathVariable.PathIsFile)) -help_vars.Add(EnumVariable('WITH_UPSTREAM_LIBCOAP', 'Use latest stable version of LibCoAP downloaded from github', default_with_upstream_libcoap, allowed_values=('0','1'))) -help_vars.Add(BoolVariable('WITH_ENV', 'Use compiler options from environment', False)) -help_vars.Add(BoolVariable('AUTOMATIC_UPDATE', 'Makes libcoap update automatically to the required versions if needed.', False)) + + help_vars.Add( + EnumVariable('SECURED', + 'Build with DTLS', + '1', + allowed_values=('0', '1'))) +help_vars.Add( + EnumVariable('MULTIPLE_OWNER', + 'Enable multiple owner', + '1', + allowed_values=('0', '1'))) +help_vars.Add( + EnumVariable('EXC_PROV_SUPPORT', + 'Except OCPMAPI library(libocpmapi.so)', + '0', + allowed_values=('0', '1'))) +help_vars.Add( + EnumVariable('TEST', + 'Run unit tests', + '0', + allowed_values=('0', '1'))) +help_vars.Add( + BoolVariable('LOGGING', + 'Enable stack logging', + logging_default)) +help_vars.Add( + EnumVariable('LOG_LEVEL', + 'Enable stack logging level', + 'DEBUG', + allowed_values=('DEBUG', 'INFO', 'ERROR', 'WARNING', 'FATAL'))) +help_vars.Add( + BoolVariable('UPLOAD', + 'Upload binary ? (For Arduino)', + require_upload)) +help_vars.Add( + EnumVariable('ROUTING', + 'Enable routing', + 'EP', + allowed_values=('GW', 'EP'))) +help_vars.Add( + EnumVariable('BUILD_SAMPLE', + 'Build with sample', + 'ON', + allowed_values=('ON', 'OFF'))) +help_vars.AddVariables(('DEVICE_NAME', + 'Network display name for device (For Arduino)', + device_name, + None, + None), ) +help_vars.Add( + PathVariable('ANDROID_NDK', + 'Android NDK path', + None, + PathVariable.PathAccept)) +help_vars.Add( + PathVariable('ANDROID_HOME', + 'Android SDK path', + None, + PathVariable.PathAccept)) +help_vars.Add( + PathVariable('ANDROID_GRADLE', + 'Gradle binary file', + None, + PathVariable.PathIsFile)) +help_vars.Add( + EnumVariable('WITH_UPSTREAM_LIBCOAP', + 'Use latest stable version of LibCoAP downloaded from github', + default_with_upstream_libcoap, + allowed_values=('0', '1'))) +help_vars.Add( + BoolVariable('WITH_ENV', + 'Use compiler options from environment', + False)) +help_vars.Add( + BoolVariable('AUTOMATIC_UPDATE', + 'Makes libcoap update automatically to the required versions if needed.', + False)) if target_os == 'windows': - # For VS2013, MSVC_VERSION is '12.0'. For VS2015, MSVC_VERSION is '14.0'. - # Default value is None, meaning that SCons has to choose automatically a VS version. - help_vars.Add(EnumVariable('MSVC_VERSION', 'MSVC compiler version - Windows', None, allowed_values=('12.0', '14.0'))) - help_vars.Add(EnumVariable('UWP_APP', 'Build for a Universal Windows Platform (UWP) Application', '0', allowed_values=('0', '1'))) - -help_vars.Add(BoolVariable('BUILD_JAVA', 'Build Java bindings', False)) -help_vars.Add(PathVariable('JAVA_HOME', 'JDK directory', os.environ.get('JAVA_HOME'), PathVariable.PathAccept)) -help_vars.Add(EnumVariable('OIC_SUPPORT_TIZEN_TRACE', 'Tizen Trace(T-trace) api availability', 'False', allowed_values=('True', 'False'))) - -AddOption('--prefix', - dest='prefix', - type='string', - nargs=1, - action='store', - metavar='DIR', - help='installation prefix') + # For VS2013, MSVC_VERSION is '12.0'. For VS2015, MSVC_VERSION is '14.0'. + # Default value is None, meaning that SCons has to choose automatically a VS version. + help_vars.Add( + EnumVariable('MSVC_VERSION', + 'MSVC compiler version - Windows', + None, + allowed_values=('12.0', '14.0'))) + help_vars.Add(EnumVariable( + 'UWP_APP', + 'Build for a Universal Windows Platform (UWP) Application', + '0', + allowed_values=('0', '1'))) + +help_vars.Add( + BoolVariable('BUILD_JAVA', + 'Build Java bindings', + False)) +help_vars.Add( + PathVariable('JAVA_HOME', + 'JDK directory', + os.environ.get('JAVA_HOME'), + PathVariable.PathAccept)) +help_vars.Add( + EnumVariable('OIC_SUPPORT_TIZEN_TRACE', + 'Tizen Trace(T-trace) api availability', + 'False', + allowed_values=('True', 'False'))) + +AddOption( + '--prefix', + dest='prefix', + type='string', + nargs=1, + action='store', + metavar='DIR', + help='installation prefix') ###################################################################### # Platform(build target) specific options: SDK/NDK & toolchain @@ -158,21 +302,29 @@ targets_support_cc = ['linux', 'arduino', 'tizen'] if target_os in targets_support_cc: # Set cross compile toolchain - help_vars.Add('TC_PREFIX', "Toolchain prefix (Generally only be required for cross-compiling)", os.environ.get('TC_PREFIX')) - help_vars.Add(PathVariable('TC_PATH', - 'Toolchain path (Generally only be required for cross-compiling)', - os.environ.get('TC_PATH'))) - -if target_os in ['android', 'arduino']: # Android/Arduino always uses GNU compiler regardless of the host - env = Environment(variables = help_vars, - tools = ['gnulink', 'gcc', 'g++', 'ar', 'as', 'textfile'] - ) + help_vars.Add('TC_PREFIX', + "Toolchain prefix (Generally only be required for cross-compiling)", + os.environ.get('TC_PREFIX')) + help_vars.Add( + PathVariable('TC_PATH', + 'Toolchain path (Generally only be required for cross-compiling)', + os.environ.get('TC_PATH'))) + +# this is where the setup of the construction envionment begins +if target_os in ['android', 'arduino']: + # Android/Arduino always uses GNU compiler regardless of the host + env = Environment( + variables=help_vars, + tools=['gnulink', 'gcc', 'g++', 'ar', 'as', 'textfile']) else: - env = Environment(variables = help_vars, tools = ['default', 'textfile'], - TARGET_ARCH = target_arch, TARGET_OS = target_os, - PREFIX = GetOption('prefix'), - LIB_INSTALL_DIR = ARGUMENTS.get('LIB_INSTALL_DIR') #for 64bit build - ) + env = Environment( + variables=help_vars, + tools=['default', 'textfile'], + TARGET_ARCH=target_arch, + TARGET_OS=target_os, + PREFIX=GetOption('prefix'), + LIB_INSTALL_DIR=ARGUMENTS.get('LIB_INSTALL_DIR') #for 64bit build + ) Help(help_vars.GenerateHelpText(env)) @@ -200,38 +352,40 @@ if env.get('WITH_ENV'): env['LINKFLAGS'] = Split(os.environ['LDFLAGS']) print "using LDFLAGS/LINKFLAGS from environment: %s" % env['LINKFLAGS'] -tc_set_msg = ''' -************************************ Warning ********************************** -* Environment variable TC_PREFIX/TC_PATH is set. It will change the default * -* toolchain, if it isn't what you expect you should unset it, otherwise it may* -* cause inexplicable errors. * -******************************************************************************* -''' +# set quieter build messages unless verbose mode was requested if env.get('VERBOSE') == False: env['CCCOMSTR'] = "Compiling $TARGET" env['SHCCCOMSTR'] = "Compiling $TARGET" env['CXXCOMSTR'] = "Compiling $TARGET" env['SHCXXCOMSTR'] = "Compiling $TARGET" env['LINKCOMSTR'] = "Linking $TARGET" - env['SHLINKCOMSTR'] = "Linking $TARGET" + env['SHLINKCOMSTR'] = "Linking shared object $TARGET" env['ARCOMSTR'] = "Archiving $TARGET" env['RANLIBCOMSTR'] = "Indexing Archive $TARGET" +tc_set_msg = ''' +************************************ Warning ********************************** +* Warning: TC_PREFIX and/or TC_PATH is set in the environment. +* This means a non-default compilation toolchain will be used. +* If this is not what you expected you should unset, or it +* may lead to unexpected results. +******************************************************************************* +''' if target_os in targets_support_cc: prefix = env.get('TC_PREFIX') tc_path = env.get('TC_PATH') if prefix: - env.Replace(CC = prefix + env.get('CC', 'gcc')) - env.Replace(CXX = prefix + env.get('CXX', 'g++')) - env.Replace(AR = prefix + env.get('AR', 'ar')) - env.Replace(AS = prefix + env.get('AS', 'as')) - env.Replace(RANLIB = prefix + env.get('RANLIB', 'ranlib')) + env.Replace(CC=prefix + env.get('CC', 'gcc')) + env.Replace(CXX=prefix + env.get('CXX', 'g++')) + env.Replace(AR=prefix + env.get('AR', 'ar')) + env.Replace(AS=prefix + env.get('AS', 'as')) + env.Replace(RANLIB=prefix + env.get('RANLIB', 'ranlib')) if tc_path: env.PrependENVPath('PATH', tc_path) sys_root = os.path.abspath(tc_path + '/../') - env.AppendUnique(CCFLAGS = ['--sysroot=' + sys_root]) - env.AppendUnique(LINKFLAGS = ['--sysroot=' + sys_root]) + env.AppendUnique(CCFLAGS=['--sysroot=' + sys_root]) + env.AppendUnique(LINKFLAGS=['--sysroot=' + sys_root]) if prefix or tc_path: print tc_set_msg @@ -244,31 +398,42 @@ else: if env['CONFIG_ENVIRONMENT_IMPORT'] == True: print "warning: importing some environment variables for OS: %s" % target_os - for ev in ['PATH', 'PKG_CONFIG', 'PKG_CONFIG_PATH', 'PKG_CONFIG_SYSROOT_DIR']: + for ev in [ + 'PATH', + 'PKG_CONFIG', + 'PKG_CONFIG_PATH', + 'PKG_CONFIG_SYSROOT_DIR' + ]: if os.environ.get(ev) != None: env['ENV'][ev] = os.environ.get(ev) if os.environ['LDFLAGS'] != None: - env.AppendUnique(LINKFLAGS = Split(os.environ['LDFLAGS'])) + env.AppendUnique(LINKFLAGS=Split(os.environ['LDFLAGS'])) -# Ensure scons be able to change its working directory +# Ensure scons is able to change its working directory env.SConscriptChdir(1) -# Set the source directory and build directory -# Source directory: 'dir' -# Build directory: 'dir'/out//// -# On windows, the build directory will be: -# 'dir'/out/windows//// -# -# You can get the directory as following: -# env.get('SRC_DIR') -# env.get('BUILD_DIR') +###################################################################### +# Convenience functions to "extend" SCons +###################################################################### + def __set_dir(env, dir): + # + # Set the source and build directories + # Source directory: 'dir' + # Build directory: 'dir'/out//// + # On windows, the build directory will be: + # 'dir'/out/windows//// + # + # You can get the directory as following: + # env.get('SRC_DIR') + # env.get('BUILD_DIR') + # if not os.path.exists(dir + '/SConstruct'): print ''' *************************************** Error ********************************* -* The directory(%s) seems isn't a source code directory, no SConstruct file is -* found. * +* The directory (%s) seems not to be a buildable directory, +* no SConstruct file found. ******************************************************************************* ''' % dir Exit(1) @@ -290,19 +455,27 @@ def __set_dir(env, dir): env.VariantDir(build_dir, dir, duplicate=0) - env.Replace(BUILD_DIR = build_dir) - env.Replace(SRC_DIR = dir) + env.Replace(BUILD_DIR=build_dir) + env.Replace(SRC_DIR=dir) -def __src_to_obj(env, src, home = ''): + +def __src_to_obj(env, src, home=''): + # + # make sure builds happen in BUILD_DIR (by default they + # would happen in the directory of the source file) + # Note this does not seem to be used, VariantDir is used instead + # obj = env.get('BUILD_DIR') + src.replace(home, '') if env.get('OBJSUFFIX'): obj += env.get('OBJSUFFIX') return env.Object(obj, src) + def __install(ienv, targets, name): i_n = ienv.Install(env.get('BUILD_DIR'), targets) Alias(name, i_n) - env.AppendUnique(TS = [name]) + env.AppendUnique(TS=[name]) + def __installlib(ienv, targets, name): user_prefix = env.get('PREFIX') @@ -317,20 +490,24 @@ def __installlib(ienv, targets, name): i_n = ienv.Install(env.get('BUILD_DIR'), targets) ienv.Alias("install", i_n) + def __installbin(ienv, targets, name): user_prefix = env.get('PREFIX') if user_prefix: i_n = ienv.Install(user_prefix + '/bin', targets) ienv.Alias("install", i_n) + def __installheader(ienv, targets, dir, name): user_prefix = env.get('PREFIX') if user_prefix: - i_n = ienv.Install(user_prefix + '/include/' + dir ,targets) + i_n = ienv.Install(user_prefix + '/include/' + dir, targets) else: - i_n = ienv.Install(os.path.join(env.get('BUILD_DIR'), 'include', dir), targets) + i_n = ienv.Install( + os.path.join(env.get('BUILD_DIR'), 'include', dir), targets) ienv.Alias("install", i_n) + def __installpcfile(ienv, targets, name): user_prefix = env.get('PREFIX') if user_prefix: @@ -343,10 +520,12 @@ def __installpcfile(ienv, targets, name): i_n = ienv.Install(env.get('BUILD_DIR') + 'lib/pkgconfig', targets) ienv.Alias("install", i_n) -def __append_target(ienv, name, targets = None): + +def __append_target(ienv, name, targets=None): if targets: env.Alias(name, targets) - env.AppendUnique(TS = [name]) + env.AppendUnique(TS=[name]) + def __print_targets(env): Help(''' @@ -355,12 +534,14 @@ Targets:\n ''') for t in env.get('TS'): Help(t + ' ') Help(''' -\nDefault all targets will be built. You can specify the target to build: + +Default: all targets will be built. You can specify the target to build: $ scons [options] [target] =============================================================================== ''') + env.AddMethod(__set_dir, 'SetDir') env.AddMethod(__print_targets, 'PrintTargets') env.AddMethod(__src_to_obj, 'SrcToObj') @@ -371,12 +552,12 @@ env.AddMethod(__installbin, 'UserInstallTargetBin') env.AddMethod(__installheader, 'UserInstallTargetHeader') env.AddMethod(__installpcfile, 'UserInstallTargetPCFile') env.SetDir(env.GetLaunchDir()) -env['ROOT_DIR']=env.GetLaunchDir()+'/..' +env['ROOT_DIR'] = env.GetLaunchDir() + '/..' Export('env') -###################################################################### -# Scons to generate the iotivity.pc file from iotivity.pc.in file +####################################################################i# +# Generate the iotivity.pc file from iotivity.pc.in file ###################################################################### pc_file = env.get('SRC_DIR') + '/iotivity.pc.in' @@ -418,7 +599,7 @@ pc_vars = { '\@LIBS\@': " ".join(libs) } -env.Substfile(pc_file, SUBST_DICT = pc_vars) +env.Substfile(pc_file, SUBST_DICT=pc_vars) ###################################################################### # Setting global compiler flags @@ -434,115 +615,123 @@ env.AppendUnique(LIBPATH = [env.get('BUILD_DIR')]) env.AppendUnique(RPATH = [env.get('BUILD_DIR')]) if (env.get('WITH_UPSTREAM_LIBCOAP') == '1'): - env.AppendUnique(CPPDEFINES = ['WITH_UPSTREAM_LIBCOAP']) + env.AppendUnique(CPPDEFINES=['WITH_UPSTREAM_LIBCOAP']) if (target_os not in ['arduino', 'windows']): - env.AppendUnique(CPPDEFINES = ['WITH_POSIX']) + env.AppendUnique(CPPDEFINES=['WITH_POSIX']) -if (target_os in ['darwin','ios']): - env.AppendUnique(CPPDEFINES = ['_DARWIN_C_SOURCE']) +if (target_os in ['darwin', 'ios']): + env.AppendUnique(CPPDEFINES=['_DARWIN_C_SOURCE']) if (env.get('SECURED') == '1'): - env.AppendUnique(CPPDEFINES = ['__WITH_DTLS__']) + env.AppendUnique(CPPDEFINES=['__WITH_DTLS__']) if ((env.get('SECURED') == '1') and with_tcp): - env.AppendUnique(CPPDEFINES = ['__WITH_TLS__']) + env.AppendUnique(CPPDEFINES=['__WITH_TLS__']) if (env.get('MULTIPLE_OWNER') == '1'): env.AppendUnique(CPPDEFINES=['MULTIPLE_OWNER']) if (env.get('ROUTING') == 'GW'): - env.AppendUnique(CPPDEFINES = ['ROUTING_GATEWAY']) + env.AppendUnique(CPPDEFINES=['ROUTING_GATEWAY']) elif (env.get('ROUTING') == 'EP'): - env.AppendUnique(CPPDEFINES = ['ROUTING_EP']) + env.AppendUnique(CPPDEFINES=['ROUTING_EP']) if (target_os == 'arduino'): - env.AppendUnique(CPPDEFINES = ['SINGLE_THREAD']) - env.AppendUnique(CPPDEFINES = ['WITH_ARDUINO']) + env.AppendUnique(CPPDEFINES=['SINGLE_THREAD']) + env.AppendUnique(CPPDEFINES=['WITH_ARDUINO']) elif (('IP' in target_transport) or ('ALL' in target_transport)): - env.AppendUnique(CPPDEFINES = ['WITH_BWT']) + env.AppendUnique(CPPDEFINES=['WITH_BWT']) if (target_os in ['linux', 'tizen', 'android'] and with_tcp): - env.AppendUnique(CPPDEFINES = ['WITH_TCP']) + env.AppendUnique(CPPDEFINES=['WITH_TCP']) if (target_os in ['linux', 'tizen', 'android', 'arduino', 'ios']): - if (('BLE' in target_transport) or ('BT' in target_transport) or ('ALL' in target_transport)): - env.AppendUnique(CPPDEFINES = ['WITH_TCP']) + if (('BLE' in target_transport) or ('BT' in target_transport) or + ('ALL' in target_transport)): + env.AppendUnique(CPPDEFINES=['WITH_TCP']) if 'ALL' in target_transport: if with_ra: - env.AppendUnique(CPPDEFINES = ['RA_ADAPTER']) + env.AppendUnique(CPPDEFINES=['RA_ADAPTER']) if with_tcp: - env.AppendUnique(CPPDEFINES = ['TCP_ADAPTER']) + env.AppendUnique(CPPDEFINES=['TCP_ADAPTER']) if (target_os in ['linux', 'yocto']): - env.AppendUnique(CPPDEFINES = ['IP_ADAPTER', 'NO_EDR_ADAPTER', 'LE_ADAPTER']) + env.AppendUnique( + CPPDEFINES=['IP_ADAPTER', 'NO_EDR_ADAPTER', 'LE_ADAPTER']) elif (target_os == 'android'): - env.AppendUnique(CPPDEFINES = ['IP_ADAPTER', 'EDR_ADAPTER', 'LE_ADAPTER', 'NFC_ADAPTER']) - elif (target_os in['darwin', 'ios', 'msys_nt', 'windows']): - env.AppendUnique(CPPDEFINES = ['IP_ADAPTER', 'NO_EDR_ADAPTER', 'NO_LE_ADAPTER']) + env.AppendUnique(CPPDEFINES=[ + 'IP_ADAPTER', 'EDR_ADAPTER', 'LE_ADAPTER', 'NFC_ADAPTER' + ]) + elif (target_os in ['darwin', 'ios', 'msys_nt', 'windows']): + env.AppendUnique( + CPPDEFINES=['IP_ADAPTER', 'NO_EDR_ADAPTER', 'NO_LE_ADAPTER']) else: - env.AppendUnique(CPPDEFINES = ['IP_ADAPTER', 'EDR_ADAPTER', 'LE_ADAPTER']) + env.AppendUnique( + CPPDEFINES=['IP_ADAPTER', 'EDR_ADAPTER', 'LE_ADAPTER']) else: if ('BT' in target_transport): if (target_os == 'linux'): print "CA Transport BT is not supported " Exit(1) else: - env.AppendUnique(CPPDEFINES = ['EDR_ADAPTER']) + env.AppendUnique(CPPDEFINES=['EDR_ADAPTER']) else: - env.AppendUnique(CPPDEFINES = ['NO_EDR_ADAPTER']) + env.AppendUnique(CPPDEFINES=['NO_EDR_ADAPTER']) if ('BLE' in target_transport): - env.AppendUnique(CPPDEFINES = ['LE_ADAPTER']) + env.AppendUnique(CPPDEFINES=['LE_ADAPTER']) else: - env.AppendUnique(CPPDEFINES = ['NO_LE_ADAPTER']) + env.AppendUnique(CPPDEFINES=['NO_LE_ADAPTER']) if ('IP' in target_transport): - env.AppendUnique(CPPDEFINES = ['IP_ADAPTER']) + env.AppendUnique(CPPDEFINES=['IP_ADAPTER']) else: - env.AppendUnique(CPPDEFINES = ['NO_IP_ADAPTER']) + env.AppendUnique(CPPDEFINES=['NO_IP_ADAPTER']) if with_tcp: - if (target_os in ['linux', 'tizen', 'android', 'arduino', 'ios', 'windows']): - env.AppendUnique(CPPDEFINES = ['TCP_ADAPTER', 'WITH_TCP']) + if (target_os in [ + 'linux', 'tizen', 'android', 'arduino', 'ios', 'windows' + ]): + env.AppendUnique(CPPDEFINES=['TCP_ADAPTER', 'WITH_TCP']) else: print "CA Transport TCP is not supported " Exit(1) else: - env.AppendUnique(CPPDEFINES = ['NO_TCP_ADAPTER']) + env.AppendUnique(CPPDEFINES=['NO_TCP_ADAPTER']) if ('NFC' in target_transport): if (target_os == 'android'): - env.AppendUnique(CPPDEFINES = ['NFC_ADAPTER']) + env.AppendUnique(CPPDEFINES=['NFC_ADAPTER']) else: print "CA Transport NFC is not supported " Exit(1) else: - env.AppendUnique(CPPDEFINES = ['NO_NFC_ADAPTER']) + env.AppendUnique(CPPDEFINES=['NO_NFC_ADAPTER']) if ('SUB' in with_mq): - env.AppendUnique(CPPDEFINES = ['MQ_SUBSCRIBER', 'WITH_MQ']) + env.AppendUnique(CPPDEFINES=['MQ_SUBSCRIBER', 'WITH_MQ']) if ('PUB' in with_mq): - env.AppendUnique(CPPDEFINES = ['MQ_PUBLISHER', 'WITH_MQ']) + env.AppendUnique(CPPDEFINES=['MQ_PUBLISHER', 'WITH_MQ']) if ('BROKER' in with_mq): - env.AppendUnique(CPPDEFINES = ['MQ_BROKER', 'WITH_MQ']) + env.AppendUnique(CPPDEFINES=['MQ_BROKER', 'WITH_MQ']) if env.get('LOGGING'): - env.AppendUnique(CPPDEFINES = ['TB_LOG']) + env.AppendUnique(CPPDEFINES=['TB_LOG']) if env.get('WITH_CLOUD') and with_tcp: - env.AppendUnique(CPPDEFINES = ['WITH_CLOUD']) + env.AppendUnique(CPPDEFINES=['WITH_CLOUD']) if 'CLIENT' in rd_mode: - env.AppendUnique(CPPDEFINES = ['RD_CLIENT']) + env.AppendUnique(CPPDEFINES=['RD_CLIENT']) if 'SERVER' in rd_mode: - env.AppendUnique(CPPDEFINES = ['RD_SERVER']) + env.AppendUnique(CPPDEFINES=['RD_SERVER']) if with_ra_ibb: - env.AppendUnique(CPPDEFINES = ['RA_ADAPTER_IBB']) + env.AppendUnique(CPPDEFINES=['RA_ADAPTER_IBB']) env.SConscript('external_builders.scons') @@ -559,20 +748,22 @@ if target_os == "yocto": try: CC = os.environ['CC'] target_prefix = CC.split()[0] - target_prefix = target_prefix[:len(target_prefix)-3] - tools = {"CC" : target_prefix+"gcc", - "CXX" : target_prefix+"g++", - "AS" : target_prefix+"as", - "LD" : target_prefix+"ld", - "GDB" : target_prefix+"gdb", - "STRIP" : target_prefix+"strip", - "RANLIB" : target_prefix+"ranlib", - "OBJCOPY" : target_prefix+"objcopy", - "OBJDUMP" : target_prefix+"objdump", - "AR" : target_prefix+"ar", - "NM" : target_prefix+"nm", - "M4" : "m4", - "STRINGS": target_prefix+"strings"} + target_prefix = target_prefix[:len(target_prefix) - 3] + tools = { + "CC": target_prefix + "gcc", + "CXX": target_prefix + "g++", + "AS": target_prefix + "as", + "LD": target_prefix + "ld", + "GDB": target_prefix + "gdb", + "STRIP": target_prefix + "strip", + "RANLIB": target_prefix + "ranlib", + "OBJCOPY": target_prefix + "objcopy", + "OBJDUMP": target_prefix + "objdump", + "AR": target_prefix + "ar", + "NM": target_prefix + "nm", + "M4": "m4", + "STRINGS": target_prefix + "strings" + } PATH = os.environ['PATH'].split(os.pathsep) for tool in tools: if tool in os.environ: @@ -593,16 +784,16 @@ if target_os == "yocto": We want to preserve debug symbols to allow BitBake to generate both DEBUG and RELEASE packages for OIC. ''' - env.AppendUnique(CCFLAGS = ['-g']) + env.AppendUnique(CCFLAGS=['-g']) ''' Additional flags to pass to the Yocto toolchain. ''' if env.get('RELEASE'): - env.AppendUnique(CPPDEFINES = ['NDEBUG']) - env.AppendUnique(CPPDEFINES = ['__linux__', '_GNU_SOURCE']) - env.AppendUnique(CFLAGS = ['-std=gnu99']) - env.AppendUnique(CCFLAGS = ['-Wall', '-Wextra', '-fPIC']) - env.AppendUnique(LIBS = ['dl', 'pthread', 'uuid']) + env.AppendUnique(CPPDEFINES=['NDEBUG']) + env.AppendUnique(CPPDEFINES=['__linux__', '_GNU_SOURCE']) + env.AppendUnique(CFLAGS=['-std=gnu99']) + env.AppendUnique(CCFLAGS=['-Wall', '-Wextra', '-fPIC']) + env.AppendUnique(LIBS=['dl', 'pthread', 'uuid']) Export('env') else: ''' @@ -628,11 +819,8 @@ if env.GetOption('clean'): import iotivityconfig from iotivityconfig import * -conf = Configure(env, - custom_tests = - { - 'CheckPThreadsSupport' : iotivityconfig.check_pthreads - } ) +conf = Configure( + env, custom_tests={'CheckPThreadsSupport': iotivityconfig.check_pthreads}) # Identify whether we have pthreads support, which is necessary for # threading and mutexes. This will set the environment variable diff --git a/build_common/android/SConscript b/build_common/android/SConscript index 9db9ef8..76180c8 100644 --- a/build_common/android/SConscript +++ b/build_common/android/SConscript @@ -10,39 +10,51 @@ Import('env') help_vars = Variables() if not env.get('ANDROID_NDK'): SConscript('../../extlibs/android/ndk/SConscript') - help_vars.Add(PathVariable('ANDROID_NDK', 'Android NDK root directory', os.path.join(env.get('SRC_DIR'), 'extlibs', 'android', 'ndk', 'android-ndk-r10e'))) + help_vars.Add( + PathVariable('ANDROID_NDK', + 'Android NDK root directory', + os.path.join( + env.get('SRC_DIR'), 'extlibs', 'android', 'ndk', + 'android-ndk-r10e'))) if not env.get('ANDROID_GRADLE'): SConscript('../../extlibs/android/gradle/SConscript') - help_vars.Add(PathVariable('ANDROID_GRADLE', 'Android Gradle directory', os.path.join(env.get('SRC_DIR'), 'extlibs', 'android', 'gradle', 'gradle-2.2.1/bin/gradle'))) + help_vars.Add( + PathVariable('ANDROID_GRADLE', + 'Android Gradle directory', + os.path.join( + env.get('SRC_DIR'), 'extlibs', 'android', 'gradle', + 'gradle-2.2.1/bin/gradle'))) if not env.get('ANDROID_HOME'): SConscript('../../extlibs/android/sdk/SConscript') - if env.get('ANDROID_NDK'): - android_ndk = env.get('ANDROID_NDK') + android_ndk = env.get('ANDROID_NDK') else: - print ''' + print ''' *************************************** Info ********************************** * Android NDK path isn't set, the default will be used. You can set * * environment variable ANDROID_NDK or add it in command line as: * * # scons ANDROID_NDK= ... * ******************************************************************************* ''' - android_ndk = os.path.join(env.get('SRC_DIR'), 'extlibs', 'android', 'ndk', 'android-ndk-r10e') + android_ndk = os.path.join( + env.get('SRC_DIR'), 'extlibs', 'android', 'ndk', 'android-ndk-r10e') if env.get('ANDROID_GRADLE'): - android_gradle = env.get('ANDROID_GRADLE') + android_gradle = env.get('ANDROID_GRADLE') else: - print ''' + print ''' *************************************** Info ********************************** * Android Gradle path isn't set, the default will be used. You can set * * environment variable ANDROID_GRADLE or add it in command line as: * * # scons ANDROID_GRADLE= ... * ******************************************************************************* ''' - android_gradle = os.path.join(env.get('SRC_DIR'), 'extlibs', 'android', 'gradle', 'gradle-2.2.1', 'bin', 'gradle') + android_gradle = os.path.join( + env.get('SRC_DIR'), 'extlibs', 'android', 'gradle', 'gradle-2.2.1', + 'bin', 'gradle') help_vars.Update(env) Help(help_vars.GenerateHelpText(env)) @@ -50,56 +62,59 @@ src_dir = env.get('SRC_DIR') # Overwrite suffixes and prefixes if env['HOST_OS'] == 'win32': - env['OBJSUFFIX'] = '.o' - env['SHOBJSUFFIX'] = '.os' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - env['SHLIBPREFIX'] = 'lib' - env['SHLIBSUFFIX'] = '.so' - env['LIBPREFIXES'] = ['lib'] - env['LIBSUFFIXES'] = ['.a', '.so'] - env['PROGSUFFIX'] = '' + env['OBJSUFFIX'] = '.o' + env['SHOBJSUFFIX'] = '.os' + env['LIBPREFIX'] = 'lib' + env['LIBSUFFIX'] = '.a' + env['SHLIBPREFIX'] = 'lib' + env['SHLIBSUFFIX'] = '.so' + env['LIBPREFIXES'] = ['lib'] + env['LIBSUFFIXES'] = ['.a', '.so'] + env['PROGSUFFIX'] = '' elif platform.system().lower() == 'darwin': - env['SHLIBSUFFIX'] = '.so' - env['LIBSUFFIXES'] = ['.a', '.so'] - env['PROGSUFFIX'] = '' + env['SHLIBSUFFIX'] = '.so' + env['LIBSUFFIXES'] = ['.a', '.so'] + env['PROGSUFFIX'] = '' ###################################################################### # Set common flags ###################################################################### # Android build system default cofig -env.AppendUnique(CPPDEFINES = ['ANDROID']) -env.AppendUnique(CFLAGS = ['-std=c99']) -env.AppendUnique(SHCFLAGS = ['-Wa,--noexecstack']) -env.AppendUnique(LINKFLAGS = ['-Wl,--gc-sections', '-Wl,-z,nocopyreloc']) +env.AppendUnique(CPPDEFINES=['ANDROID']) +env.AppendUnique(CFLAGS=['-std=c99']) +env.AppendUnique(SHCFLAGS=['-Wa,--noexecstack']) +env.AppendUnique(LINKFLAGS=['-Wl,--gc-sections', '-Wl,-z,nocopyreloc']) ###################################################################### # Probe Android NDK default flags ###################################################################### ndk_build_cmd = android_ndk + '/ndk-build' if env['HOST_OS'] == 'win32': - if os.path.isfile(ndk_build_cmd + '.cmd'): - ndk_build_cmd += '.cmd' + if os.path.isfile(ndk_build_cmd + '.cmd'): + ndk_build_cmd += '.cmd' if not os.path.isfile(ndk_build_cmd): - print ''' + print ''' *************************************** Error ********************************* * It seems android ndk path is not set properly, please check if "%s" * is the root directory of android ndk. * ******************************************************************************* ''' % android_ndk - Exit(1) + Exit(1) # ANDROID_HOME build option if env.get('ANDROID_HOME'): - android_gradle = env.get('ANDROID_HOME') + android_gradle = env.get('ANDROID_HOME') else: - help_vars = Variables() - help_vars.Add(PathVariable('ANDROID_HOME', 'ANDROID SDK root directory', os.environ.get('ANDROID_HOME'))) - help_vars.Update(env) - Help(help_vars.GenerateHelpText(env)) - print ''' + help_vars = Variables() + help_vars.Add( + PathVariable('ANDROID_HOME', + 'ANDROID SDK root directory', + os.environ.get('ANDROID_HOME'))) + help_vars.Update(env) + Help(help_vars.GenerateHelpText(env)) + print ''' *************************************** Info ********************************** * Environment variable ANDROID_HOME will use default value. To override * * root directory of android sdk, please specify ANDROID_HOME as follows: * @@ -112,21 +127,21 @@ target_arch = env.get('TARGET_ARCH') # Android ndk early version doesn't support C++11. Detect the toolchain version # to make sure proper toolchain is used for tc_ver in ['4.7', '4.8', '4.9', '']: - if os.path.exists(android_ndk + '/toolchains/x86-' + tc_ver): - break + if os.path.exists(android_ndk + '/toolchains/x86-' + tc_ver): + break cmd = [ndk_build_cmd] cmd.append('APP_ABI=' + target_arch) cmd.append('APP_PLATFORM=android-21') cmd.append('APP_STL=gnustl_shared') if env.get('RELEASE'): - cmd.append('APP_OPTIM=release') + cmd.append('APP_OPTIM=release') else: - cmd.append('APP_OPTIM=debug') + cmd.append('APP_OPTIM=debug') if tc_ver != '': - cmd.append('NDK_TOOLCHAIN_VERSION=' + tc_ver) + cmd.append('NDK_TOOLCHAIN_VERSION=' + tc_ver) else: - print ''' + print ''' *************************************** Warning ******************************* * To support C++11, the toolchain should be >= 4.7, please make sure your * * android NDK is at least r8e! * @@ -135,122 +150,116 @@ else: cmd.append('-n') -p = subprocess.Popen(cmd, stdout = subprocess.PIPE) +p = subprocess.Popen(cmd, stdout=subprocess.PIPE) for flags in p.stdout.readlines(): - if cmp(flags[0:10], 'TC_PREFIX=') == 0: # toolchain prefix (include path) - prefix = flags[10:].strip() - env.Replace(CC = prefix + 'gcc') - env.Replace(CXX = prefix + 'g++') - env.Replace(AR = prefix + 'ar') - env.Replace(RANLIB = prefix + 'ranlib') - - elif cmp(flags[0:7], 'CFLAGS=') == 0: - env.AppendUnique(CFLAGS = Split(flags[7:])) - - elif cmp(flags[0:9], 'CXXFLAGS=') == 0: - env.AppendUnique(CXXFLAGS = Split(flags[9:])) - - elif cmp(flags[0:8], 'CPPPATH=') == 0: - ndk_arch = 'arch-' - if cmp(target_arch, 'x86') == 0: - ndk_arch += 'x86' - elif cmp(target_arch, 'x86_64') == 0: - ndk_arch += 'x86_64' - elif cmp(target_arch, 'armeabi') == 0: - ndk_arch += 'arm' - elif cmp(target_arch, 'armeabi-v7a') == 0: - ndk_arch += 'arm' - elif cmp(target_arch, 'armeabi-v7a-hard') == 0: - ndk_arch += 'arm' - elif cmp(target_arch, 'arm64-v8a') == 0: - ndk_arch += 'arm64' - - env.AppendUnique(CPPPATH = android_ndk+'/platforms/android-21/'+ndk_arch+'/usr/include') - env.AppendUnique(CPPPATH = Split(flags[8:])) - - elif cmp(flags[0:8], 'SYSROOT=') == 0: - sysroot = flags[8:].strip() - env.AppendUnique(LINKFLAGS = ['--sysroot=' + sysroot]) - - elif cmp(flags[0:8], 'LDFLAGS=') == 0: - env.AppendUnique(LINKFLAGS = Split(flags[8:])) - - elif cmp(flags[0:7], 'TC_VER=') == 0: # set gnustl library path - ver = flags[7:].strip() - stl_path = android_ndk + '/sources/cxx-stl/gnu-libstdc++/' + ver + '/libs/' + target_arch -# if target_arch in ['armeabi', 'armeabi-v7a', 'armeabi-v7a-hard']: -# stl_path = stl_path + '/thumb/' - env.AppendUnique(LIBPATH = [stl_path]) - env.Install(env.get('BUILD_DIR'), stl_path + '/libgnustl_shared.so') - - elif cmp(flags[0:9], 'PLATFORM=') == 0: # get target platform: android-x - platform_ver = flags[9+8:].strip() - if not platform_ver.isdigit(): - platform_ver = '' - - - elif cmp(flags[0:9], 'PLATFORM=') == 0: # get target platform: android-x - platform_ver = flags[9+8:].strip() - if not platform_ver.isdigit(): - platform_ver = '' - - - elif cmp(flags[0:9], 'PLATFORM=') == 0: # get target platform: android-x - platform_ver = flags[9+8:].strip() - if not platform_ver.isdigit(): - platform_ver = '' + if cmp(flags[0:10], 'TC_PREFIX=') == 0: # toolchain prefix (include path) + prefix = flags[10:].strip() + env.Replace(CC=prefix + 'gcc') + env.Replace(CXX=prefix + 'g++') + env.Replace(AR=prefix + 'ar') + env.Replace(RANLIB=prefix + 'ranlib') + + elif cmp(flags[0:7], 'CFLAGS=') == 0: + env.AppendUnique(CFLAGS=Split(flags[7:])) + + elif cmp(flags[0:9], 'CXXFLAGS=') == 0: + env.AppendUnique(CXXFLAGS=Split(flags[9:])) + + elif cmp(flags[0:8], 'CPPPATH=') == 0: + env.AppendUnique(CPPPATH = Split(flags[8:])) + + ndk_arch = 'arch-' + if cmp(target_arch, 'x86') == 0: + ndk_arch += 'x86' + elif cmp(target_arch, 'x86_64') == 0: + ndk_arch += 'x86_64' + elif cmp(target_arch, 'armeabi') == 0: + ndk_arch += 'arm' + elif cmp(target_arch, 'armeabi-v7a') == 0: + ndk_arch += 'arm' + elif cmp(target_arch, 'armeabi-v7a-hard') == 0: + ndk_arch += 'arm' + elif cmp(target_arch, 'arm64-v8a') == 0: + ndk_arch += 'arm64' + + env.AppendUnique(CPPPATH = android_ndk+'/platforms/android-21/'+ndk_arch+'/usr/include') + env.AppendUnique(CPPPATH = Split(flags[8:])) + + elif cmp(flags[0:8], 'SYSROOT=') == 0: + sysroot = flags[8:].strip() + env.AppendUnique(LINKFLAGS=['--sysroot=' + sysroot]) + + elif cmp(flags[0:8], 'LDFLAGS=') == 0: + env.AppendUnique(LINKFLAGS=Split(flags[8:])) + + elif cmp(flags[0:7], 'TC_VER=') == 0: # set gnustl library path + ver = flags[7:].strip() + stl_path = android_ndk + '/sources/cxx-stl/gnu-libstdc++/' + ver + '/libs/' + target_arch +# if target_arch in ['armeabi', 'armeabi-v7a', 'armeabi-v7a-hard']: +# stl_path = stl_path + '/thumb/' + env.AppendUnique(LIBPATH = [stl_path]) + env.Install(env.get('BUILD_DIR'), stl_path + '/libgnustl_shared.so') + + elif cmp(flags[0:9], 'PLATFORM=') == 0: # get target platform: android-x + platform_ver = flags[9 + 8:].strip() + if not platform_ver.isdigit(): + platform_ver = '' # Determine dependency faux SYS_ROOT dep_sys_root = os.path.join(env.get('SRC_DIR'), 'dep', 'android', target_arch, 'usr') -dep_src_dir = os.path.join(dep_sys_root, 'include') -dep_lib_dir = os.path.join(dep_sys_root, 'lib') +dep_src_dir = os.path.join(dep_sys_root, 'include') +dep_lib_dir = os.path.join(dep_sys_root, 'lib') env['DEP_SYS_ROOT'] = dep_sys_root # Add external libraries including boost -env.AppendUnique(CPPPATH = [ dep_src_dir ]) -env.AppendUnique(LIBPATH = [ dep_lib_dir ]) +env.AppendUnique(CPPPATH=[dep_src_dir]) +env.AppendUnique(LIBPATH=[dep_lib_dir]) ###################################################################### # Set release/debug flags ###################################################################### if env.get('RELEASE'): - env.AppendUnique(CCFLAGS = ['-Os']) - env.AppendUnique(CPPDEFINES = ['NDEBUG']) - env.AppendUnique(LINKFLAGS = ['-s']) + env.AppendUnique(CCFLAGS=['-Os']) + env.AppendUnique(CPPDEFINES=['NDEBUG']) + env.AppendUnique(LINKFLAGS=['-s']) else: - env.AppendUnique(CCFLAGS = ['-g']) + env.AppendUnique(CCFLAGS=['-g']) if env.get('LOGGING'): - env.AppendUnique(CPPDEFINES = ['TB_LOG']) - + env.AppendUnique(CPPDEFINES=['TB_LOG']) -env.AppendUnique(CPPDEFINES = ['WITH_POSIX', '__ANDROID__']) -env.AppendUnique(CCFLAGS = ['-Wall', '-Wextra', '-fPIC']) +env.AppendUnique(CPPDEFINES=['WITH_POSIX', '__ANDROID__']) +env.AppendUnique(CCFLAGS=['-Wall', '-Wextra', '-fPIC']) -env.AppendUnique(LIBPATH = [env.get('BUILD_DIR')]) -env.AppendUnique(LIBPATH = [src_dir + '/resource/csdk/connectivity/lib/android']) -env.AppendUnique(LIBS = ['log', 'coap']) +env.AppendUnique(LIBPATH=[env.get('BUILD_DIR')]) +env.AppendUnique(LIBPATH=[src_dir + '/resource/csdk/connectivity/lib/android']) +env.AppendUnique(LIBS=['log', 'coap']) # Build mbedtls as ocstack uses hash functions from mbedcrypto.lib. env.SConscript('#extlibs/mbedtls/SConscript') if env.get('SECURED') == '1': - env.AppendUnique(LIBS = ['mbedtls','mbedx509','mbedcrypto']) + env.AppendUnique(LIBS=['mbedtls', 'mbedx509', 'mbedcrypto']) else: - env.AppendUnique(LIBS = ['mbedcrypto']) + env.AppendUnique(LIBS=['mbedcrypto']) # From android-5 (API > 20), all application must be built with flags '-fPIE' '-pie'. # Due to the limitation of Scons, it's required to added it into the command line # directly (otherwise, it will also be added when build share library) -env.Replace(CCCOM = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM -fPIE $SOURCES') -env.Replace(CXXCOM = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM -fPIE $SOURCES') -env.Replace(LINKCOM = '$LINK -o $TARGET -pie $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS') +env.Replace( + CCCOM='$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM -fPIE $SOURCES') +env.Replace( + CXXCOM='$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM -fPIE $SOURCES') +env.Replace( + LINKCOM= + '$LINK -o $TARGET -pie $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' +) # Fix android-ndk compatibility issue, make applications build on new NDK can run on old platform if platform_ver == '' or int(platform_ver) > 20: - SConscript('compatibility/c_compat.scons') + SConscript('compatibility/c_compat.scons') SConscript('compatibility/cpp11_compat.scons') -- 2.7.4