Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Improve Android platform support. #975

Merged
merged 9 commits into from

4 participants

@crimsonwoods
  • modify both CFLAGS and LDFLAGS options.
  • Android platform (such as 'android-XX': XX is a number of platform version) can select via environment variable.
  • improve architecture support: armeabi, armeabi-v7a, x86, mips
@masuidrive

@crimsonwoods Could you resolve #979?

@crimsonwoods

i'll try it later, but i have no idea now.
this issue is rooted in the path resolution problem of Cygwin shell, maybe.

@matz
Owner

Tell me when it's done @masuidrive please.

@masuidrive

Sure.

@crimsonwoods

An issue #979 is resolved in my forked repository.

my build platform:

  • windows 7 pro 64bit
  • ruby 1.9.3p385 i386-cygwin
  • android NDK r8d

please try to build 'mruby' on cygwin platform.

@matz
Owner

I assume merging this patch also resolve #979. Thank you!

@matz matz merged commit ad11d31 into mruby:master

1 check passed

Details default The Travis build passed
@mattn

How about to add filename resolver into toolchain?

I prefer that not contains cygwin keyword in Rakefile or some basicaly task files.

@crimsonwoods crimsonwoods deleted the crimsonwoods:modify_build_script branch
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
This page is out of date. Refresh to see the latest.
View
1  Rakefile
@@ -2,6 +2,7 @@
# Build description.
# basic build file for mruby
MRUBY_ROOT = File.dirname(File.expand_path(__FILE__))
+MRUBY_BUILD_HOST_IS_CYGWIN = RUBY_PLATFORM.include?('cygwin')
# load build systems
load "#{MRUBY_ROOT}/tasks/ruby_ext.rake"
View
8 tasks/mruby_build.rake
@@ -128,6 +128,14 @@ module MRuby
end
end
+ def cygwin_filename(name)
+ if name.is_a?(Array)
+ name.flatten.map { |n| cygwin_filename(n) }
+ else
+ '"%s"' % `cygpath -w "#{filename(name)}"`.strip
+ end
+ end
+
def exefile(name)
if name.is_a?(Array)
name.flatten.map { |n| exefile(n) }
View
47 tasks/mruby_build_commands.rake
@@ -4,7 +4,7 @@ module MRuby
class Command
include Rake::DSL
extend Forwardable
- def_delegators :@build, :filename, :objfile, :libfile, :exefile
+ def_delegators :@build, :filename, :objfile, :libfile, :exefile, :cygwin_filename
attr_accessor :build, :command
def initialize(build)
@@ -49,7 +49,11 @@ module MRuby
def all_flags(_defineds=[], _include_paths=[], _flags=[])
define_flags = [defines, _defineds].flatten.map{ |d| option_define % d }
include_path_flags = [include_paths, _include_paths].flatten.map do |f|
- option_include_path % filename(f)
+ if MRUBY_BUILD_HOST_IS_CYGWIN
+ option_include_path % cygwin_filename(f)
+ else
+ option_include_path % filename(f)
+ end
end
[flags, define_flags, include_path_flags, _flags].flatten.join(' ')
end
@@ -61,8 +65,13 @@ module MRuby
option_include_path % filename(f)
end
_pp "CC", infile.relative_path, outfile.relative_path
- _run compile_options, { :flags => all_flags(_defineds, _include_paths, _flags),
- :infile => filename(infile), :outfile => filename(outfile) }
+ if MRUBY_BUILD_HOST_IS_CYGWIN
+ _run compile_options, { :flags => all_flags(_defineds, _include_paths, _flags),
+ :infile => cygwin_filename(infile), :outfile => cygwin_filename(outfile) }
+ else
+ _run compile_options, { :flags => all_flags(_defineds, _include_paths, _flags),
+ :infile => filename(infile), :outfile => filename(outfile) }
+ end
end
def define_rules(build_dir, source_dir='')
@@ -127,7 +136,11 @@ module MRuby
def all_flags(_library_paths=[], _flags=[])
library_path_flags = [library_paths, _library_paths].flatten.map do |f|
- option_library_path % filename(f)
+ if MRUBY_BUILD_HOST_IS_CYGWIN
+ option_library_path % cygwin_filename(f)
+ else
+ option_library_path % filename(f)
+ end
end
[flags, library_path_flags, _flags].flatten.join(' ')
end
@@ -142,11 +155,19 @@ module MRuby
library_path_flags = [library_paths, _library_paths].flatten.map { |f| option_library_path % filename(f) }
_pp "LD", outfile.relative_path
- _run link_options, { :flags => all_flags(_library_paths, _flags),
- :outfile => filename(outfile) , :objs => filename(objfiles).join(' '),
- :flags_before_libraries => [flags_before_libraries, _flags_before_libraries].flatten.join(' '),
- :flags_after_libraries => [flags_after_libraries, _flags_after_libraries].flatten.join(' '),
- :libs => library_flags.join(' ') }
+ if MRUBY_BUILD_HOST_IS_CYGWIN
+ _run link_options, { :flags => all_flags(_library_paths, _flags),
+ :outfile => cygwin_filename(outfile) , :objs => cygwin_filename(objfiles).join(' '),
+ :flags_before_libraries => [flags_before_libraries, _flags_before_libraries].flatten.join(' '),
+ :flags_after_libraries => [flags_after_libraries, _flags_after_libraries].flatten.join(' '),
+ :libs => library_flags.join(' ') }
+ else
+ _run link_options, { :flags => all_flags(_library_paths, _flags),
+ :outfile => filename(outfile) , :objs => filename(objfiles).join(' '),
+ :flags_before_libraries => [flags_before_libraries, _flags_before_libraries].flatten.join(' '),
+ :flags_after_libraries => [flags_after_libraries, _flags_after_libraries].flatten.join(' '),
+ :libs => library_flags.join(' ') }
+ end
end
end
@@ -162,7 +183,11 @@ module MRuby
def run(outfile, objfiles)
FileUtils.mkdir_p File.dirname(outfile)
_pp "AR", outfile.relative_path
- _run archive_options, { :outfile => filename(outfile), :objs => filename(objfiles).join(' ') }
+ if MRUBY_BUILD_HOST_IS_CYGWIN
+ _run archive_options, { :outfile => cygwin_filename(outfile), :objs => cygwin_filename(objfiles).join(' ') }
+ else
+ _run archive_options, { :outfile => filename(outfile), :objs => filename(objfiles).join(' ') }
+ end
end
end
View
114 tasks/toolchains/androideabi.rake
@@ -11,13 +11,115 @@
MRuby::Toolchain.new(:androideabi) do |conf|
toolchain :gcc
- ANDROID_STANDALONE_TOOLCHAIN = ENV['ANDROID_STANDALONE_TOOLCHAIN'] + '/bin/arm-linux-androideabi-'
- SYSROOT = ENV['ANDROID_STANDALONE_TOOLCHAIN'] + '/sysroot'
+ 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
+ if RUBY_PLATFORM.include?('darwin') then
+ HOST_PLATFORM = 'darwin-x86'
+ elsif RUBY_PLATFORM.include?('linux') then
+ HOST_PLATFORM = 'linux-x86'
+ elsif RUBY_PLATFORM.include?('win') then
+ HOST_PLATFORM = 'windows'
+ 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_STANDALONE_TOOLCHAIN + 'gcc'
- cc.flags = [ENV['CFLAGS'] || ['--sysroot ' + SYSROOT]]
+ cc.command = ENV['CC'] || ANDROID_CC
+ cc.flags = [ENV['CFLAGS'] || ANDROID_CFLAGS]
end
- conf.linker.command = ENV['LD'] || ANDROID_STANDALONE_TOOLCHAIN + 'gcc'
- conf.archiver.command = ENV['AR'] || ANDROID_STANDALONE_TOOLCHAIN + 'ar'
+ conf.linker.command = ENV['LD'] || ANDROID_LD
+ conf.linker.flags = [ENV['LDFLAGS'] || ANDROID_LDFLAGS]
+ conf.archiver.command = ENV['AR'] || ANDROID_AR
end
Something went wrong with that request. Please try again.