File: androideabi.rake

package info (click to toggle)
mruby 1.0.0%2B20141015%2Bgitb4cc962c-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,408 kB
  • ctags: 3,526
  • sloc: ansic: 25,319; ruby: 10,638; yacc: 5,738; sh: 14; makefile: 12
file content (130 lines) | stat: -rw-r--r-- 4,922 bytes parent folder | download
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
126
127
128
129
130
# 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
    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 += 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