- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-1.3.0
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-1.3.0/tasks/toolchains/android.rake
r321 r331 1 1 class MRuby::Toolchain::Android 2 DEFAULT_ARCH = 'armeabi' 3 DEFAULT_PLATFORM = 'android-14' 4 DEFAULT_TOOLCHAIN = :gcc 2 3 DEFAULT_ARCH = 'armeabi' # TODO : Revise if arch should have a default 4 5 DEFAULT_TOOLCHAIN = :clang 6 5 7 DEFAULT_NDK_HOMES = %w{ 8 /usr/local/opt/android-sdk/ndk-bundle 6 9 /usr/local/opt/android-ndk 10 %LOCALAPPDATA%/Android/android-sdk/ndk-bundle 11 %LOCALAPPDATA%/Android/android-ndk 12 ~/Library/Android/sdk/ndk-bundle 13 ~/Library/Android/ndk 7 14 } 8 TOOLCHAINS = [:gcc, :clang] 15 16 TOOLCHAINS = [:clang, :gcc] 17 9 18 ARCHITECTURES = %w{ 10 19 armeabi armeabi-v7a arm64-v8a 20 x86 x86_64 11 21 mips mips64 12 x86 x86_6413 22 } 14 23 … … 22 31 end 23 32 33 class PlatformDirNotFound < StandardError 34 def message 35 <<-EOM 36 Couldn't find Android NDK platform directories. 37 Set ANDROID_PLATFORM environment variable or set :platform parameter 38 EOM 39 end 40 end 41 24 42 attr_reader :params 25 43 26 44 def initialize(params) 27 45 @params = params 46 end 47 48 def bin_gcc(command) 49 command = command.to_s 50 51 command = case arch 52 when /armeabi/ then 'arm-linux-androideabi-' 53 when /arm64-v8a/ then 'aarch64-linux-android-' 54 when /x86_64/ then 'x86_64-linux-android-' 55 when /x86/ then 'i686-linux-android-' 56 when /mips64/ then 'mips64el-linux-android-' 57 when /mips/ then 'mipsel-linux-android-' 58 end + command 59 60 gcc_toolchain_path.join('bin', command).to_s 61 end 62 63 def bin(command) 64 command = command.to_s 65 toolchain_path.join('bin', command).to_s 28 66 end 29 67 … … 31 69 @home_path ||= Pathname( 32 70 params[:ndk_home] || 33 ENV['ANDROID_NDK_HOME'] || 34 DEFAULT_NDK_HOMES.find{ |path| File.directory?(path) } || 35 raise(AndroidNDKHomeNotFound) 71 ENV['ANDROID_NDK_HOME'] || 72 DEFAULT_NDK_HOMES.find { |path| 73 path.gsub! '%LOCALAPPDATA%', ENV['LOCALAPPDATA'] || '%LOCALAPPDATA%' 74 path.gsub! '\\', '/' 75 path.gsub! '~', Dir.home || '~' 76 File.directory?(path) 77 } || raise(AndroidNDKHomeNotFound) 36 78 ) 37 79 end 38 80 81 def toolchain 82 @toolchain ||= params.fetch(:toolchain){ DEFAULT_TOOLCHAIN } 83 end 84 85 def toolchain_path 86 @toolchain_path ||= case toolchain 87 when :gcc 88 gcc_toolchain_path 89 when :clang 90 home_path.join('toolchains', 'llvm' , 'prebuilt', host_platform) 91 end 92 end 93 94 def gcc_toolchain_path 95 if @gcc_toolchain_path === nil then 96 prefix = case arch 97 when /armeabi/ then 'arm-linux-androideabi-' 98 when /arm64-v8a/ then 'aarch64-linux-android-' 99 when /x86_64/ then 'x86_64-' 100 when /x86/ then 'x86-' 101 when /mips64/ then 'mips64el-linux-android-' 102 when /mips/ then 'mipsel-linux-android-' 103 end 104 105 test = case arch 106 when /armeabi/ then 'arm-linux-androideabi-*' 107 when /arm64-v8a/ then 'aarch64-linux-android-*' 108 when /x86_64/ then 'x86_64-*' 109 when /x86/ then 'x86-*' 110 when /mips64/ then 'mips64el-linux-android-*' 111 when /mips/ then 'mipsel-linux-android-*' 112 end 113 114 gcc_toolchain_version = Dir[home_path.join('toolchains', test)].map{|t| t.match(/-(\d+\.\d+)$/); $1.to_f }.max 115 @gcc_toolchain_path = home_path.join('toolchains', prefix + gcc_toolchain_version.to_s, 'prebuilt', host_platform) 116 end 117 @gcc_toolchain_path 118 end 119 120 def host_platform 121 @host_platform ||= case RUBY_PLATFORM 122 when /cygwin|mswin|mingw|bccwin|wince|emx/i 123 path = home_path.join('toolchains', 'llvm' , 'prebuilt', 'windows*') 124 Dir.glob(path.to_s){ |item| 125 next if File.file?(item) 126 path = Pathname(item) 127 break 128 } 129 path.basename 130 when /x86_64-darwin/i 131 'darwin-x86_64' 132 when /darwin/i 133 'darwin-x86' 134 when /x86_64-linux/i 135 'linux-x86_64' 136 when /linux/i 137 'linux-x86' 138 else 139 raise NotImplementedError, "Unknown host platform (#{RUBY_PLATFORM})" 140 end 141 end 142 39 143 def arch 40 params.fetch(:arch){ DEFAULT_ARCH } 144 @arch ||= (params[:arch] || ENV['ANDROID_ARCH'] || DEFAULT_ARCH).to_s 145 end 146 147 def sysroot 148 @sysroot ||= home_path.join('platforms', platform, 149 case arch 150 when /armeabi/ then 'arch-arm' 151 when /arm64-v8a/ then 'arch-arm64' 152 when /x86_64/ then 'arch-x86_64' 153 when /x86/ then 'arch-x86' 154 when /mips64/ then 'arch-mips64' 155 when /mips/ then 'arch-mips' 156 end 157 ).to_s 41 158 end 42 159 43 160 def platform 44 params.fetch(:platform){ DEFAULT_PLATFORM } 45 end 46 47 def toolchain 48 params.fetch(:toolchain){ DEFAULT_TOOLCHAIN } 49 end 50 51 def toolchain_version 52 params.fetch(:toolchain_version) do 53 test = case toolchain 54 when :gcc 55 case arch 56 when /armeabi/ 57 'arm-linux-androideabi-*' 58 when /arm64/ 59 'aarch64-linux-android-*' 60 when /mips64/ 61 'mips64el-linux-android-*' 62 when /mips/ 63 'mipsel-linux-android-*' 64 when /x86_64/ 65 'x86_64-*' 66 when /x86/ 67 'x86-*' 161 if @platform === nil then 162 @platform = params[:platform] || ENV['ANDROID_PLATFORM'] || nil 163 if @platform === nil 164 Dir.glob(home_path.join('platforms/android-*').to_s){ |item| 165 next if File.file?(item) 166 if @platform === nil 167 @platform = Integer(item.rpartition('-')[2]) 168 else 169 platform = Integer(item.rpartition('-')[2]) 170 @platform = platform > @platform ? platform : @platform 171 end 172 } 173 if @platform === nil 174 raise(PlatformDirNotFound) 175 else 176 @platform = "android-#{@platform}" 68 177 end 69 when :clang 70 'llvm-*' 71 end 72 73 Dir[home_path.join('toolchains',test)].map{|t| t.match(/-(\d+\.\d+)$/); $1.to_f }.max 74 end 75 end 76 77 def toolchain_path 78 prefix = case toolchain 79 when :clang then 'llvm-' 80 when :gcc 81 case arch 82 when /armeabi/ then 'arm-linux-androideabi-' 83 when /arm64/ then 'aarch64-linux-android-' 84 when /x86_64/ then 'x86_64-' 85 when /x86/ then 'x86-' 86 when /mips64/ then 'mips64el-linux-android-' 87 when /mips/ then 'mipsel-linux-android-' 88 end 89 end 90 home_path.join('toolchains', prefix + toolchain_version.to_s, 'prebuilt', host_platform) 91 end 92 93 def sysroot 94 path = case arch 95 when /armeabi/ then 'arch-arm' 96 when /arm64/ then 'arch-arm64' 97 when /x86_64/ then 'arch-x86_64' 98 when /x86/ then 'arch-x86' 99 when /mips64/ then 'arch-mips64' 100 when /mips/ then 'arch-mips' 101 end 102 103 home_path.join('platforms', platform, path).to_s 104 end 105 106 def bin(command) 107 command = command.to_s 108 109 if toolchain == :gcc 110 command = case arch 111 when /armeabi/ then 'arm-linux-androideabi-' 112 when /arm64/ then 'aarch64-linux-android-' 113 when /x86_64/ then 'x86_64-linux-android-' 114 when /x86/ then 'i686-linux-android-' 115 when /mips64/ then 'mips64el-linux-android-' 116 when /mips/ then 'mipsel-linux-android-' 117 end + command 118 end 119 120 toolchain_path.join('bin',command).to_s 178 end 179 end 180 if Integer(@platform.rpartition('-')[2]) < 21 181 case arch 182 when /arm64-v8a/, /x86_64/, /mips64/ 183 raise NotImplementedError, "Platform (#{@platform}) has no implementation for architecture (#{arch})" 184 end 185 end 186 @platform 187 end 188 189 def armeabi_v7a_mfpu 190 @armeabi_v7a_mfpu ||= (params[:mfpu] || 'vfpv3-d16').to_s 191 end 192 193 def armeabi_v7a_mfloat_abi 194 @armeabi_v7a_mfloat_abi ||= (params[:mfloat_abi] || 'softfp').to_s 195 end 196 197 def no_warn_mismatch 198 if %W(soft softfp).include? armeabi_v7a_mfloat_abi 199 '' 200 else 201 ',--no-warn-mismatch' 202 end 121 203 end 122 204 123 205 def cc 124 206 case toolchain 125 when :gcc then bin(:gcc) 126 when :clang then bin(:clang) 127 end 207 when :gcc then bin_gcc('gcc') 208 when :clang then bin('clang') 209 end 210 end 211 212 def ar 213 case toolchain 214 when :gcc then bin_gcc('ar') 215 when :clang then bin_gcc('ar') 216 end 217 end 218 219 def ctarget 220 flags = [] 221 222 case toolchain 223 when :gcc 224 case arch 225 when /armeabi-v7a/ then flags += %W(-march=armv7-a) 226 when /armeabi/ then flags += %W(-march=armv5te) 227 when /arm64-v8a/ then flags += %W(-march=armv8-a) 228 when /x86_64/ then flags += %W(-march=x86-64) 229 when /x86/ then flags += %W(-march=i686) 230 when /mips64/ then flags += %W(-march=mips64r6) 231 when /mips/ then flags += %W(-march=mips32) 232 end 233 when :clang 234 case arch 235 when /armeabi-v7a/ then flags += %W(-target armv7-none-linux-androideabi) 236 when /armeabi/ then flags += %W(-target armv5te-none-linux-androideabi) 237 when /arm64-v8a/ then flags += %W(-target aarch64-none-linux-android) 238 when /x86_64/ then flags += %W(-target x86_64-none-linux-android) 239 when /x86/ then flags += %W(-target i686-none-linux-android) 240 when /mips64/ then flags += %W(-target mips64el-none-linux-android) 241 when /mips/ then flags += %W(-target mipsel-none-linux-android) 242 end 243 end 244 245 case arch 246 when /armeabi-v7a/ then flags += %W(-mfpu=#{armeabi_v7a_mfpu} -mfloat-abi=#{armeabi_v7a_mfloat_abi}) 247 when /armeabi/ then flags += %W(-mtune=xscale -msoft-float) 248 when /arm64-v8a/ then flags += %W() 249 when /x86_64/ then flags += %W() 250 when /x86/ then flags += %W() 251 when /mips64/ then flags += %W(-fmessage-length=0) 252 when /mips/ then flags += %W(-fmessage-length=0) 253 end 254 255 flags 128 256 end 129 257 … … 131 259 flags = [] 132 260 261 flags += %W(-MMD -MP -D__android__ -DANDROID --sysroot="#{sysroot}") 262 flags += ctarget 133 263 case toolchain 134 264 when :gcc 135 flags += %W(-ffunction-sections -funwind-tables -no-canonical-prefixes)136 flags += %W(-D__android__ -mandroid --sysroot="#{sysroot}")137 case arch138 when /arm64/139 flags += %W(-fpic -fstack-protector-strong)140 when 'armeabi-v7a-hard'141 flags += %W(-fpic -fstack-protector-strong -march=armv7-a -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -mfpu=vfpv3-d16)142 when 'armeabi-v7a'143 flags += %W(-fpic -fstack-protector-strong -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16)144 when /arm/145 flags += %W(-fpic -fstack-protector-strong -march=armv5te -mtune=xscale -msoft-float)146 when /mips/147 flags += %W(-fpic -fno-strict-aliasing -finline-functions -fmessage-length=0 -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers)148 when /x86/149 flags += %W(-fstack-protector-strong)150 end151 265 when :clang 152 end 266 flags += %W(-gcc-toolchain "#{gcc_toolchain_path.to_s}" -Wno-invalid-command-line-argument -Wno-unused-command-line-argument) 267 end 268 flags += %W(-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes) 153 269 154 270 flags 155 end156 157 def ld158 cc159 271 end 160 272 161 273 def ldflags 162 274 flags = [] 275 276 flags += %W(--sysroot="#{sysroot}") 277 278 flags 279 end 280 281 def ldflags_before_libraries 282 flags = [] 283 163 284 case toolchain 164 285 when :gcc 165 flags += %W(-no-canonical-prefixes) 166 flags += %W(-D__android__ -mandroid --sysroot="#{sysroot}") 167 case arch 168 when 'armeabi-v7a-hard' 169 flags += %W(-march=armv7-a -Wl,--fix-cortex-a8 -Wl,--no-warn-mismatch -lm_hard) 170 when 'armeabi-v7a' 171 flags += %W(-march=armv7-a -Wl,--fix-cortex-a8) 172 end 173 end 174 286 case arch 287 when /armeabi-v7a/ then flags += %W(-Wl#{no_warn_mismatch}) 288 end 289 when :clang 290 flags += %W(-gcc-toolchain "#{gcc_toolchain_path.to_s}") 291 case arch 292 when /armeabi-v7a/ then flags += %W(-target armv7-none-linux-androideabi -Wl,--fix-cortex-a8#{no_warn_mismatch}) 293 when /armeabi/ then flags += %W(-target armv5te-none-linux-androideabi) 294 when /arm64-v8a/ then flags += %W(-target aarch64-none-linux-android) 295 when /x86_64/ then flags += %W(-target x86_64-none-linux-android) 296 when /x86/ then flags += %W(-target i686-none-linux-android) 297 when /mips64/ then flags += %W(-target mips64el-none-linux-android) 298 when /mips/ then flags += %W(-target mipsel-none-linux-android) 299 end 300 end 301 flags += %W(-no-canonical-prefixes) 302 175 303 flags 176 304 end 177 178 def ar179 case toolchain180 when :gcc then bin(:ar)181 when :clang then bin('llvm-ar')182 end183 end184 185 def host_platform186 case RUBY_PLATFORM187 when /cygwin|mswin|mingw|bccwin|wince|emx/i188 'windows'189 when /x86_64-darwin/i190 'darwin-x86_64'191 when /darwin/i192 'darwin-x86'193 when /x86_64-linux/i194 'linux-x86_64'195 when /linux/i196 'linux-x86'197 else198 raise NotImplementedError, "Unknown host platform (#{RUBY_PLATFORM})"199 end200 end201 305 end 202 306 203 307 MRuby::Toolchain.new(:android) do |conf, params| 204 ndk= MRuby::Toolchain::Android.new(params)205 206 toolchain ndk.toolchain308 android = MRuby::Toolchain::Android.new(params) 309 310 toolchain android.toolchain 207 311 208 312 [conf.cc, conf.cxx, conf.objc, conf.asm].each do |cc| 209 cc.command = ndk.cc 210 cc.flags = ndk.cflags 211 end 212 conf.linker.command = ndk.ld 213 conf.linker.flags = ndk.ldflags 214 conf.archiver.command = ndk.ar 313 cc.command = android.cc 314 cc.flags = android.cflags 315 end 316 317 conf.archiver.command = android.ar 318 conf.linker.command = android.cc 319 conf.linker.flags = android.ldflags 320 conf.linker.flags_before_libraries = android.ldflags_before_libraries 215 321 end 216
Note:
See TracChangeset
for help on using the changeset viewer.