rake-compiler 1.0.6 → 1.1.1
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.txt +48 -0
- data/{README.rdoc → README.md} +144 -117
- data/lib/rake/extensioncompiler.rb +1 -1
- data/lib/rake/extensiontask.rb +1 -0
- data/lib/rake/javaextensiontask.rb +81 -20
- data/spec/lib/rake/javaextensiontask_spec.rb +30 -0
- data/tasks/bin/cross-ruby.rake +13 -35
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8c720116334e8a54ca3029125770c4bec5b7b7a4cf1f51e5b6784a884834934
|
4
|
+
data.tar.gz: b4e8b071bfb222435f4beb1a9f2e4ba321faa36e77a7c1b75519a2650ed4980c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32e025cf3a640534b5f1448cf0d89b45d41825dcf5ea2d0bd5dd5cc5037375206e8955749e95a65bbe9c6b1f66a17ee15703099df3a9785273d1b38e106631c3
|
7
|
+
data.tar.gz: 2eaf2fdad874b8e875233d121d071aaad651d1c98c711f2e55d69141b6e41177dc62bb29bbdfaec19b17b097ce08006eef11e8e279dfa181d043f6ed3de36f6b
|
data/History.txt
CHANGED
@@ -1,3 +1,51 @@
|
|
1
|
+
=== 1.1.1 / 2020-07-10
|
2
|
+
|
3
|
+
* Changes:
|
4
|
+
* Bump the default Java bytecode to 1.7.
|
5
|
+
#172 [Patch by Charles Oliver Nutter]
|
6
|
+
|
7
|
+
* Enhancements:
|
8
|
+
* Add support for finding x86_64 MinGW GCC.
|
9
|
+
#164 [Patch by Lars Kanis]
|
10
|
+
* Strip cross compiled shared library automatically.
|
11
|
+
#165 [Patch by Lars Kanis]
|
12
|
+
|
13
|
+
=== 1.1.0 / 2019-12-25
|
14
|
+
|
15
|
+
* Bugfixes:
|
16
|
+
* Fix a bug that JavaExtenstionTask can't build anything.
|
17
|
+
#163 [Reported by Kai Kuchenbecker]
|
18
|
+
|
19
|
+
=== 1.0.9 / 2019-12-23
|
20
|
+
|
21
|
+
* Changes:
|
22
|
+
* Use "-Xlint" option for JRuby native extension by default.
|
23
|
+
#158 [Patch by Stephen George]
|
24
|
+
|
25
|
+
* Enhancements:
|
26
|
+
* Make customizable compiler Xlint option for JRuby native extension.
|
27
|
+
#118 [Patch by Hiroshi Hatake]
|
28
|
+
* Add support for Ruby 2.7.
|
29
|
+
#161 [Reported by Masaki Hara]
|
30
|
+
|
31
|
+
=== 1.0.8 / 2019-09-21
|
32
|
+
|
33
|
+
* Enhancements:
|
34
|
+
* Added Rake::JavaExtensionTask#encoding= to pass the -encoding option to
|
35
|
+
javac.
|
36
|
+
#157 [Patch by Tiago Dias]
|
37
|
+
|
38
|
+
* Bugfixes:
|
39
|
+
* Drop EOL'd rubyforge_project directive from .gemspec.
|
40
|
+
#155 [Patch by Olle Jonsson]
|
41
|
+
|
42
|
+
=== 1.0.7 / 2019-01-04
|
43
|
+
|
44
|
+
* Bugfixes:
|
45
|
+
* Fix a bug that JRuby class path detection is failed on
|
46
|
+
cross-compilation.
|
47
|
+
#149 #151 [Reported by Chalupa Petr][Patch by Prashant Vithani]
|
48
|
+
|
1
49
|
=== 1.0.6 / 2018-12-23
|
2
50
|
|
3
51
|
* Enhancements:
|
data/{README.rdoc → README.md}
RENAMED
@@ -1,10 +1,10 @@
|
|
1
|
-
|
1
|
+
# What is rake-compiler?
|
2
2
|
|
3
3
|
rake-compiler is first and foremost a productivity tool for Ruby developers.
|
4
4
|
Its goal is to make the busy developer's life easier by simplifying the building
|
5
5
|
and packaging of Ruby extensions by simplifying code and reducing duplication.
|
6
6
|
|
7
|
-
It follows
|
7
|
+
It follows **convention over configuration** by advocating a standardized build and
|
8
8
|
package structure for both C and Java based RubyGems.
|
9
9
|
|
10
10
|
rake-compiler is the result of many hard-won experiences dealing with several
|
@@ -16,7 +16,7 @@ structure often made it very difficult for newcomers to those RubyGems.
|
|
16
16
|
From these challenges, rake-compiler was born with the single-minded goal of
|
17
17
|
making the busy RubyGem developer's life much less difficult.
|
18
18
|
|
19
|
-
|
19
|
+
## Feature Overview
|
20
20
|
|
21
21
|
Some of the benefits rake-compiler provides include:
|
22
22
|
|
@@ -35,18 +35,18 @@ Some of the benefits rake-compiler provides include:
|
|
35
35
|
|
36
36
|
* Simplifies cross platform extension compilation (targeting Windows from Linux).
|
37
37
|
|
38
|
-
|
38
|
+
## OK, I'm sold! Show me how to install it!
|
39
39
|
|
40
40
|
Simple:
|
41
41
|
|
42
|
-
|
42
|
+
$ gem install rake-compiler
|
43
43
|
|
44
|
-
|
44
|
+
## That's easy. How do I use it?
|
45
45
|
|
46
46
|
Now that you have installed rake-compiler, it's time to give your project a
|
47
47
|
standardized structure.
|
48
48
|
|
49
|
-
|
49
|
+
### Using a standardized project structure
|
50
50
|
|
51
51
|
Let's say you want to compile an extension called 'hello_world'. Organizing
|
52
52
|
your project's code tree in the following way will help rake-compiler do
|
@@ -64,7 +64,7 @@ TIP: Having a consistent project directory structure will help developers and
|
|
64
64
|
newcomers find and understand your code, making it easier for them to
|
65
65
|
contribute back to your project.
|
66
66
|
|
67
|
-
|
67
|
+
### Adding the code to enable rake-compiler
|
68
68
|
|
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:
|
@@ -75,7 +75,6 @@ to tell it to use rake-compiler to build your extension:
|
|
75
75
|
require 'mkmf'
|
76
76
|
create_makefile('hello_world')
|
77
77
|
|
78
|
-
|
79
78
|
# File: Rakefile
|
80
79
|
|
81
80
|
require 'rake/extensiontask'
|
@@ -85,8 +84,8 @@ to tell it to use rake-compiler to build your extension:
|
|
85
84
|
That's it? Yes, that's it! No other lines of code are needed for
|
86
85
|
rake-compiler to work its magic.
|
87
86
|
|
88
|
-
Though, you need to make sure the parameter to
|
89
|
-
and
|
87
|
+
Though, you need to make sure the parameter to `create_makefile`
|
88
|
+
and `ExtensionTask.new` are the same or rake-compiler will not mimic
|
90
89
|
the RubyGems standard install process. You can override this standard
|
91
90
|
behaviour if needed, see the instructions for "non-standard project structure"
|
92
91
|
below for details.
|
@@ -100,45 +99,46 @@ as easy:
|
|
100
99
|
|
101
100
|
Rake::JavaExtensionTask.new('hello_world')
|
102
101
|
|
103
|
-
|
102
|
+
### The simple process
|
104
103
|
|
105
|
-
Those
|
104
|
+
Those **two** simple lines of code automatically added the Rake tasks needed to
|
106
105
|
build your 'hello_world' extension. For example, checking the Rake tasks on
|
107
106
|
MRI Ruby 1.8.x/1.9 returns something similar to:
|
108
107
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
108
|
+
$ rake -T
|
109
|
+
(in /home/user/my_extension)
|
110
|
+
rake compile # Compile the extension(s)
|
111
|
+
rake compile:hello_world # Compile just the hello_world extension
|
113
112
|
|
114
|
-
Simply calling
|
113
|
+
Simply calling `compile` like
|
115
114
|
|
116
|
-
|
115
|
+
$ rake compile
|
117
116
|
|
118
117
|
performs the entire compile and build process for you and places the resulting
|
119
|
-
extension inside the
|
118
|
+
extension inside the `lib` directory of your project.
|
120
119
|
|
121
|
-
To pass
|
120
|
+
To pass `dir_config` options to the compilation, add to the command line:
|
122
121
|
|
123
|
-
|
122
|
+
$ rake compile -- --with-foo-[dir|lib|bin|...]=/path/to/foo
|
124
123
|
|
125
124
|
NOTE: Please be aware that building C extensions requires the proper
|
126
125
|
development environment for your Platform, including libraries, headers
|
127
126
|
and build tools. Check your distro / vendor documentation on how to install
|
128
127
|
these development resources.
|
129
128
|
|
130
|
-
NOTE: Building Java extensions requires the
|
129
|
+
NOTE: Building Java extensions requires the `javac`, part of the Java
|
131
130
|
Development Kit (JDK). This should be included by default on Mac OS X, and
|
132
131
|
downloadable from http://java.sun.com for other operating systems.
|
133
132
|
|
134
|
-
|
133
|
+
### Generating native RubyGems
|
135
134
|
|
136
135
|
A common usage scenario for rake-compiler is generating native gems that
|
137
136
|
bundle your extensions. As mentioned above, if you have your development
|
138
137
|
environment configured correctly, the following examples work even when
|
139
138
|
building native gems on Windows systems.
|
140
139
|
|
141
|
-
Creating native gems is really easy with rake-compiler's
|
140
|
+
Creating native gems is really easy with rake-compiler's
|
141
|
+
`Rake::ExtensionTask`:
|
142
142
|
|
143
143
|
# somewhere in your Rakefile, define your gem spec
|
144
144
|
spec = Gem::Specification.new do |s|
|
@@ -157,57 +157,57 @@ Creating native gems is really easy with rake-compiler's Rake::ExtensionTask
|
|
157
157
|
As expected, you can still build your pure-ruby gem in the usual way
|
158
158
|
(standard output) by running:
|
159
159
|
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
160
|
+
$ rake gem
|
161
|
+
(in /projects/oss/my_gem.git)
|
162
|
+
mkdir -p pkg
|
163
|
+
Successfully built RubyGem
|
164
|
+
Name: my_gem
|
165
|
+
Version: 0.1.0
|
166
|
+
File: my_gem-0.1.0.gem
|
167
|
+
mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem
|
168
168
|
|
169
169
|
Plus, rake-compiler tasks give you the extra functionality needed to build
|
170
170
|
native gems by running:
|
171
171
|
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
172
|
+
# rake native gem
|
173
|
+
(... compilation output ...)
|
174
|
+
mkdir -p pkg
|
175
|
+
Successfully built RubyGem
|
176
|
+
Name: my_gem
|
177
|
+
Version: 0.1.0
|
178
|
+
File: my_gem-0.1.0.gem
|
179
|
+
mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem
|
180
|
+
Successfully built RubyGem
|
181
|
+
Name: my_gem
|
182
|
+
Version: 0.1.0
|
183
|
+
File: my_gem-0.1.0-x86-mingw32.gem
|
184
|
+
mv my_gem-0.1.0-x86-mingw32.gem pkg/my_gem-0.1.0-x86-mingw32.gem
|
185
185
|
|
186
186
|
Did you notice that you get two gems for the price of one? How's that for a
|
187
187
|
time saver?
|
188
188
|
|
189
189
|
Similarly, it's just as easy to do the same thing for JRuby extensions:
|
190
190
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
191
|
+
# rake java gem
|
192
|
+
(... compilation output ...)
|
193
|
+
mkdir -p pkg
|
194
|
+
Successfully built RubyGem
|
195
|
+
Name: my_gem
|
196
|
+
Version: 0.1.0
|
197
|
+
File: my_gem-0.1.0.gem
|
198
|
+
mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem
|
199
|
+
Successfully built RubyGem
|
200
|
+
Name: my_gem
|
201
|
+
Version: 0.1.0
|
202
|
+
File: my_gem-0.1.0-java.gem
|
203
|
+
mv my_gem-0.1.0-java.gem pkg/my_gem-0.1.0-java.gem
|
204
204
|
|
205
205
|
|
206
|
-
|
206
|
+
### Great, but can I use a non-standard project structure?
|
207
207
|
|
208
208
|
Yes you can! While the conventional project structure is recommended, you may
|
209
209
|
want, or need, to tweak those conventions. Rake-compiler allows you to customize
|
210
|
-
several settings for
|
210
|
+
several settings for `Rake::ExtensionTask`:
|
211
211
|
|
212
212
|
Rake::ExtensionTask.new do |ext|
|
213
213
|
ext.name = 'hello_world' # indicate the name of the extension.
|
@@ -221,7 +221,34 @@ several settings for Rake::ExtensionTask:
|
|
221
221
|
# will be used.
|
222
222
|
end
|
223
223
|
|
224
|
-
|
224
|
+
|
225
|
+
### Show me all of the supported configuration options
|
226
|
+
|
227
|
+
| Option | Supported By | Description |
|
228
|
+
| -------------------- | --------------------- | ---------------------------------------- |
|
229
|
+
| name | Both | Required. Give the target binary a name. |
|
230
|
+
| gem_spec | Both | [Optional] Indicate which gem specification will be used. |
|
231
|
+
| tmp_dir | Both | [Optional] Temporary folder used during compilation. |
|
232
|
+
| ext_dir | Both | [Optional] Where to search for `name`. Default: `ext/#{@name}`. |
|
233
|
+
| lib_dir | Both | [Optional] Put binaries into this folder. Default: `lib`. |
|
234
|
+
| config_options | Both | [Optional] Supply additional options to configure script. |
|
235
|
+
| source_pattern | Both | [Optional] Monitor file changes to allow simple rebuild. Default for CRuby: `*.{c,cc,cpp}`. Default for Java: `**/*.java`. |
|
236
|
+
| _extra_options_ | ExtensionTask (CRuby) | [Optional] _Any options you add to ARGV on the command line are passed on as complilation flags if they begin with a dash (-)._ |
|
237
|
+
| config_script | ExtensionTask (CRuby) | [Optional] Specify alternate configuration file name when [Adding the code to enable rake-compiler](#adding-the-code-to-enable-rake-compiler). Default: `extconf.rb`. |
|
238
|
+
| cross_compile | ExtensionTask (CRuby) | [Optional] See [Cross compilation - the future is now.](#cross-compilation---the-future-is-now) Default: `false`. |
|
239
|
+
| cross_platform | ExtensionTask (CRuby) | [Optional] See [Cross compilation - the future is now.](#cross-compilation---the-future-is-now) Default: `i386-mingw32`. |
|
240
|
+
| cross_config_options | ExtensionTask (CRuby) | [Optional] See [Cross compilation - the future is now.](#cross-compilation---the-future-is-now) Default: `[]`. |
|
241
|
+
| no_native | ExtensionTask (CRuby) | [Optional] Set to true to prevent non-CRuby platforms from defining native tasks. Default: `false`. |
|
242
|
+
| config_includes | ExtensionTask (CRuby) | [Optional] Specify an Array of paths to include as `-I...:...` includes during compilation. Default: `['.']`. |
|
243
|
+
| classpath | JavaExtensionTask | [Optional] Specify additional classpath paths as an Array. Default: _Uses the current CLASSPATH._ |
|
244
|
+
| debug | JavaExtensionTask | [Optional] Whether to set the debug flag during complication. Default: `false`. |
|
245
|
+
| source_version | JavaExtensionTask | [Optional] The JRE version that your source code requires to compile. Default: `1.6`. |
|
246
|
+
| target_version | JavaExtensionTask | [Optional] The oldest JRE version you want to support. Default: `1.6`. |
|
247
|
+
| encoding | JavaExtensionTask | [Optional] Specify an -encoding option to provide to the compiler. Default: `nil`. |
|
248
|
+
| lint_option | JavaExtensionTask | [Optional] Specify a `-Xlint:___` linting option such as `deprecation`, `all`, `none`, etc. (Run `javac -help -X` to see all available options.) <br> Default: _Simply `-Xlint` is run, which enables recommended warnings._ |
|
249
|
+
|
250
|
+
|
251
|
+
## Cross compilation - the future is now.
|
225
252
|
|
226
253
|
Rake-compiler also provides a standardized way to generate, from either Linux
|
227
254
|
or OSX, extensions and gem binaries for your Windows users!
|
@@ -230,9 +257,9 @@ How can this be you say? Simple, rake-compiler's cross compilation features
|
|
230
257
|
take advantage of GCC's host/target capabilities to build 'target' binaries on
|
231
258
|
different 'host' OS's.
|
232
259
|
|
233
|
-
|
260
|
+
### How do I do this from Linux or OSX?
|
234
261
|
|
235
|
-
|
262
|
+
#### The Easy Way
|
236
263
|
|
237
264
|
Use rake-compiler-dock, a gem that makes use of a virtual machine provisioned with
|
238
265
|
all the necessary build tools. You can add a task to your Rakefile, that
|
@@ -240,17 +267,17 @@ cross-compiles and packages your gem into Windows fat binaries (with 1.8 to 2.2
|
|
240
267
|
and x86/x64 support). See https://github.com/rake-compiler/rake-compiler-dock for more
|
241
268
|
information.
|
242
269
|
|
243
|
-
|
270
|
+
#### The Manual Way
|
244
271
|
|
245
272
|
In addition to having the development tool chain installed (GCC), you also need to
|
246
|
-
install your platform's
|
273
|
+
install your platform's `mingw32` cross compilation package.
|
247
274
|
|
248
275
|
Installation depends upon your operating system/distribution. On Ubuntu and Debian
|
249
|
-
host machines, a simple
|
276
|
+
host machines, a simple `apt-get install mingw32` will be enough.
|
250
277
|
|
251
|
-
On Arch,
|
278
|
+
On Arch, `mingw32` is installed by running `pacman -S mingw32-gcc`
|
252
279
|
|
253
|
-
On OSX, we no longer recommend the usage of MacPorts
|
280
|
+
On OSX, we no longer recommend the usage of MacPorts `mingw32` package because
|
254
281
|
it stagnated in GCC version 3.4.5.
|
255
282
|
|
256
283
|
Instead we recommend you download mingw-w64 automated build packages available at
|
@@ -258,56 +285,56 @@ SourceForge:
|
|
258
285
|
|
259
286
|
http://sourceforge.net/downloads/mingw-w64/
|
260
287
|
|
261
|
-
Browse into
|
288
|
+
Browse into *Toolchains targetting Win32* and then *Automated Builds*.
|
262
289
|
|
263
290
|
Files will be ordered by recency, find the latest one with version 1.0 in it,
|
264
291
|
like this one:
|
265
292
|
|
266
|
-
|
293
|
+
mingw-w32-1.0-bin_i686-darwin_20110422.tar.bz2
|
267
294
|
|
268
295
|
Download and extract. After that, make sure the bin directory is added to the PATH, eg:
|
269
296
|
|
270
|
-
|
297
|
+
export PATH=~/mingw-w64/w32/bin:$PATH
|
271
298
|
|
272
|
-
You can add this to your
|
299
|
+
You can add this to your `.profile` to avoid the repitition.
|
273
300
|
|
274
|
-
|
301
|
+
#### I've got my tool-chain installed, now what?
|
275
302
|
|
276
303
|
First, you need to build Ruby for Windows on your Linux or OSX system.
|
277
304
|
|
278
305
|
Relax, no need to freak out! Let rake-compiler do all the heavy lifting for you:
|
279
306
|
|
280
|
-
|
307
|
+
rake-compiler cross-ruby
|
281
308
|
|
282
309
|
And you're done. It will automatically download, configure and compile the latest
|
283
|
-
stable version of Ruby for Windows, and place it into your
|
310
|
+
stable version of Ruby for Windows, and place it into your `~/.rake-compiler`
|
284
311
|
directory.
|
285
312
|
|
286
|
-
This will create
|
287
|
-
knows where to find the
|
313
|
+
This will create `~/.rake-compiler/config.yml` file so that rake-compiler
|
314
|
+
knows where to find the `rbconfig.rb` file that matches the Ruby version
|
288
315
|
on the Windows host system you're cross-compiling for. An example:
|
289
316
|
|
290
|
-
|
317
|
+
# File: ~/.rake-compiler/config.yml
|
291
318
|
|
292
|
-
|
293
|
-
|
294
|
-
|
319
|
+
rbconfig-x86-mingw32-1.8.6: /path/to/ruby-1.8.6/rbconfig.rb
|
320
|
+
rbconfig-x86-mingw32-1.8.7: /path/to/ruby-1.8.7/rbconfig.rb
|
321
|
+
rbconfig-x86-mingw32-1.9.2: /path/to/ruby-1.9.2/rbconfig.rb
|
295
322
|
|
296
323
|
If, instead, you want to build a different Ruby version than the default one, please
|
297
|
-
supply a
|
324
|
+
supply a `VERSION`:
|
298
325
|
|
299
|
-
|
326
|
+
rake-compiler cross-ruby VERSION=1.8.6-p114
|
300
327
|
|
301
328
|
If you, like me, have multiple versions of MinGW packages installed, you can
|
302
329
|
specify the HOST that will be used to cross compile Ruby:
|
303
330
|
|
304
|
-
|
331
|
+
rake-compiler cross-ruby HOST=x86-mingw32 # (OSX mingw32 port)
|
305
332
|
|
306
333
|
The host will vary depending on provider (mingw32 versus mingw-w64 projects).
|
307
334
|
Please consult the documentation and website of the MinGW package provider before
|
308
335
|
reporting any issues.
|
309
336
|
|
310
|
-
|
337
|
+
#### OK, let's cross compile some gems!
|
311
338
|
|
312
339
|
Now, you only need specify a few additional options in your extension definition:
|
313
340
|
|
@@ -338,53 +365,53 @@ Now, you only need specify a few additional options in your extension definition
|
|
338
365
|
|
339
366
|
By default, cross compilation targets 'i386-mingw32' which is the default
|
340
367
|
GCC platform for Ruby. MRI Ruby's current official distribution uses
|
341
|
-
|
342
|
-
|
343
|
-
Windows targets, respectively. Note that
|
344
|
-
are synonymous here;
|
368
|
+
`i386-mswin32-60`. The RubyInstaller distribution uses
|
369
|
+
`x86-mingw32` and `x64-mingw32` for 32-bit and 64-bit
|
370
|
+
Windows targets, respectively. Note that `i386` and `x86`
|
371
|
+
are synonymous here; `x86` is preferred going forward.
|
345
372
|
|
346
|
-
The format for
|
347
|
-
hashes. Hashes will be fetched for each value of
|
373
|
+
The format for `cross_config_options` is an array of strings and
|
374
|
+
hashes. Hashes will be fetched for each value of `cross_platform`
|
348
375
|
as the build iterates, or ignored if there is no value for that platform.
|
349
376
|
You can mix-and-match strings and hashes to get desired option ordering.
|
350
377
|
|
351
|
-
|
378
|
+
#### Warning, magician about to do some tricks, don't blink!
|
352
379
|
|
353
380
|
Cross compiling is still very simple:
|
354
381
|
|
355
|
-
|
382
|
+
rake cross compile
|
356
383
|
|
357
384
|
And now, building gems for your Windows users is just 6 more letters:
|
358
385
|
|
359
|
-
|
386
|
+
rake cross native gem
|
360
387
|
|
361
388
|
And you're done, yeah.
|
362
389
|
|
363
|
-
|
390
|
+
#### But wait, there's more
|
364
391
|
|
365
392
|
You can specify which version of Ruby to build the extension against:
|
366
393
|
|
367
|
-
|
394
|
+
rake cross compile RUBY_CC_VERSION=1.8.6
|
368
395
|
|
369
|
-
For example, if you installed
|
396
|
+
For example, if you installed `1.9.2`, you can do:
|
370
397
|
|
371
|
-
|
398
|
+
rake cross compile RUBY_CC_VERSION=1.9.2
|
372
399
|
|
373
400
|
Even better, you can target multiple versions (ie. 1.8.6 and 1.9.2) in
|
374
401
|
the same gem via:
|
375
402
|
|
376
|
-
|
403
|
+
rake cross compile RUBY_CC_VERSION=1.8.6:1.9.2
|
377
404
|
|
378
405
|
And better yet, you can bundle both binary extensions into one so-called "fat"
|
379
406
|
gem via:
|
380
407
|
|
381
|
-
|
408
|
+
rake cross native gem RUBY_CC_VERSION=1.8.6:1.9.2
|
382
409
|
|
383
410
|
That will place binaries for both the 1.8 and 1.9 versions of your Ruby
|
384
|
-
extensions inside your project's
|
411
|
+
extensions inside your project's `lib_dir` directory:
|
385
412
|
|
386
|
-
|
387
|
-
|
413
|
+
lib/1.8/my_extension.so
|
414
|
+
lib/1.9/my_extension.so
|
388
415
|
|
389
416
|
NOTE: building "fat" gems is currently only supported by rake-compiler when
|
390
417
|
cross compiling from a Linux or OSX host. Patches are welcome if building
|
@@ -392,12 +419,12 @@ cross compiling from a Linux or OSX host. Patches are welcome if building
|
|
392
419
|
|
393
420
|
Now it's up to you to make your gem load the proper binary at runtime:
|
394
421
|
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
422
|
+
begin
|
423
|
+
RUBY_VERSION =~ /(\d+\.\d+)/
|
424
|
+
require "#{$1}/my_extension"
|
425
|
+
rescue LoadError
|
426
|
+
require "my_extension"
|
427
|
+
end
|
401
428
|
|
402
429
|
The above technique will lookup first for 1.8 or 1.9 version of the extension
|
403
430
|
and when not found, will look for the plain extension.
|
@@ -406,7 +433,7 @@ This approach catch the cases of provided fat binaries or gems compiled by the
|
|
406
433
|
end user installing the gem. It has also been implemented successfully in
|
407
434
|
several projects.
|
408
435
|
|
409
|
-
|
436
|
+
## What are you talking about? (Give me examples)
|
410
437
|
|
411
438
|
I know all the above sounds like a complete foreign language (it does even for me!).
|
412
439
|
So, what if I show you some examples?
|
@@ -416,19 +443,19 @@ projects and how they use rake-compiler.
|
|
416
443
|
|
417
444
|
http://github.com/rake-compiler/rake-compiler/wiki/projects-using-rake-compiler
|
418
445
|
|
419
|
-
|
446
|
+
## Future
|
420
447
|
|
421
448
|
rake-compiler is a work in progress and we appreciate any and all feedback
|
422
449
|
during the development of it! (and contributions too!)
|
423
450
|
|
424
451
|
You can find more information about rake-compiler:
|
425
452
|
|
426
|
-
*
|
427
|
-
*
|
428
|
-
*
|
429
|
-
*
|
453
|
+
* GitHub: https://github.com/rake-compiler/rake-compiler
|
454
|
+
* Issues: https://github.com/rake-compiler/rake-compiler/issues
|
455
|
+
* Docs: http://rubydoc.info/gems/rake-compiler
|
456
|
+
* Wiki: https://github.com/rake-compiler/rake-compiler/wiki
|
430
457
|
|
431
|
-
|
458
|
+
## Disclaimer
|
432
459
|
|
433
460
|
If you have any trouble, don't hesitate to contact the author. As always,
|
434
461
|
I'm not going to say "Use at your own risk" because I don't want this library
|
@@ -37,7 +37,7 @@ module Rake
|
|
37
37
|
paths = ENV['PATH'].split(File::PATH_SEPARATOR)
|
38
38
|
|
39
39
|
# the pattern to look into (captures *nix and windows executables)
|
40
|
-
pattern = "{mingw32-,i?86*mingw*}gcc{,.*}"
|
40
|
+
pattern = "{mingw32-,i?86*mingw*,x86*mingw*}gcc{,.*}"
|
41
41
|
|
42
42
|
@mingw_gcc_executable = paths.find do |path|
|
43
43
|
# cleanup paths before globbing
|
data/lib/rake/extensiontask.rb
CHANGED
@@ -17,6 +17,11 @@ module Rake
|
|
17
17
|
# Generate class files for specific VM version
|
18
18
|
attr_accessor :target_version
|
19
19
|
|
20
|
+
attr_accessor :encoding
|
21
|
+
|
22
|
+
# Specify lint option
|
23
|
+
attr_accessor :lint_option
|
24
|
+
|
20
25
|
def platform
|
21
26
|
@platform ||= 'java'
|
22
27
|
end
|
@@ -29,10 +34,12 @@ module Rake
|
|
29
34
|
super
|
30
35
|
@source_pattern = '**/*.java'
|
31
36
|
@classpath = nil
|
32
|
-
@java_compiling = nil
|
33
37
|
@debug = false
|
34
|
-
@source_version = '1.
|
35
|
-
@target_version = '1.
|
38
|
+
@source_version = '1.7'
|
39
|
+
@target_version = '1.7'
|
40
|
+
@encoding = nil
|
41
|
+
@java_compiling = nil
|
42
|
+
@lint_option = nil
|
36
43
|
end
|
37
44
|
|
38
45
|
def define
|
@@ -92,10 +99,19 @@ execute the Rake compilation task using the JRuby interpreter.
|
|
92
99
|
EOF
|
93
100
|
warn_once(not_jruby_compile_msg) unless defined?(JRUBY_VERSION)
|
94
101
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
102
|
+
javac_command_line = [
|
103
|
+
"javac",
|
104
|
+
"-target", @target_version,
|
105
|
+
"-source", @source_version,
|
106
|
+
java_lint_arg,
|
107
|
+
"-d", tmp_path,
|
108
|
+
]
|
109
|
+
javac_command_line.concat(java_encoding_args)
|
110
|
+
javac_command_line.concat(java_extdirs_args)
|
111
|
+
javac_command_line.concat(java_classpath_args)
|
112
|
+
javac_command_line << "-g" if @debug
|
113
|
+
javac_command_line.concat(source_files)
|
114
|
+
sh(*javac_command_line)
|
99
115
|
|
100
116
|
# Checkpoint file
|
101
117
|
touch "#{tmp_path}/.build"
|
@@ -185,24 +201,36 @@ execute the Rake compilation task using the JRuby interpreter.
|
|
185
201
|
end
|
186
202
|
|
187
203
|
#
|
188
|
-
# Discover Java Extension Directories and build an extdirs
|
204
|
+
# Discover Java Extension Directories and build an extdirs arguments
|
189
205
|
#
|
190
|
-
def
|
206
|
+
def java_extdirs_args
|
191
207
|
extdirs = Java::java.lang.System.getProperty('java.ext.dirs') rescue nil
|
192
|
-
extdirs
|
193
|
-
|
208
|
+
extdirs ||= ENV['JAVA_EXT_DIR']
|
209
|
+
if extdirs.nil?
|
210
|
+
[]
|
211
|
+
else
|
212
|
+
["-extdirs", extdirs]
|
213
|
+
end
|
194
214
|
end
|
195
215
|
|
196
216
|
#
|
197
|
-
#
|
217
|
+
# Build an encoding arguments
|
198
218
|
#
|
199
|
-
|
200
|
-
|
219
|
+
def java_encoding_args
|
220
|
+
if @encoding.nil?
|
221
|
+
[]
|
222
|
+
else
|
223
|
+
["-encoding", @encoding]
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
#
|
228
|
+
# Discover the Java/JRuby classpath and build a classpath arguments
|
201
229
|
#
|
202
230
|
# Copied verbatim from the ActiveRecord-JDBC project. There are a small myriad
|
203
231
|
# of ways to discover the Java classpath correctly.
|
204
232
|
#
|
205
|
-
def
|
233
|
+
def java_classpath_args
|
206
234
|
jruby_cpath = nil
|
207
235
|
if RUBY_PLATFORM =~ /java/
|
208
236
|
begin
|
@@ -212,16 +240,49 @@ execute the Rake compilation task using the JRuby interpreter.
|
|
212
240
|
rescue => e
|
213
241
|
end
|
214
242
|
end
|
243
|
+
|
244
|
+
# jruby_cpath might not be present from Java-9 onwards as it removes
|
245
|
+
# sun.boot.class.path. Check if JRUBY_HOME is set as env variable and try
|
246
|
+
# to find jruby.jar under JRUBY_HOME
|
247
|
+
unless jruby_cpath
|
248
|
+
jruby_home = ENV['JRUBY_HOME']
|
249
|
+
if jruby_home
|
250
|
+
candidate = File.join(jruby_home, 'lib', 'jruby.jar')
|
251
|
+
jruby_cpath = candidate if File.exist?(candidate)
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
# JRUBY_HOME is not necessarily set in JRuby-9.x
|
256
|
+
# Find the libdir from RbConfig::CONFIG and find jruby.jar under the
|
257
|
+
# found lib path
|
215
258
|
unless jruby_cpath
|
216
259
|
libdir = RbConfig::CONFIG['libdir']
|
217
|
-
if libdir.start_with?
|
218
|
-
raise 'Cannot build with jruby-complete'
|
260
|
+
if libdir.start_with?("uri:classloader:")
|
261
|
+
raise 'Cannot build with jruby-complete from Java 9 onwards'
|
219
262
|
end
|
220
|
-
|
263
|
+
candidate = File.join(libdir, "jruby.jar")
|
264
|
+
jruby_cpath = candidate if File.exist?(candidate)
|
265
|
+
end
|
266
|
+
|
267
|
+
unless jruby_cpath
|
268
|
+
raise "Could not find jruby.jar. Please set JRUBY_HOME or use jruby in rvm"
|
269
|
+
end
|
270
|
+
|
271
|
+
if @classpath and @classpath.size > 0
|
272
|
+
jruby_cpath = [jruby_cpath, *@classpath].join(File::PATH_SEPARATOR)
|
221
273
|
end
|
222
|
-
jruby_cpath
|
223
|
-
jruby_cpath ? "-cp \"#{jruby_cpath}\"" : ""
|
274
|
+
["-cp", jruby_cpath]
|
224
275
|
end
|
225
276
|
|
277
|
+
#
|
278
|
+
# Convert a `-Xlint:___` linting option such as `deprecation` into a full javac argument, such as `-Xlint:deprecation`.
|
279
|
+
#
|
280
|
+
# @return [String] Default: _Simply `-Xlint` is run, which enables recommended warnings.
|
281
|
+
#
|
282
|
+
def java_lint_arg
|
283
|
+
return '-Xlint' unless @lint_option
|
284
|
+
|
285
|
+
"-Xlint:#{@lint_option}"
|
286
|
+
end
|
226
287
|
end
|
227
288
|
end
|
@@ -76,9 +76,14 @@ describe Rake::JavaExtensionTask do
|
|
76
76
|
@ext.config_options.should be_empty
|
77
77
|
end
|
78
78
|
|
79
|
+
it 'should have no lint option preset to delegate' do
|
80
|
+
@ext.lint_option.should be_falsey
|
81
|
+
end
|
82
|
+
|
79
83
|
it 'should default to Java platform' do
|
80
84
|
@ext.platform.should == 'java'
|
81
85
|
end
|
86
|
+
end
|
82
87
|
|
83
88
|
context '(tasks)' do
|
84
89
|
before :each do
|
@@ -165,6 +170,31 @@ describe Rake::JavaExtensionTask do
|
|
165
170
|
end
|
166
171
|
end
|
167
172
|
end
|
173
|
+
|
174
|
+
context 'A custom extension' do
|
175
|
+
let(:extension) do
|
176
|
+
Rake::JavaExtensionTask.new('extension_two') do |ext|
|
177
|
+
ext.lint_option = lint_option if lint_option
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
context 'without a specified lint option' do
|
182
|
+
let(:lint_option) { nil }
|
183
|
+
|
184
|
+
it 'should honor the lint option' do
|
185
|
+
(extension.lint_option).should be_falsey
|
186
|
+
(extension.send :java_lint_arg).should eq '-Xlint'
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
context "with a specified lint option of 'deprecated'" do
|
191
|
+
let(:lint_option) { 'deprecated'.freeze }
|
192
|
+
|
193
|
+
it 'should honor the lint option' do
|
194
|
+
(extension.lint_option).should eq lint_option
|
195
|
+
(extension.send :java_lint_arg).should eq '-Xlint:deprecated'
|
196
|
+
end
|
197
|
+
end
|
168
198
|
end
|
169
199
|
end
|
170
200
|
private
|
data/tasks/bin/cross-ruby.rake
CHANGED
@@ -58,13 +58,16 @@ MINGW_TARGET = MINGW_HOST.gsub('msvc', '')
|
|
58
58
|
ENV.delete(var)
|
59
59
|
end
|
60
60
|
|
61
|
+
source_dir = "#{USER_HOME}/sources/#{RUBY_CC_VERSION}"
|
62
|
+
build_dir = "#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}"
|
63
|
+
|
61
64
|
# define a location where sources will be stored
|
62
|
-
directory
|
63
|
-
directory
|
65
|
+
directory source_dir
|
66
|
+
directory build_dir
|
64
67
|
|
65
68
|
# clean intermediate files and folders
|
66
|
-
CLEAN.include(
|
67
|
-
CLEAN.include(
|
69
|
+
CLEAN.include(source_dir)
|
70
|
+
CLEAN.include(build_dir)
|
68
71
|
|
69
72
|
# remove the final products and sources
|
70
73
|
CLOBBER.include("#{USER_HOME}/sources")
|
@@ -87,36 +90,12 @@ end
|
|
87
90
|
|
88
91
|
# Extract the sources
|
89
92
|
source_file = RUBY_SOURCE ? RUBY_SOURCE.split('/').last : "#{RUBY_CC_VERSION}.tar.bz2"
|
90
|
-
file
|
93
|
+
file source_dir => ["#{USER_HOME}/sources/#{source_file}"] do |t|
|
91
94
|
chdir File.dirname(t.name) do
|
92
95
|
t.prerequisites.each { |f| sh "tar xf #{File.basename(f)}" }
|
93
96
|
end
|
94
97
|
end
|
95
98
|
|
96
|
-
# backup makefile.in
|
97
|
-
file "#{USER_HOME}/sources/#{RUBY_CC_VERSION}/Makefile.in.bak" => ["#{USER_HOME}/sources/#{RUBY_CC_VERSION}"] do |t|
|
98
|
-
cp "#{USER_HOME}/sources/#{RUBY_CC_VERSION}/Makefile.in", t.name
|
99
|
-
end
|
100
|
-
|
101
|
-
# correct the makefiles
|
102
|
-
file "#{USER_HOME}/sources/#{RUBY_CC_VERSION}/Makefile.in" => ["#{USER_HOME}/sources/#{RUBY_CC_VERSION}/Makefile.in.bak"] do |t|
|
103
|
-
content = File.open(t.name, 'rb') { |f| f.read }
|
104
|
-
|
105
|
-
out = ""
|
106
|
-
|
107
|
-
content.each_line do |line|
|
108
|
-
if line =~ /^\s*ALT_SEPARATOR =/
|
109
|
-
out << "\t\t ALT_SEPARATOR = \"\\\\\\\\\"; \\\n"
|
110
|
-
else
|
111
|
-
out << line
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
when_writing("Patching Makefile.in") {
|
116
|
-
File.open(t.name, 'wb') { |f| f.write(out) }
|
117
|
-
}
|
118
|
-
end
|
119
|
-
|
120
99
|
task :mingw32 do
|
121
100
|
unless MINGW_HOST then
|
122
101
|
warn "You need to install mingw32 cross compile functionality to be able to continue."
|
@@ -126,8 +105,7 @@ task :mingw32 do
|
|
126
105
|
end
|
127
106
|
|
128
107
|
# generate the makefile in a clean build location
|
129
|
-
file "#{
|
130
|
-
"#{USER_HOME}/sources/#{RUBY_CC_VERSION}/Makefile.in"] do |t|
|
108
|
+
file "#{build_dir}/Makefile" => [build_dir, source_dir] do |t|
|
131
109
|
|
132
110
|
options = [
|
133
111
|
"--host=#{MINGW_HOST}",
|
@@ -135,7 +113,8 @@ file "#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}/Makefile" => ["#{USER
|
|
135
113
|
"--build=#{RUBY_BUILD}",
|
136
114
|
'--enable-shared',
|
137
115
|
'--disable-install-doc',
|
138
|
-
'--with-ext='
|
116
|
+
'--with-ext=',
|
117
|
+
'LDFLAGS=-pipe -s',
|
139
118
|
]
|
140
119
|
|
141
120
|
# Force Winsock2 for Ruby 1.8, 1.9 defaults to it
|
@@ -149,14 +128,14 @@ file "#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}/Makefile" => ["#{USER
|
|
149
128
|
end
|
150
129
|
|
151
130
|
# make
|
152
|
-
file "#{
|
131
|
+
file "#{build_dir}/ruby.exe" => ["#{build_dir}/Makefile"] do |t|
|
153
132
|
chdir File.dirname(t.prerequisites.first) do
|
154
133
|
sh MAKE
|
155
134
|
end
|
156
135
|
end
|
157
136
|
|
158
137
|
# make install
|
159
|
-
file "#{USER_HOME}/ruby/#{MINGW_HOST}/#{RUBY_CC_VERSION}/bin/ruby.exe" => ["#{
|
138
|
+
file "#{USER_HOME}/ruby/#{MINGW_HOST}/#{RUBY_CC_VERSION}/bin/ruby.exe" => ["#{build_dir}/ruby.exe"] do |t|
|
160
139
|
chdir File.dirname(t.prerequisites.first) do
|
161
140
|
sh "#{MAKE} install"
|
162
141
|
end
|
@@ -210,4 +189,3 @@ end
|
|
210
189
|
|
211
190
|
desc "Build #{RUBY_CC_VERSION} suitable for cross-platform development."
|
212
191
|
task 'cross-ruby' => [:mingw32, :install, 'update-config']
|
213
|
-
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rake-compiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
8
8
|
- Luis Lavena
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-07-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -77,14 +77,14 @@ executables:
|
|
77
77
|
- rake-compiler
|
78
78
|
extensions: []
|
79
79
|
extra_rdoc_files:
|
80
|
-
- README.
|
80
|
+
- README.md
|
81
81
|
- LICENSE.txt
|
82
82
|
- History.txt
|
83
83
|
files:
|
84
84
|
- Gemfile
|
85
85
|
- History.txt
|
86
86
|
- LICENSE.txt
|
87
|
-
- README.
|
87
|
+
- README.md
|
88
88
|
- Rakefile
|
89
89
|
- appveyor.yml
|
90
90
|
- bin/rake-compiler
|
@@ -126,10 +126,10 @@ homepage: https://github.com/rake-compiler/rake-compiler
|
|
126
126
|
licenses:
|
127
127
|
- MIT
|
128
128
|
metadata: {}
|
129
|
-
post_install_message:
|
129
|
+
post_install_message:
|
130
130
|
rdoc_options:
|
131
131
|
- "--main"
|
132
|
-
- README.
|
132
|
+
- README.md
|
133
133
|
- "--title"
|
134
134
|
- rake-compiler -- Documentation
|
135
135
|
require_paths:
|
@@ -145,8 +145,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
145
|
- !ruby/object:Gem::Version
|
146
146
|
version: 1.8.23
|
147
147
|
requirements: []
|
148
|
-
rubygems_version: 3.0.
|
149
|
-
signing_key:
|
148
|
+
rubygems_version: 3.2.0.pre1
|
149
|
+
signing_key:
|
150
150
|
specification_version: 4
|
151
151
|
summary: Rake-based Ruby Extension (C, Java) task generator.
|
152
152
|
test_files: []
|