1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# Download and unarchive latest Android NDK from https://developer.android.com/tools/sdk/ndk/index.html
# Make custom standalone toolchain as described here (android_ndk/docs/STANDALONE-TOOLCHAIN.html)
# Please export custom standalone toolchain path
# export ANDROID_STANDALONE_TOOLCHAIN=/tmp/android-14-toolchain
# Add to your build_config.rb
# MRuby::CrossBuild.new('androideabi') do |conf|
# toolchain :androideabi
# end
MRuby::Toolchain.new(:androideabi) do |conf|
toolchain :gcc
DEFAULT_ANDROID_TOOLCHAIN = 'gcc'
DEFAULT_ANDROID_TARGET_ARCH = 'arm'
DEFAULT_ANDROID_TARGET_ARCH_ABI = 'armeabi'
DEFAULT_ANDROID_TARGET_PLATFORM = 'android-14'
DEFAULT_GCC_VERSION = '4.6'
DEFAULT_CLANG_VERSION = '3.1'
GCC_COMMON_CFLAGS = %W(-ffunction-sections -funwind-tables -fstack-protector)
GCC_COMMON_LDFLAGS = %W()
# 'ANDROID_STANDALONE_TOOLCHAIN' or 'ANDROID_NDK_HOME' must be set.
ANDROID_STANDALONE_TOOLCHAIN = ENV['ANDROID_STANDALONE_TOOLCHAIN']
ANDROID_NDK_HOME = ENV['ANDROID_NDK_HOME']
ANDROID_TARGET_ARCH = ENV['ANDROID_TARGET_ARCH'] || DEFAULT_ANDROID_TARGET_ARCH
ANDROID_TARGET_ARCH_ABI = ENV['ANDROID_TARGET_ARCH_ABI'] || DEFAULT_ANDROID_TARGET_ARCH_ABI
ANDROID_TOOLCHAIN = ENV['ANDROID_TOOLCHAIN'] || DEFAULT_ANDROID_TOOLCHAIN
case ANDROID_TARGET_ARCH.downcase
when 'arch-arm', 'arm' then
toolchain_prefix = 'arm-linux-androideabi-'
when 'arch-x86', 'x86' then
toolchain_prefix = 'i686-linux-android-'
when 'arch-mips', 'mips' then
toolchain_prefix = 'mipsel-linux-android-'
else
# Any other architectures are not supported by Android NDK.
# Notify error.
end
if ANDROID_STANDALONE_TOOLCHAIN == nil then
case RUBY_PLATFORM
when /cygwin|mswin|mingw|bccwin|wince|emx/i
HOST_PLATFORM = 'windows'
when /x86_64-darwin/i
HOST_PLATFORM = 'darwin-x86_64'
when /darwin/i
HOST_PLATFORM = 'darwin-x86'
when /x86_64-linux/i
HOST_PLATFORM = 'linux-x86_64'
when /linux/i
HOST_PLATFORM = 'linux-x86'
else
# Unknown host platform
end
ANDROID_TARGET_PLATFORM = ENV['ANDROID_TARGET_PLATFORM'] || DEFAULT_ANDROID_TARGET_PLATFORM
path_to_toolchain = ANDROID_NDK_HOME + '/toolchains/'
path_to_sysroot = ANDROID_NDK_HOME + '/platforms/' + ANDROID_TARGET_PLATFORM
if ANDROID_TOOLCHAIN.downcase == 'gcc' then
case ANDROID_TARGET_ARCH.downcase
when 'arch-arm', 'arm' then
path_to_toolchain += 'arm-linux-androideabi-'
path_to_sysroot += '/arch-arm'
when 'arch-x86', 'x86' then
path_to_toolchain += 'x86-'
path_to_sysroot += '/arch-x86'
when 'arch-mips', 'mips' then
path_to_toolchain += 'mipsel-linux-android-'
path_to_sysroot += '/arch-mips'
else
# Any other architecture are not supported by Android NDK.
end
path_to_toolchain += DEFAULT_GCC_VERSION + '/prebuilt/' + HOST_PLATFORM
else
path_to_toolchain += 'llvm-' + DEFAULT_CLANG_VERSION + '/prebuilt/' + HOST_PLATFORM
end
else
path_to_toolchain = ANDROID_STANDALONE_TOOLCHAIN
path_to_sysroot = ANDROID_STANDALONE_TOOLCHAIN + '/sysroot'
end
SYSROOT = path_to_sysroot
case ANDROID_TARGET_ARCH.downcase
when 'arch-arm', 'arm' then
if ANDROID_TARGET_ARCH_ABI.downcase == 'armeabi-v7a' then
ARCH_CFLAGS = %W(-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16)
ARCH_LDFLAGS = %W(-march=armv7-a -Wl,--fix-cortex-a8)
else
ARCH_CFLAGS = %W(-march=armv5te -mtune=xscale -msoft-float)
ARCH_LDFLAGS = %W()
end
when 'arch-x86', 'x86' then
ARCH_CFLAGS = %W()
ARCH_LDFLAGS = %W()
when 'arch-mips', 'mips' then
ARCH_CFLAGS = %W(-fpic -fno-strict-aliasing -finline-functions -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers)
ARCH_LDFLAGS = %W()
else
# Notify error
end
case ANDROID_TOOLCHAIN.downcase
when 'gcc' then
ANDROID_CC = path_to_toolchain + '/bin/' + toolchain_prefix + 'gcc'
ANDROID_LD = path_to_toolchain + '/bin/' + toolchain_prefix + 'gcc'
ANDROID_AR = path_to_toolchain + '/bin/' + toolchain_prefix + 'ar'
ANDROID_CFLAGS = GCC_COMMON_CFLAGS + %W(-mandroid --sysroot="#{SYSROOT}") + ARCH_CFLAGS
ANDROID_LDFLAGS = GCC_COMMON_LDFLAGS + %W(-mandroid --sysroot="#{SYSROOT}") + ARCH_LDFLAGS
when 'clang' then
# clang is not supported yet.
when 'clang31', 'clang3.1' then
# clang is not supported yet.
else
# Any other toolchains are not supported by Android NDK.
# Notify error.
end
[conf.cc, conf.cxx, conf.objc, conf.asm].each do |cc|
cc.command = ENV['CC'] || ANDROID_CC
cc.flags = [ENV['CFLAGS'] || ANDROID_CFLAGS]
end
conf.linker.command = ENV['LD'] || ANDROID_LD
conf.linker.flags = [ENV['LDFLAGS'] || ANDROID_LDFLAGS]
conf.archiver.command = ENV['AR'] || ANDROID_AR
end
|