summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Rakefile1
-rw-r--r--tasks/mruby_build.rake8
-rw-r--r--tasks/mruby_build_commands.rake47
-rw-r--r--tasks/toolchains/androideabi.rake114
4 files changed, 153 insertions, 17 deletions
diff --git a/Rakefile b/Rakefile
index 9c0711453..ab5e6c6e6 100644
--- a/Rakefile
+++ b/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"
diff --git a/tasks/mruby_build.rake b/tasks/mruby_build.rake
index 10125701e..1afb95334 100644
--- a/tasks/mruby_build.rake
+++ b/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) }
diff --git a/tasks/mruby_build_commands.rake b/tasks/mruby_build_commands.rake
index 1e806e5da..b647ccf98 100644
--- a/tasks/mruby_build_commands.rake
+++ b/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
diff --git a/tasks/toolchains/androideabi.rake b/tasks/toolchains/androideabi.rake
index 9c6d423e2..a69fd1a9d 100644
--- a/tasks/toolchains/androideabi.rake
+++ b/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