diff --git a/tasks/toolchains/android.rake b/tasks/toolchains/android.rake index 376185762..61eeda8fd 100644 --- a/tasks/toolchains/android.rake +++ b/tasks/toolchains/android.rake @@ -5,9 +5,12 @@ class MRuby::Toolchain::Android DEFAULT_TOOLCHAIN = :clang DEFAULT_NDK_HOMES = %w{ - /usr/local/opt/android-ndk /usr/local/opt/android-sdk/ndk-bundle + /usr/local/opt/android-ndk %LOCALAPPDATA%/Android/android-sdk/ndk-bundle + %LOCALAPPDATA%/Android/android-ndk + ~/Library/Android/sdk/ndk-bundle + ~/Library/Android/ndk } TOOLCHAINS = [:clang] # TODO : Add gcc support @@ -15,7 +18,8 @@ class MRuby::Toolchain::Android ARCHITECTURES = %w{ armeabi armeabi-v7a arm64-v8a x86 x86_64 - } # TODO : Add mips mips64 support + mips mips64 + } class AndroidNDKHomeNotFound < StandardError def message @@ -56,6 +60,41 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter when /mips/ then 'mipsel-linux-android-' end + command + gcc_toolchain_path.join('bin', command).to_s + end + end + + def bin(command) + command = command.to_s + toolchain_path.join('bin', command).to_s + end + + def home_path + @home_path ||= Pathname( + params[:ndk_home] || + ENV['ANDROID_NDK_HOME'] || + DEFAULT_NDK_HOMES.find { |path| + path.gsub! '%LOCALAPPDATA%', ENV['LOCALAPPDATA'] || '%LOCALAPPDATA%' + path.gsub! '\\', '/' + path.gsub! '~', Dir.home || '~' + File.directory?(path) + } || raise(AndroidNDKHomeNotFound) + ) + end + + def toolchain + @toolchain ||= params.fetch(:toolchain){ DEFAULT_TOOLCHAIN } + end + + def toolchain_path + @toolchain_path ||= case toolchain + when :clang + home_path.join('toolchains', 'llvm' , 'prebuilt', host_platform) + end + end + + def gcc_toolchain_path + if @gcc_toolchain_path === nil then prefix = case arch when /armeabi/ then 'arm-linux-androideabi-' when /arm64-v8a/ then 'aarch64-linux-android-' @@ -75,37 +114,9 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter end gcc_toolchain_version = Dir[home_path.join('toolchains', test)].map{|t| t.match(/-(\d+\.\d+)$/); $1.to_f }.max - gcc_toolchain_path = home_path.join('toolchains', prefix + gcc_toolchain_version.to_s, 'prebuilt', host_platform) - gcc_toolchain_path.join('bin', command).to_s + @gcc_toolchain_path = home_path.join('toolchains', prefix + gcc_toolchain_version.to_s, 'prebuilt', host_platform) end - end - - def bin(command) - command = command.to_s - toolchain_path.join('bin', command).to_s - end - - def home_path - @home_path ||= Pathname( - params[:ndk_home] || - ENV['ANDROID_NDK_HOME'] || - DEFAULT_NDK_HOMES.find { |path| - path.gsub! '%LOCALAPPDATA%', ENV['LOCALAPPDATA'] || '%LOCALAPPDATA%' - path.gsub! '\\', '/' - File.directory?(path) - } || raise(AndroidNDKHomeNotFound) - ) - end - - def toolchain - @toolchain ||= params.fetch(:toolchain){ DEFAULT_TOOLCHAIN } - end - - def toolchain_path - @toolchain_path ||= case toolchain - when :clang - home_path.join('toolchains', 'llvm' , 'prebuilt', host_platform) - end + @gcc_toolchain_path end def host_platform @@ -195,7 +206,7 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter flags += %W(-D__android__ --sysroot="#{sysroot}") case toolchain when :clang - flags += %W(-gcc-toolchain #{toolchain_path.to_s}) + flags += %W(-gcc-toolchain "#{gcc_toolchain_path.to_s}") case arch when /armeabi-v7a/ then flags += %W(-target armv7-none-linux-androideabi) when /armeabi/ then flags += %W(-target armv5te-none-linux-androideabi)