summaryrefslogtreecommitdiffhomepage
path: root/tasks/toolchains/androideabi.rake
blob: 9464530fc3449542dc89dbeabb60a468e97f4e01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# 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
    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_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