replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / build_common / android / SConscript
1 ##
2 # This script includes android specific config (GNU GCC)
3 ##
4 import os
5 import platform
6 import subprocess
7
8 Import('env')
9
10 SConscript('../external_libs.scons')
11 help_vars = Variables()
12 if not env.get('ANDROID_NDK'):
13     SConscript('../../extlibs/android/ndk/SConscript')
14     help_vars.Add(PathVariable('ANDROID_NDK', 'Android NDK root directory', os.path.join(env.get('SRC_DIR'), 'extlibs', 'android', 'ndk', 'android-ndk-r10d')))
15
16 if not env.get('ANDROID_GRADLE'):
17     SConscript('../../extlibs/android/gradle/SConscript')
18     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')))
19
20 if not env.get('ANDROID_HOME'):
21     SConscript('../../extlibs/android/sdk/SConscript')
22
23
24 if env.get('ANDROID_NDK'):
25         android_ndk = env.get('ANDROID_NDK')
26 else:
27         print '''
28 *************************************** Info **********************************
29 *    Android NDK path isn't set, the default will be used. You can set        *
30 * environment variable ANDROID_NDK or add it in command line as:              *
31 *      # scons ANDROID_NDK=<path to android NDK> ...                          *
32 *******************************************************************************
33 '''
34         android_ndk = os.path.join(env.get('SRC_DIR'), 'extlibs', 'android', 'ndk', 'android-ndk-r10d')
35
36 if env.get('ANDROID_GRADLE'):
37         android_gradle = env.get('ANDROID_GRADLE')
38 else:
39         print '''
40 *************************************** Info **********************************
41 *    Android Gradle path isn't set, the default will be used. You can set     *
42 * environment variable ANDROID_GRADLE or add it in command line as:           *
43 *      # scons ANDROID_GRADLE=<path to android GRADLE> ...                    *
44 *******************************************************************************
45 '''
46         android_gradle = os.path.join(env.get('SRC_DIR'), 'extlibs', 'android', 'gradle', 'gradle-2.2.1', 'bin', 'gradle')
47
48 help_vars.Update(env)
49 Help(help_vars.GenerateHelpText(env))
50 src_dir = env.get('SRC_DIR')
51
52 # Overwrite suffixes and prefixes
53 if env['HOST_OS'] == 'win32':
54         env['OBJSUFFIX'] = '.o'
55         env['SHOBJSUFFIX'] = '.os'
56         env['LIBPREFIX'] = 'lib'
57         env['LIBSUFFIX'] = '.a'
58         env['SHLIBPREFIX'] = 'lib'
59         env['SHLIBSUFFIX'] = '.so'
60         env['LIBPREFIXES'] = ['lib']
61         env['LIBSUFFIXES'] = ['.a', '.so']
62         env['PROGSUFFIX'] = ''
63 elif platform.system().lower() == 'darwin':
64         env['SHLIBSUFFIX'] = '.so'
65         env['LIBSUFFIXES'] = ['.a', '.so']
66         env['PROGSUFFIX'] = ''
67
68 ######################################################################
69 # Set common flags
70 ######################################################################
71
72 # Android build system default cofig
73 env.AppendUnique(CPPDEFINES = ['ANDROID'])
74 env.AppendUnique(CFLAGS = ['-std=c99'])
75 env.AppendUnique(SHCFLAGS = ['-Wa,--noexecstack'])
76 env.AppendUnique(LINKFLAGS = ['-Wl,--gc-sections', '-Wl,-z,nocopyreloc'])
77
78 ######################################################################
79 # Probe Android NDK default flags
80 ######################################################################
81 ndk_build_cmd = android_ndk + '/ndk-build'
82 if env['HOST_OS'] == 'win32':
83         if os.path.isfile(ndk_build_cmd + '.cmd'):
84                 ndk_build_cmd += '.cmd'
85
86 if not os.path.isfile(ndk_build_cmd):
87         print '''
88 *************************************** Error *********************************
89 *   It seems android ndk path is not set properly, please check if "%s"
90 * is the root directory of android ndk.                                       *
91 *******************************************************************************
92 ''' % android_ndk
93         Exit(1)
94
95 # ANDROID_HOME build option
96 if env.get('ANDROID_HOME'):
97         android_gradle = env.get('ANDROID_HOME')
98 else:
99         help_vars = Variables()
100         help_vars.Add(PathVariable('ANDROID_HOME', 'ANDROID SDK root directory', os.environ.get('ANDROID_HOME')))
101         help_vars.Update(env)
102         Help(help_vars.GenerateHelpText(env))
103         print '''
104 *************************************** Info **********************************
105 *   Environment variable ANDROID_HOME will use default value. To override     *
106 * root directory of android sdk, please specify ANDROID_HOME as follows:      *
107 *       scons ANDROID_HOME= <path to Android SDK>                             *
108 *******************************************************************************
109 '''
110
111 target_arch = env.get('TARGET_ARCH')
112
113 # Android ndk early version doesn't support C++11. Detect the toolchain version
114 # to make sure proper toolchain is used
115 for tc_ver in ['4.7', '4.8', '4.9', '']:
116         if os.path.exists(android_ndk + '/toolchains/x86-' + tc_ver):
117                 break
118
119 cmd = [ndk_build_cmd]
120 cmd.append('APP_ABI=' + target_arch)
121 cmd.append('APP_PLATFORM=android-21')
122 cmd.append('APP_STL=gnustl_shared')
123 if env.get('RELEASE'):
124         cmd.append('APP_OPTIM=release')
125 else:
126         cmd.append('APP_OPTIM=debug')
127 if tc_ver != '':
128         cmd.append('NDK_TOOLCHAIN_VERSION=' + tc_ver)
129 else:
130         print '''
131 *************************************** Warning *******************************
132 *   To support C++11, the toolchain should be >= 4.7, please make sure your   *
133 * android NDK is at least r8e!                                                *
134 *******************************************************************************
135 '''
136
137 cmd.append('-n')
138
139 p = subprocess.Popen(cmd, stdout = subprocess.PIPE)
140
141 for flags in p.stdout.readlines():
142         if cmp(flags[0:10], 'TC_PREFIX=') == 0: # toolchain prefix (include path)
143                 prefix = flags[10:].strip()
144                 env.Replace(CC = prefix + 'gcc')
145                 env.Replace(CXX = prefix + 'g++')
146                 env.Replace(AR = prefix + 'ar')
147                 env.Replace(RANLIB = prefix + 'ranlib')
148
149         elif cmp(flags[0:7], 'CFLAGS=') == 0:
150                 env.AppendUnique(CFLAGS = Split(flags[7:]))
151
152         elif cmp(flags[0:9], 'CXXFLAGS=') == 0:
153                 env.AppendUnique(CXXFLAGS = Split(flags[9:]))
154
155         elif cmp(flags[0:8], 'CPPPATH=') == 0:
156                 ndk_arch = 'arch-'
157                 if cmp(target_arch, 'x86') == 0:
158                         ndk_arch += 'x86'
159                 elif cmp(target_arch, 'x86_64') == 0:
160                         ndk_arch += 'x86_64'
161                 elif cmp(target_arch, 'armeabi') == 0:
162                         ndk_arch += 'arm'
163                 elif cmp(target_arch, 'armeabi-v7a') == 0:
164                         ndk_arch += 'arm'
165                 elif cmp(target_arch, 'armeabi-v7a-hard') == 0:
166                         ndk_arch += 'arm'
167                 elif cmp(target_arch, 'arm64-v8a') == 0:
168                         ndk_arch += 'arm64'
169
170                 env.AppendUnique(CPPPATH = android_ndk+'/platforms/android-21/'+ndk_arch+'/usr/include')
171                 env.AppendUnique(CPPPATH = Split(flags[8:]))
172
173         elif cmp(flags[0:8], 'SYSROOT=') == 0:
174                 sysroot = flags[8:].strip()
175                 env.AppendUnique(LINKFLAGS = ['--sysroot=' + sysroot])
176
177         elif cmp(flags[0:8], 'LDFLAGS=') == 0:
178                 env.AppendUnique(LINKFLAGS = Split(flags[8:]))
179
180         elif cmp(flags[0:7], 'TC_VER=') == 0:  # set gnustl library path
181                 ver = flags[7:].strip()
182                 stl_path = android_ndk + '/sources/cxx-stl/gnu-libstdc++/' + ver + '/libs/' + target_arch
183 #               if target_arch in ['armeabi', 'armeabi-v7a', 'armeabi-v7a-hard']:
184 #                       stl_path = stl_path + '/thumb/'
185                 env.AppendUnique(LIBPATH = [stl_path])
186                 env.Install(env.get('BUILD_DIR'), stl_path + '/libgnustl_shared.so')
187
188         elif cmp(flags[0:9], 'PLATFORM=') == 0:  # get target platform: android-x
189                 platform_ver = flags[9+8:].strip()
190                 if not platform_ver.isdigit():
191                         platform_ver = ''
192
193
194         elif cmp(flags[0:9], 'PLATFORM=') == 0:  # get target platform: android-x
195                 platform_ver = flags[9+8:].strip()
196                 if not platform_ver.isdigit():
197                         platform_ver = ''
198
199
200         elif cmp(flags[0:9], 'PLATFORM=') == 0:  # get target platform: android-x
201                 platform_ver = flags[9+8:].strip()
202                 if not platform_ver.isdigit():
203                         platform_ver = ''
204
205 # Determine dependency faux SYS_ROOT
206 dep_sys_root = os.path.join(env.get('SRC_DIR'), 'dep', 'android', target_arch, 'usr')
207 dep_src_dir =  os.path.join(dep_sys_root, 'include')
208 dep_lib_dir =  os.path.join(dep_sys_root, 'lib')
209
210 env['DEP_SYS_ROOT'] = dep_sys_root
211
212 # Add external libraries including boost
213 env.AppendUnique(CPPPATH = [ dep_src_dir ])
214 env.AppendUnique(LIBPATH = [ dep_lib_dir ])
215
216 ######################################################################
217 # Set release/debug flags
218 ######################################################################
219 if env.get('RELEASE'):
220         env.AppendUnique(CCFLAGS = ['-Os'])
221         env.AppendUnique(CPPDEFINES = ['NDEBUG'])
222         env.AppendUnique(LINKFLAGS = ['-s'])
223 else:
224         env.AppendUnique(CCFLAGS = ['-g'])
225
226 if env.get('LOGGING'):
227         env.AppendUnique(CPPDEFINES = ['TB_LOG'])
228
229
230 env.AppendUnique(CPPDEFINES = ['WITH_POSIX', '__ANDROID__'])
231 env.AppendUnique(CCFLAGS = ['-Wall', '-Wextra', '-fPIC'])
232
233 env.AppendUnique(LIBPATH = [env.get('BUILD_DIR')])
234 env.AppendUnique(LIBPATH = [src_dir + '/resource/csdk/connectivity/lib/android'])
235 env.AppendUnique(LIBS = ['log', 'coap'])
236
237 if env.get('SECURED') == '1':
238         env.SConscript('#extlibs/mbedtls/SConscript')
239         env.AppendUnique(LIBS = ['mbedtls','mbedx509','mbedcrypto'])
240
241 # From android-5 (API > 20), all application must be built with flags '-fPIE' '-pie'.
242 # Due to the limitation of Scons, it's required to added it into the command line
243 # directly (otherwise, it will also be added when build share library)
244 env.Replace(CCCOM = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM -fPIE $SOURCES')
245 env.Replace(CXXCOM = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM -fPIE $SOURCES')
246 env.Replace(LINKCOM = '$LINK -o $TARGET -pie $LINKFLAGS $__RPATH $SOURCES $_LIBDIRFLAGS $_LIBFLAGS')
247
248 # Fix android-ndk compatibility issue, make applications build on new NDK can run on old platform
249 if platform_ver == '' or int(platform_ver) > 20:
250         SConscript('compatibility/c_compat.scons')
251
252 SConscript('compatibility/cpp11_compat.scons')
253
254 # Make sure that boost for android is available
255 SConscript('#extlibs/boost/SConscript')