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
|