rake-compiler 1.2.3 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/History.md +14 -0
- data/README.md +74 -63
- data/lib/rake/extensiontask.rb +14 -20
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89347c74f92c88f38e362b44957b4f3995846f9354f3462bd2774e9fab7fe2a9
|
4
|
+
data.tar.gz: 0e074b3563de7228bcf09036527eb2756653e519c3493926fdfeda3b64761b92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d9d1a747ff0ad05422b8bf96de8f5be572f405a66ba8dbcb9a97fd6c4a343358f27de553ab02b9c5674ed52dd6697144dc2b176ec7da3d2eea99ae28f9fc5d4
|
7
|
+
data.tar.gz: 9350f3c428d92e6a9b0a08ecdd0b220043d3990ffb1fcaf33aaf4e9ffd513d0001f0bcf0e9a78964392f135dd9263d45e21b2d8dbe33e74f4582fdafd8387fa4
|
data/History.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
### 1.2.4 / 2023-08-01
|
2
|
+
|
3
|
+
* Enhancements:
|
4
|
+
* GH-221: Enabled syntax highlighting in documents.
|
5
|
+
[Patch by Ryo Nakamura]
|
6
|
+
* GH-202 GH-222: Use environment variables to set install paths.
|
7
|
+
[Reported by Brandon Fish]
|
8
|
+
[Patch by Michael Go]
|
9
|
+
|
10
|
+
* Thanks:
|
11
|
+
* Ryo Nakamura
|
12
|
+
* Brandon Fish
|
13
|
+
* Michael Go
|
14
|
+
|
1
15
|
### 1.2.3 / 2023-05-30
|
2
16
|
|
3
17
|
* Enhancements:
|
data/README.md
CHANGED
@@ -69,17 +69,19 @@ contribute back to your project.
|
|
69
69
|
Now the fun part. It's time to introduce the code to your projects Rakefile
|
70
70
|
to tell it to use rake-compiler to build your extension:
|
71
71
|
|
72
|
-
|
72
|
+
```ruby
|
73
|
+
# File: extconf.rb
|
73
74
|
|
74
|
-
|
75
|
-
|
76
|
-
|
75
|
+
# these lines must exist already
|
76
|
+
require 'mkmf'
|
77
|
+
create_makefile('hello_world')
|
77
78
|
|
78
|
-
|
79
|
+
# File: Rakefile
|
79
80
|
|
80
|
-
|
81
|
+
require 'rake/extensiontask'
|
81
82
|
|
82
|
-
|
83
|
+
Rake::ExtensionTask.new('hello_world')
|
84
|
+
```
|
83
85
|
|
84
86
|
That's it? Yes, that's it! No other lines of code are needed for
|
85
87
|
rake-compiler to work its magic.
|
@@ -93,11 +95,13 @@ below for details.
|
|
93
95
|
If you want to do the same for a JRuby extension written in Java, it's just
|
94
96
|
as easy:
|
95
97
|
|
96
|
-
|
98
|
+
```ruby
|
99
|
+
# File: Rakefile
|
97
100
|
|
98
|
-
|
101
|
+
require 'rake/javaextensiontask'
|
99
102
|
|
100
|
-
|
103
|
+
Rake::JavaExtensionTask.new('hello_world')
|
104
|
+
```
|
101
105
|
|
102
106
|
### The simple process
|
103
107
|
|
@@ -140,19 +144,21 @@ building native gems on Windows systems.
|
|
140
144
|
Creating native gems is really easy with rake-compiler's
|
141
145
|
`Rake::ExtensionTask`:
|
142
146
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
147
|
+
```ruby
|
148
|
+
# somewhere in your Rakefile, define your gem spec
|
149
|
+
spec = Gem::Specification.new do |s|
|
150
|
+
s.name = "my_gem"
|
151
|
+
s.platform = Gem::Platform::RUBY
|
152
|
+
s.extensions = FileList["ext/**/extconf.rb"]
|
153
|
+
end
|
149
154
|
|
150
|
-
|
151
|
-
|
152
|
-
|
155
|
+
# add your default gem packing task
|
156
|
+
Gem::PackageTask.new(spec) do |pkg|
|
157
|
+
end
|
153
158
|
|
154
|
-
|
155
|
-
|
159
|
+
# feed the ExtensionTask with your spec
|
160
|
+
Rake::ExtensionTask.new('hello_world', spec)
|
161
|
+
```
|
156
162
|
|
157
163
|
As expected, you can still build your pure-ruby gem in the usual way
|
158
164
|
(standard output) by running:
|
@@ -209,18 +215,19 @@ Yes you can! While the conventional project structure is recommended, you may
|
|
209
215
|
want, or need, to tweak those conventions. Rake-compiler allows you to customize
|
210
216
|
several settings for `Rake::ExtensionTask`:
|
211
217
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
218
|
+
```ruby
|
219
|
+
Rake::ExtensionTask.new do |ext|
|
220
|
+
ext.name = 'hello_world' # indicate the name of the extension.
|
221
|
+
ext.ext_dir = 'ext/weird_world' # search for 'hello_world' inside it.
|
222
|
+
ext.lib_dir = 'lib/my_lib' # put binaries into this folder.
|
223
|
+
ext.config_script = 'custom_extconf.rb' # use instead of the default 'extconf.rb'.
|
224
|
+
ext.tmp_dir = 'tmp' # temporary folder used during compilation.
|
225
|
+
ext.source_pattern = "*.{c,cpp}" # monitor file changes to allow simple rebuild.
|
226
|
+
ext.config_options << '--with-foo' # supply additional options to configure script.
|
227
|
+
ext.gem_spec = spec # optionally indicate which gem specification
|
228
|
+
# will be used.
|
229
|
+
end
|
230
|
+
```
|
224
231
|
|
225
232
|
### Show me all of the supported configuration options
|
226
233
|
|
@@ -338,30 +345,32 @@ reporting any issues.
|
|
338
345
|
|
339
346
|
Now, you only need specify a few additional options in your extension definition:
|
340
347
|
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
348
|
+
```ruby
|
349
|
+
Rake::ExtensionTask.new('my_extension', gem_spec) do |ext|
|
350
|
+
# enable cross compilation (requires cross compile toolchain)
|
351
|
+
ext.cross_compile = true
|
352
|
+
|
353
|
+
# set a single platform or an array of platforms to target
|
354
|
+
ext.cross_platform = ['x86-mingw32', 'x64-mingw32']
|
355
|
+
|
356
|
+
# cross-compile options will be passed to extconf.rb for each
|
357
|
+
# platform build, with platform-specific options in a hash.
|
358
|
+
ext.cross_config_options << '--with-common-option'
|
359
|
+
ext.cross_config_options << {
|
360
|
+
'x86-mswin32-60' => '--with-some-option',
|
361
|
+
'x64-mingw32' => '--enable-64bits',
|
362
|
+
}
|
363
|
+
ext.cross_config_options << '--with-final-option'
|
364
|
+
|
365
|
+
# perform alterations on the gemspec when cross compiling
|
366
|
+
ext.cross_compiling do |gem_spec|
|
367
|
+
# such as packaging a file that isn't specified in the gemspec
|
368
|
+
gem_spec.files << 'lib/generated_file.rb'
|
369
|
+
# or adding a new installation message
|
370
|
+
gem_spec.post_install_message = "You installed the binary version of this gem!"
|
371
|
+
end
|
372
|
+
end
|
373
|
+
```
|
365
374
|
|
366
375
|
By default, cross compilation targets 'i386-mingw32' which is the default
|
367
376
|
GCC platform for Ruby. MRI Ruby's current official distribution uses
|
@@ -419,12 +428,14 @@ cross compiling from a Linux or OSX host. Patches are welcome if building
|
|
419
428
|
|
420
429
|
Now it's up to you to make your gem load the proper binary at runtime:
|
421
430
|
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
431
|
+
```ruby
|
432
|
+
begin
|
433
|
+
RUBY_VERSION =~ /(\d+\.\d+)/
|
434
|
+
require "#{$1}/my_extension"
|
435
|
+
rescue LoadError
|
436
|
+
require "my_extension"
|
437
|
+
end
|
438
|
+
```
|
428
439
|
|
429
440
|
The above technique will lookup first for 1.8 or 1.9 version of the extension
|
430
441
|
and when not found, will look for the plain extension.
|
data/lib/rake/extensiontask.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "rbconfig"
|
2
|
+
require "shellwords"
|
2
3
|
|
3
4
|
require 'rake/baseextensiontask'
|
4
5
|
require "rubygems/package_task"
|
@@ -79,7 +80,7 @@ module Rake
|
|
79
80
|
end.flatten
|
80
81
|
end
|
81
82
|
|
82
|
-
def make_makefile_cmd(root_path, tmp_path, extconf,
|
83
|
+
def make_makefile_cmd(root_path, tmp_path, extconf, cross_platform) # :nodoc:
|
83
84
|
# include current directory
|
84
85
|
include_dirs = ['.'].concat(@config_includes).uniq.join(File::PATH_SEPARATOR)
|
85
86
|
|
@@ -89,7 +90,7 @@ module Rake
|
|
89
90
|
rel_extconf = abs_extconf.relative_path_from(abs_tmp_path).to_s
|
90
91
|
|
91
92
|
# base command
|
92
|
-
cmd = [Gem.ruby, "-I#{include_dirs}",
|
93
|
+
cmd = [Gem.ruby, "-I#{include_dirs}", rel_extconf]
|
93
94
|
|
94
95
|
# add all the options
|
95
96
|
cmd += @config_options
|
@@ -140,7 +141,6 @@ module Rake
|
|
140
141
|
tmp_path = "#{@tmp_dir}/#{platf}/#{@name}/#{ruby_ver}"
|
141
142
|
stage_path = "#{@tmp_dir}/#{platf}/stage"
|
142
143
|
|
143
|
-
siteconf_path = "#{tmp_path}/.rake-compiler-siteconf.rb"
|
144
144
|
tmp_binary_path = "#{tmp_path}/#{binary_path}"
|
145
145
|
tmp_binary_dir_path = File.dirname(tmp_binary_path)
|
146
146
|
stage_binary_path = "#{stage_path}/#{lib_binary_path}"
|
@@ -158,26 +158,20 @@ module Rake
|
|
158
158
|
directory lib_path
|
159
159
|
directory stage_binary_dir_path
|
160
160
|
|
161
|
-
directory File.dirname(siteconf_path)
|
162
|
-
# Set paths for "make install" destinations
|
163
|
-
file siteconf_path => File.dirname(siteconf_path) do
|
164
|
-
File.open(siteconf_path, "w") do |siteconf|
|
165
|
-
siteconf.puts "require 'rbconfig'"
|
166
|
-
siteconf.puts "require 'mkmf'"
|
167
|
-
siteconf.puts "dest_path = mkintpath(#{File.expand_path(lib_path).dump})"
|
168
|
-
%w[sitearchdir sitelibdir].each do |dir|
|
169
|
-
siteconf.puts "RbConfig::MAKEFILE_CONFIG['#{dir}'] = dest_path"
|
170
|
-
siteconf.puts "RbConfig::CONFIG['#{dir}'] = dest_path"
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
161
|
# copy binary from temporary location to final lib
|
176
162
|
# tmp/extension_name/extension_name.{so,bundle} => lib/
|
177
163
|
task "copy:#{@name}:#{platf}:#{ruby_ver}" => [lib_path, tmp_binary_path, "#{tmp_path}/Makefile"] do
|
178
164
|
# install in lib for native platform only
|
179
165
|
unless for_platform
|
180
|
-
|
166
|
+
relative_lib_path = Pathname(lib_path).relative_path_from(tmp_path)
|
167
|
+
|
168
|
+
make_command_line = Shellwords.shellsplit(make)
|
169
|
+
make_command_line << "install"
|
170
|
+
make_command_line << "sitearchdir=#{relative_lib_path}"
|
171
|
+
make_command_line << "sitelibdir=#{relative_lib_path}"
|
172
|
+
make_command_line << "target_prefix="
|
173
|
+
|
174
|
+
sh(*make_command_line, chdir: tmp_path)
|
181
175
|
end
|
182
176
|
end
|
183
177
|
# copy binary from temporary location to staging directory
|
@@ -207,14 +201,14 @@ Java extension should be preferred.
|
|
207
201
|
|
208
202
|
# makefile depends of tmp_dir and config_script
|
209
203
|
# tmp/extension_name/Makefile
|
210
|
-
file "#{tmp_path}/Makefile" => [tmp_path, extconf
|
204
|
+
file "#{tmp_path}/Makefile" => [tmp_path, extconf] do |t|
|
211
205
|
if t.prerequisites.include?("#{tmp_path}/fake.rb")
|
212
206
|
cross_platform = platf
|
213
207
|
else
|
214
208
|
cross_platform = nil
|
215
209
|
end
|
216
210
|
|
217
|
-
command = make_makefile_cmd(Dir.pwd, tmp_path, extconf,
|
211
|
+
command = make_makefile_cmd(Dir.pwd, tmp_path, extconf, cross_platform)
|
218
212
|
|
219
213
|
chdir tmp_path do
|
220
214
|
sh(*command)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rake-compiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-08-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|