summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--doc/guides/compile.md2
-rw-r--r--include/mruby.h12
-rw-r--r--tasks/toolchains/android.rake216
-rw-r--r--tasks/toolchains/androideabi.rake132
5 files changed, 230 insertions, 134 deletions
diff --git a/README.md b/README.md
index e5ddfab2c..62eca18c9 100644
--- a/README.md
+++ b/README.md
@@ -36,7 +36,7 @@ We don't have mailing list, but you can use [GitHub issues](https://github.com/m
## How to compile and install (mruby and gems)
-See the [doc/compile/README.md](doc/compile/README.md) file.
+See the [doc/guides/compile.md](doc/guides/compile.md) file.
## Running Tests
diff --git a/doc/guides/compile.md b/doc/guides/compile.md
index 8e91e7546..16df2b804 100644
--- a/doc/guides/compile.md
+++ b/doc/guides/compile.md
@@ -75,7 +75,7 @@ toolchain :visualcpp
Toolchain configuration for Android.
```ruby
-toolchain :androideabi
+toolchain :android
```
Requires the custom standalone Android NDK and the toolchain path
diff --git a/include/mruby.h b/include/mruby.h
index cecf6fa47..56d27a09a 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -628,6 +628,18 @@ typedef const char *mrb_args_format;
*/
MRB_API mrb_int mrb_get_args(mrb_state *mrb, mrb_args_format format, ...);
+static inline mrb_sym
+mrb_get_mid(mrb_state *mrb) /* get method symbol */
+{
+ return mrb->c->ci->mid;
+}
+
+static inline int
+mrb_get_argc(mrb_state *mrb) /* get argc */
+{
+ return mrb->c->ci->argc;
+}
+
/* `strlen` for character string literals (use with caution or `strlen` instead)
Adjacent string literals are concatenated in C/C++ in translation phase 6.
If `lit` is not one, the compiler will report a syntax error:
diff --git a/tasks/toolchains/android.rake b/tasks/toolchains/android.rake
new file mode 100644
index 000000000..aadc5b3cc
--- /dev/null
+++ b/tasks/toolchains/android.rake
@@ -0,0 +1,216 @@
+class MRuby::Toolchain::Android
+ DEFAULT_ARCH = 'armeabi'
+ DEFAULT_PLATFORM = 'android-14'
+ DEFAULT_TOOLCHAIN = :gcc
+ DEFAULT_NDK_HOMES = %w{
+ /usr/local/opt/android-ndk
+ }
+ TOOLCHAINS = [:gcc, :clang]
+ ARCHITECTURES = %w{
+ armeabi armeabi-v7a arm64-v8a
+ mips mips64
+ x86 x86_64
+ }
+
+ class AndroidNDKHomeNotFound < StandardError
+ def message
+ <<-EOM
+Couldn't find Android NDK Home.
+Set ANDROID_NDK_HOME environment variable or set :ndk_home parameter
+ EOM
+ end
+ end
+
+ attr_reader :params
+
+ def initialize(params)
+ @params = params
+ end
+
+ def home_path
+ @home_path ||= Pathname(
+ params[:ndk_home] ||
+ ENV['ANDROID_NDK_HOME'] ||
+ DEFAULT_NDK_HOMES.find{ |path| File.directory?(path) } ||
+ raise(AndroidNDKHomeNotFound)
+ )
+ end
+
+ def arch
+ params.fetch(:arch){ DEFAULT_ARCH }
+ end
+
+ def platform
+ params.fetch(:platform){ DEFAULT_PLATFORM }
+ end
+
+ def toolchain
+ params.fetch(:toolchain){ DEFAULT_TOOLCHAIN }
+ end
+
+ def toolchain_version
+ params.fetch(:toolchain_version) do
+ test = case toolchain
+ when :gcc
+ case arch
+ when /armeabi/
+ 'arm-linux-androideabi-*'
+ when /arm64/
+ 'aarch64-linux-android-*'
+ when /mips64/
+ 'mips64el-linux-android-*'
+ when /mips/
+ 'mipsel-linux-android-*'
+ when /x86_64/
+ 'x86_64-*'
+ when /x86/
+ 'x86-*'
+ end
+ when :clang
+ 'llvm-*'
+ end
+
+ Dir[home_path.join('toolchains',test)].map{|t| t.match(/-(\d+\.\d+)$/); $1.to_f }.max
+ end
+ end
+
+ def toolchain_path
+ prefix = case toolchain
+ when :clang then 'llvm-'
+ when :gcc
+ case arch
+ when /armeabi/ then 'arm-linux-androideabi-'
+ when /arm64/ then 'aarch64-linux-android-'
+ when /x86_64/ then 'x86_64-'
+ when /x86/ then 'x86-'
+ when /mips64/ then 'mips64el-linux-android-'
+ when /mips/ then 'mipsel-linux-android-'
+ end
+ end
+ home_path.join('toolchains', prefix + toolchain_version.to_s, 'prebuilt', host_platform)
+ end
+
+ def sysroot
+ path = case arch
+ when /armeabi/ then 'arch-arm'
+ when /arm64/ then 'arch-arm64'
+ when /x86_64/ then 'arch-x86_64'
+ when /x86/ then 'arch-x86'
+ when /mips64/ then 'arch-mips64'
+ when /mips/ then 'arch-mips'
+ end
+
+ home_path.join('platforms', platform, path).to_s
+ end
+
+ def bin(command)
+ command = command.to_s
+
+ if toolchain == :gcc
+ command = case arch
+ when /armeabi/ then 'arm-linux-androideabi-'
+ when /arm64/ then 'aarch64-linux-android-'
+ when /x86_64/ then 'x86_64-linux-android-'
+ when /x86/ then 'i686-linux-android-'
+ when /mips64/ then 'mips64el-linux-android-'
+ when /mips/ then 'mipsel-linux-android-'
+ end + command
+ end
+
+ toolchain_path.join('bin',command).to_s
+ end
+
+ def cc
+ case toolchain
+ when :gcc then bin(:gcc)
+ when :clang then bin(:clang)
+ end
+ end
+
+ def cflags
+ flags = []
+
+ case toolchain
+ when :gcc
+ flags += %W(-ffunction-sections -funwind-tables -no-canonical-prefixes)
+ flags += %W(-D__android__ -mandroid --sysroot="#{sysroot}")
+ case arch
+ when /arm64/
+ flags += %W(-fpic -fstack-protector-strong)
+ when 'armeabi-v7a-hard'
+ flags += %W(-fpic -fstack-protector-strong -march=armv7-a -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -mfpu=vfpv3-d16)
+ when 'armeabi-v7a'
+ flags += %W(-fpic -fstack-protector-strong -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16)
+ when /arm/
+ flags += %W(-fpic -fstack-protector-strong -march=armv5te -mtune=xscale -msoft-float)
+ when /mips/
+ flags += %W(-fpic -fno-strict-aliasing -finline-functions -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers)
+ when /x86/
+ flags += %W(-fstack-protector-strong)
+ end
+ when :clang
+ end
+
+ flags
+ end
+
+ def ld
+ cc
+ end
+
+ def ldflags
+ flags = []
+ case toolchain
+ when :gcc
+ flags += %W(-no-canonical-prefixes)
+ flags += %W(-D__android__ -mandroid --sysroot="#{sysroot}")
+ case arch
+ when 'armeabi-v7a-hard'
+ flags += %W(-march=armv7-a -Wl,--fix-cortex-a8 -Wl,--no-warn-mismatch -lm_hard)
+ when 'armeabi-v7a'
+ flags += %W(-march=armv7-a -Wl,--fix-cortex-a8)
+ end
+ end
+
+ flags
+ end
+
+ def ar
+ case toolchain
+ when :gcc then bin(:ar)
+ when :clang then bin('llvm-ar')
+ end
+ end
+
+ def host_platform
+ case RUBY_PLATFORM
+ when /cygwin|mswin|mingw|bccwin|wince|emx/i
+ 'windows'
+ when /x86_64-darwin/i
+ 'darwin-x86_64'
+ when /darwin/i
+ 'darwin-x86'
+ when /x86_64-linux/i
+ 'linux-x86_64'
+ when /linux/i
+ 'linux-x86'
+ else
+ raise NotImplementedError, "Unknown host platform (#{RUBY_PLATFORM})"
+ end
+ end
+end
+
+MRuby::Toolchain.new(:android) do |conf, params|
+ ndk = MRuby::Toolchain::Android.new(params)
+
+ toolchain ndk.toolchain
+
+ [conf.cc, conf.cxx, conf.objc, conf.asm].each do |cc|
+ cc.command = ndk.cc
+ cc.flags = ndk.cflags
+ end
+ conf.linker.command = ndk.ld
+ conf.linker.flags = ndk.ldflags
+ conf.archiver.command = ndk.ar
+end
+
diff --git a/tasks/toolchains/androideabi.rake b/tasks/toolchains/androideabi.rake
deleted file mode 100644
index 272e802f7..000000000
--- a/tasks/toolchains/androideabi.rake
+++ /dev/null
@@ -1,132 +0,0 @@
-# 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
- GCC_VERSION = ENV['GCC_VERSION'] || DEFAULT_GCC_VERSION
- CLANG_VERSION = ENV['CLANG_VERSION'] || DEFAULT_CLANG_VERSION
-
- 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 += GCC_VERSION + '/prebuilt/' + HOST_PLATFORM
- else
- path_to_toolchain += 'llvm-' + 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(-D__android__ -mandroid --sysroot="#{SYSROOT}") + ARCH_CFLAGS
- ANDROID_LDFLAGS = GCC_COMMON_LDFLAGS + %W(-D__android__ -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