2 # This script includes android specific config (GNU GCC)
10 help_vars = Variables()
11 help_vars.Add(PathVariable('ANDROID_NDK', 'Android NDK root directory', os.environ.get('ANDROID_NDK')))
13 Help(help_vars.GenerateHelpText(env))
15 android_ndk = env.get('ANDROID_NDK')
18 *************************************** Error *********************************
19 * Android NDK path isn't set, you can set enviornment variable ANDROID_NDK *
20 * or add it in command line as: *
21 * # scons ANDROID_NDK=<path to android NDK> ... *
22 *******************************************************************************
26 # Overwrite suffixes and prefixes
27 if env['HOST_OS'] == 'win32':
28 env['OBJSUFFIX'] = '.o'
29 env['SHOBJSUFFIX'] = '.os'
30 env['LIBPREFIX'] = 'lib'
31 env['LIBSUFFIX'] = '.a'
32 env['SHLIBPREFIX'] = 'lib'
33 env['SHLIBSUFFIX'] = '.so'
34 env['LIBPREFIXES'] = ['lib']
35 env['LIBSUFFIXES'] = ['.a', '.so']
36 env['PROGSUFFIX'] = ''
37 elif platform.system().lower() == 'darwin':
38 env['SHLIBSUFFIX'] = '.so'
39 env['LIBSUFFIXES'] = ['.a', '.so']
40 env['PROGSUFFIX'] = ''
42 ######################################################################
44 ######################################################################
46 # Android build system default cofig
47 env.AppendUnique(CPPDEFINES = ['ANDROID'])
48 env.AppendUnique(SHCFLAGS = ['-Wa,--noexecstack'])
49 env.AppendUnique(LINKFLAGS = ['-Wl,--gc-sections', '-Wl,-z,nocopyreloc'])
51 ######################################################################
52 # Probe Android NDK default flags
53 ######################################################################
54 ndk_build_cmd = android_ndk + '/ndk-build'
55 if env['HOST_OS'] == 'win32':
56 if os.path.isfile(ndk_build_cmd + '.cmd'):
57 ndk_build_cmd += '.cmd'
59 if not os.path.isfile(ndk_build_cmd):
61 *************************************** Error *********************************
62 * It seems android ndk path is not set properly, please check if "%s"
63 * is the root directory of android ndk. *
64 *******************************************************************************
68 ANDROID_HOME = os.environ.get('ANDROID_HOME')
69 if ANDROID_HOME is not None:
70 ANDROID_HOME = os.path.abspath(ANDROID_HOME)
72 if ANDROID_HOME is None or not os.path.exists(ANDROID_HOME):
74 *************************************** Warning *******************************
75 * Enviornment variable ANDROID_HOME is not set properly. It should be the *
76 * root directory of android sdk. If you'd like build Java code, it's required.*
77 *******************************************************************************
80 target_arch = env.get('TARGET_ARCH')
82 # Android ndk early version doesn't support C++11. Detect the toolchain version
83 # to make sure proper toolchain is used
84 for tc_ver in ['4.9', '4.8', '4.7', '']:
85 if os.path.exists(android_ndk + '/toolchains/x86-' + tc_ver):
89 cmd.append('APP_ABI=' + target_arch)
90 cmd.append('APP_STL=gnustl_static')
91 if env.get('RELEASE'):
92 cmd.append('APP_OPTIM=release')
94 cmd.append('APP_OPTIM=debug')
96 cmd.append('NDK_TOOLCHAIN_VERSION=' + tc_ver)
99 *************************************** Warning *******************************
100 * To support C++11, the toolchain should be >= 4.7, please make sure your *
101 * android NDK is at least r8e! *
102 *******************************************************************************
107 p = subprocess.Popen(cmd, stdout = subprocess.PIPE)
109 for flags in p.stdout.readlines():
110 if cmp(flags[0:10], 'TC_PREFIX=') == 0: # toolchain prefix (include path)
111 prefix = flags[10:].strip()
112 env.Replace(CC = prefix + 'gcc')
113 env.Replace(CXX = prefix + 'g++')
114 env.Replace(AR = prefix + 'ar')
115 env.Replace(RANLIB = prefix + 'ranlib')
117 elif cmp(flags[0:7], 'CFLAGS=') == 0:
118 env.AppendUnique(CFLAGS = Split(flags[7:]))
120 elif cmp(flags[0:9], 'CXXFLAGS=') == 0:
121 env.AppendUnique(CXXFLAGS = Split(flags[9:]))
123 elif cmp(flags[0:8], 'CPPPATH=') == 0:
124 env.AppendUnique(CPPPATH = Split(flags[8:]))
126 elif cmp(flags[0:8], 'SYSROOT=') == 0:
127 sysroot = flags[8:].strip()
128 env.AppendUnique(LINKFLAGS = ['--sysroot=' + sysroot])
129 env.AppendUnique(LIBPATH = [sysroot + '/usr/lib'])
131 elif cmp(flags[0:8], 'LDFLAGS=') == 0:
132 env.AppendUnique(LINKFLAGS = Split(flags[8:]))
134 elif cmp(flags[0:7], 'TC_VER=') == 0: # set gnustl library path
135 ver = flags[7:].strip()
136 env.AppendUnique(LIBPATH = [android_ndk + '/sources/cxx-stl/gnu-libstdc++/'
137 + ver + '/libs/' + target_arch])
139 elif cmp(flags[0:9], 'PLATFORM=') == 0: # get target platform: android-x
140 platform_ver = flags[9+8:].strip()
141 if not platform_ver.isdigit():
144 # Add external libraries including boost
145 env.AppendUnique(CPPPATH = [env.get('SRC_DIR') + '/out/android/include' ])
146 if target_arch == 'x86':
147 env.AppendUnique(LIBPATH = [env.get('SRC_DIR') + '/out/android/lib/x86'])
149 env.AppendUnique(LIBPATH = [env.get('SRC_DIR') + '/out/android/lib/arm-linux-androideabi'])
151 ######################################################################
152 # Set release/debug flags
153 ######################################################################
154 if env.get('RELEASE'):
155 env.AppendUnique(CCFLAGS = ['-Os'])
156 env.AppendUnique(CPPDEFINES = ['NDEBUG'])
157 env.AppendUnique(LINKFLAGS = ['-s'])
159 env.AppendUnique(CCFLAGS = ['-g'])
161 # From android-5 (API > 20), all application must be built with flags '-fPIE' '-pie'.
162 # Due to the limitation of Scons, it's required to added it into the command line
163 # directly (otherwise, it will also be added when build share library)
164 env.Replace(CCCOM = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM -fPIE $SOURCES')
165 env.Replace(CXXCOM = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM -fPIE $SOURCES')
166 env.Replace(LINKCOM = '$LINK -o $TARGET -pie $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS')
168 # Fix android-ndk compatibility issue, make applications build on new NDK can run on old platform
169 #if platform_ver == '' or int(platform_ver) > 20:
170 # SConscript('compatibility/c_compat.scons')
172 #SConscript('compatibility/cpp11_compat.scons')