-
Notifications
You must be signed in to change notification settings - Fork 550
/
Copy pathcompile.rake
105 lines (87 loc) · 3.76 KB
/
compile.rake
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
require "rake/extensiontask"
load File.expand_path('../../mysql2.gemspec', __FILE__) unless defined? Mysql2::GEMSPEC
Rake::ExtensionTask.new("mysql2", Mysql2::GEMSPEC) do |ext|
# put binaries into lib/mysql2/ or lib/mysql2/x.y/
ext.lib_dir = File.join 'lib', 'mysql2'
# clean compiled extension
CLEAN.include "#{ext.lib_dir}/*.#{RbConfig::CONFIG['DLEXT']}"
if RUBY_PLATFORM =~ /mswin|mingw/ && !defined?(RubyInstaller)
# Expand the path because the build dir is 3-4 levels deep in tmp/platform/version/
connector_dir = File.expand_path("../../vendor/#{vendor_mysql_dir}", __FILE__)
ext.config_options = ["--with-mysql-dir=#{connector_dir}"]
else
ext.cross_compile = true
ext.cross_platform = ENV['CROSS_PLATFORMS'] ? ENV['CROSS_PLATFORMS'].split(':') : ['x86-mingw32', 'x86-mswin32-60', 'x64-mingw32']
ext.cross_config_options << {
'x86-mingw32' => "--with-mysql-dir=" + File.expand_path("../../vendor/#{vendor_mysql_dir('x86')}", __FILE__),
'x86-mswin32-60' => "--with-mysql-dir=" + File.expand_path("../../vendor/#{vendor_mysql_dir('x86')}", __FILE__),
'x64-mingw32' => "--with-mysql-dir=" + File.expand_path("../../vendor/#{vendor_mysql_dir('x64')}", __FILE__),
}
ext.cross_compiling do |spec|
Rake::Task['lib/mysql2/mysql2.rb'].invoke
# vendor/libmysql.dll is invoked from extconf.rb
Rake::Task['vendor/README'].invoke
# only the source gem has a package dependency - the binary gem ships it's own DLL version
spec.metadata.delete('msys2_mingw_dependencies')
spec.files << 'lib/mysql2/mysql2.rb'
spec.files << 'vendor/libmysql.dll'
spec.files << 'vendor/README'
spec.post_install_message = <<-POST_INSTALL_MESSAGE
======================================================================================================
You've installed the binary version of #{spec.name}.
It was built using MySQL Connector/C version #{CONNECTOR_VERSION}.
It's recommended to use the exact same version to avoid potential issues.
At the time of building this gem, the necessary DLL files were retrieved from:
#{vendor_mysql_url(spec.platform)}
This gem *includes* vendor/libmysql.dll with redistribution notice in vendor/README.
======================================================================================================
POST_INSTALL_MESSAGE
end
end
end
Rake::Task[:spec].prerequisites << :compile
file 'vendor/README' do
connector_dir = File.expand_path("../../vendor/#{vendor_mysql_dir}", __FILE__)
when_writing 'copying Connector/C README' do
cp "#{connector_dir}/README", 'vendor/README'
end
end
file 'lib/mysql2/mysql2.rb' do |t|
name = Mysql2::GEMSPEC.name
File.open(t.name, 'wb') do |f|
f.write <<-END_OF_RUBY
RUBY_VERSION =~ /(\\d+.\\d+)/
require "#{name}/\#{$1}/#{name}"
END_OF_RUBY
end
end
# DevKit task following the example of Luis Lavena's test-ruby-c-extension
task :devkit do
begin
require "devkit"
rescue LoadError
abort "Failed to activate RubyInstaller's DevKit required for compilation."
end
end
if RUBY_PLATFORM =~ /mingw|mswin/
Rake::Task['compile'].prerequisites.unshift 'vendor:mysql' unless defined?(RubyInstaller)
Rake::Task['compile'].prerequisites.unshift 'devkit'
elsif Rake::Task.tasks.map(&:name).include? 'cross'
Rake::Task['cross'].prerequisites.unshift 'vendor:mysql:cross'
end
desc "Build binary gems for Windows with rake-compiler-dock"
task 'gem:windows' do
require 'rake_compiler_dock'
RakeCompilerDock.sh <<-EOT
bundle install
rake clean
rm vendor/libmysql.dll
rake cross native gem CROSS_PLATFORMS=x86-mingw32:x86-mswin32-60
EOT
RakeCompilerDock.sh <<-EOT
bundle install
rake clean
rm vendor/libmysql.dll
rake cross native gem CROSS_PLATFORMS=x64-mingw32
EOT
end