sys.path.append(join(root_dir, 'tools'))
import js2c, utils
+TOP = os.environ.get('TOP')
+if TOP is None:
+ TOP=""
+
+ANDROID_FLAGS = ['-march=armv5te',
+ '-mtune=xscale',
+ '-msoft-float',
+ '-fpic',
+ '-mthumb-interwork',
+ '-funwind-tables',
+ '-fstack-protector',
+ '-fno-short-enums',
+ '-fmessage-length=0',
+ '-finline-functions',
+ '-fno-inline-functions-called-once',
+ '-fgcse-after-reload',
+ '-frerun-cse-after-loop',
+ '-frename-registers',
+ '-fomit-frame-pointer',
+ '-fno-strict-aliasing',
+ '-finline-limit=64',
+ '-MD']
+
+ANDROID_INCLUDES = [TOP + '/bionic/libc/arch-arm/include',
+ TOP + '/bionic/libc/include',
+ TOP + '/bionic/libstdc++/include',
+ TOP + '/bionic/libc/kernel/common',
+ TOP + '/bionic/libc/kernel/arch-arm',
+ TOP + '/bionic/libm/include',
+ TOP + '/bionic/libm/include/arch/arm',
+ TOP + '/bionic/libthread_db/include']
LIBRARY_FLAGS = {
'all': {
'CCFLAGS': ['-DWIN32'],
'CXXFLAGS': ['-DWIN32'],
},
+ 'os:android': {
+ 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__', '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__', 'SK_RELEASE', 'NDEBUG'],
+ 'CCFLAGS': ANDROID_FLAGS,
+ 'WARNINGFLAGS': ['-Wall', '-Wno-unused', '-Werror=return-type', '-Wstrict-aliasing=2'],
+ 'CPPPATH': ANDROID_INCLUDES,
+ },
'wordsize:64': {
'CCFLAGS': ['-m32'],
'LINKFLAGS': ['-m32']
'gcc': {
'all': {
'CXXFLAGS': [], #['-fvisibility=hidden'],
- 'WARNINGFLAGS': ['-pedantic', '-Wall', '-Werror', '-W',
+ 'WARNINGFLAGS': ['-Wall', '-Werror', '-W',
'-Wno-unused-parameter']
},
'arch:arm': {
'CPPDEFINES': ['ARM']
},
+ 'arch:android': {
+ 'CPPDEFINES': ['ARM']
+ },
'os:win32': {
- 'WARNINGFLAGS': ['-Wno-long-long']
+ 'WARNINGFLAGS': ['-pedantic', '-Wno-long-long']
+ },
+ 'os:linux': {
+ 'WARNINGFLAGS': ['-pedantic']
+ },
+ 'os:macos': {
+ 'WARNINGFLAGS': ['-pedantic']
},
'disassembler:on': {
'CPPDEFINES': ['ENABLE_DISASSEMBLER']
DTOA_EXTRA_FLAGS = {
'gcc': {
'all': {
- 'WARNINGFLAGS': ['-Werror']
+ 'WARNINGFLAGS': ['-Werror', '-Wno-uninitialized']
}
},
'msvc': {
},
'gcc': {
'all': {
- 'LIBPATH': ['.']
+ 'LIBPATH': ['.'],
+ 'CCFLAGS': ['-fno-rtti', '-fno-exceptions']
},
'os:linux': {
'LIBS': ['pthread', 'rt'],
'os:win32': {
'LIBS': ['winmm', 'ws2_32']
},
- 'wordsize:64': {
- 'CCFLAGS': ['-m32'],
- 'LINKFLAGS': ['-m32']
+ 'os:android': {
+ 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__', '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__', 'SK_RELEASE', 'NDEBUG'],
+ 'CCFLAGS': ANDROID_FLAGS,
+ 'CPPPATH': ANDROID_INCLUDES,
+ 'LIBPATH': [TOP + '/out/target/product/generic/obj/lib'],
+ 'LINKFLAGS': ['-nostdlib', '-Bdynamic', '-Wl,-T,' + TOP + '/build/core/armelf.x', '-Wl,-dynamic-linker,/system/bin/linker', '-Wl,--gc-sections', '-Wl,-z,nocopyreloc', '-Wl,-rpath-link=' + TOP + '/out/target/product/generic/obj/lib', TOP + '/out/target/product/generic/obj/lib/crtbegin_dynamic.o', TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a', TOP + '/out/target/product/generic/obj/lib/crtend_android.o'],
+ 'LIBS': ['c', 'stdc++', 'm'],
},
'mode:release': {
'CCFLAGS': ['-O2']
'help': 'the toolchain to use'
},
'os': {
- 'values': ['freebsd', 'linux', 'macos', 'win32'],
+ 'values': ['freebsd', 'linux', 'macos', 'win32', 'android'],
'default': OS_GUESS,
'help': 'the os to build for'
},
options[key] = prefix + value
def ConfigureObject(self, env, input, **kw):
+ if (kw.has_key('CPPPATH') and env.has_key('CPPPATH')):
+ kw['CPPPATH'] += env['CPPPATH']
if self.options['library'] == 'static':
return env.StaticObject(input, **kw)
else:
#include <sys/stat.h> // open
#include <fcntl.h> // open
#include <unistd.h> // sysconf
+#ifdef __GLIBC__
#include <execinfo.h> // backtrace, backtrace_symbols
+#endif // def __GLIBC__
#include <strings.h> // index
#include <errno.h>
#include <stdarg.h>
int OS::StackWalk(OS::StackFrame* frames, int frames_size) {
+ // backtrace is a glibc extension.
+#ifdef __GLIBC__
void** addresses = NewArray<void*>(frames_size);
int frames_count = backtrace(addresses, frames_size);
free(symbols);
return frames_count;
+#else // ndef __GLIBC__
+ return 0;
+#endif // ndef __GLIBC__
}
static Sampler* active_sampler_ = NULL;
static void ProfilerSignalHandler(int signal, siginfo_t* info, void* context) {
+ // Ucontext is a glibc extension - no profiling on Android at the moment.
+#ifdef __GLIBC__
USE(info);
if (signal != SIGPROF) return;
if (active_sampler_ == NULL) return;
sample.state = Logger::state();
active_sampler_->Tick(&sample);
+#endif
}