mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
e47e8a2512
The included method of determining the host platform in the androideabi would not match to windows if RUBY_PLATFORM returned mingw, wince, or emx. As an added pre-caution, using a case statement with regexp matching will better determine the host platform since it won't be case sensitive and for windows is set to match more specifially than just "win".
127 lines
4.7 KiB
Ruby
127 lines
4.7 KiB
Ruby
# 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 /darwin/i
|
|
HOST_PLATFORM = 'darwin-x86'
|
|
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
|