Hello community, here is the log from the commit of package rubygem-rake-compiler for openSUSE:Factory checked in at 2020-03-07 21:39:38 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-rake-compiler (Old) and /work/SRC/openSUSE:Factory/.rubygem-rake-compiler.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-rake-compiler" Sat Mar 7 21:39:38 2020 rev:22 rq:773841 version:1.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-rake-compiler/rubygem-rake-compiler.changes 2019-03-04 09:21:08.368592730 +0100 +++ /work/SRC/openSUSE:Factory/.rubygem-rake-compiler.new.26092/rubygem-rake-compiler.changes 2020-03-07 21:39:42.140331452 +0100 @@ -1,0 +2,35 @@ +Mon Feb 10 15:31:09 UTC 2020 - Stephan Kulow <co...@suse.com> + +- updated to version 1.1.0 + see installed History.txt + + === 1.1.0 / 2012-12-25 + + * Bugfixes: + * Fix a bug that JavaExtenstionTask can't build anything. + #163 [Reported by Kai Kuchenbecker] + + === 1.0.9 / 2012-12-23 + + * Changes: + * Use "-Xlint" option for JRuby native extension by default. + #158 [Patch by Stephen George] + + * Enhancements: + * Make customizable compiler Xlint option for JRuby native extension. + #118 [Patch by Hiroshi Hatake] + * Add support for Ruby 2.7. + #161 [Reported by Masaki Hara] + + === 1.0.8 / 2019-09-21 + + * Enhancements: + * Added Rake::JavaExtensionTask#encoding= to pass the -encoding option to + javac. + #157 [Patch by Tiago Dias] + + * Bugfixes: + * Drop EOL'd rubyforge_project directive from .gemspec. + #155 [Patch by Olle Jonsson] + +------------------------------------------------------------------- Old: ---- rake-compiler-1.0.7.gem New: ---- rake-compiler-1.1.0.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-rake-compiler.spec ++++++ --- /var/tmp/diff_new_pack.gAqfoY/_old 2020-03-07 21:39:43.132332121 +0100 +++ /var/tmp/diff_new_pack.gAqfoY/_new 2020-03-07 21:39:43.132332121 +0100 @@ -1,7 +1,7 @@ # # spec file for package rubygem-rake-compiler # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -24,7 +24,7 @@ # Name: rubygem-rake-compiler -Version: 1.0.7 +Version: 1.1.0 Release: 0 %define mod_name rake-compiler %define mod_full_name %{mod_name}-%{version} @@ -34,7 +34,7 @@ BuildRequires: %{rubygem rdoc > 3.10} BuildRequires: ruby-macros >= 5 BuildRequires: update-alternatives -Url: https://github.com/rake-compiler/rake-compiler +URL: https://github.com/rake-compiler/rake-compiler Source: https://rubygems.org/gems/%{mod_full_name}.gem Source1: gem2rpm.yml Summary: Rake-based Ruby Extension (C, Java) task generator @@ -53,7 +53,7 @@ %install %gem_install \ --symlink-binaries \ - --doc-files="History.txt LICENSE.txt README.rdoc" \ + --doc-files="History.txt LICENSE.txt README.md" \ -f %gem_packages ++++++ rake-compiler-1.0.7.gem -> rake-compiler-1.1.0.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/History.txt new/History.txt --- old/History.txt 2019-01-03 23:22:56.000000000 +0100 +++ new/History.txt 2019-12-24 22:04:19.000000000 +0100 @@ -1,3 +1,32 @@ +=== 1.1.0 / 2012-12-25 + +* Bugfixes: + * Fix a bug that JavaExtenstionTask can't build anything. + #163 [Reported by Kai Kuchenbecker] + +=== 1.0.9 / 2012-12-23 + +* Changes: + * Use "-Xlint" option for JRuby native extension by default. + #158 [Patch by Stephen George] + +* Enhancements: + * Make customizable compiler Xlint option for JRuby native extension. + #118 [Patch by Hiroshi Hatake] + * Add support for Ruby 2.7. + #161 [Reported by Masaki Hara] + +=== 1.0.8 / 2019-09-21 + +* Enhancements: + * Added Rake::JavaExtensionTask#encoding= to pass the -encoding option to + javac. + #157 [Patch by Tiago Dias] + +* Bugfixes: + * Drop EOL'd rubyforge_project directive from .gemspec. + #155 [Patch by Olle Jonsson] + === 1.0.7 / 2019-01-04 * Bugfixes: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 1970-01-01 01:00:00.000000000 +0100 +++ new/README.md 2019-12-24 22:04:19.000000000 +0100 @@ -0,0 +1,465 @@ +# What is rake-compiler? + +rake-compiler is first and foremost a productivity tool for Ruby developers. +Its goal is to make the busy developer's life easier by simplifying the building +and packaging of Ruby extensions by simplifying code and reducing duplication. + +It follows **convention over configuration** by advocating a standardized build and +package structure for both C and Java based RubyGems. + +rake-compiler is the result of many hard-won experiences dealing with several +diverse RubyGems that provided native extensions for different platforms and +different user configurations in different ways. Details such as differences in +code portability, differences in code clarity, and differences in project directory +structure often made it very difficult for newcomers to those RubyGems. + +From these challenges, rake-compiler was born with the single-minded goal of +making the busy RubyGem developer's life much less difficult. + +## Feature Overview + +Some of the benefits rake-compiler provides include: + +* No custom rake tasks required. Less code duplication and errors. + +* Painlessly build extensions on different platforms (Linux, OSX and Windows). + +* Painlessly build extensions for different Ruby implementations (JRuby, + Rubinius and MRI). + +* Allow multiple extensions to be compiled inside the same gem. + +* Painlessly build "fat" native gems for Windows users (from Linux or OSX). + +* Mimics RubyGems standard installation process, helping as a test environment. + +* Simplifies cross platform extension compilation (targeting Windows from Linux). + +## OK, I'm sold! Show me how to install it! + +Simple: + + $ gem install rake-compiler + +## That's easy. How do I use it? + +Now that you have installed rake-compiler, it's time to give your project a +standardized structure. + +### Using a standardized project structure + +Let's say you want to compile an extension called 'hello_world'. Organizing +your project's code tree in the following way will help rake-compiler do +its job: + + |-- ext + | `-- hello_world + | |-- extconf.rb + | |-- HelloWorldService.java + | `-- hello_world.c + |-- lib + `-- Rakefile + +TIP: Having a consistent project directory structure will help developers and +newcomers find and understand your code, making it easier for them to +contribute back to your project. + +### Adding the code to enable rake-compiler + +Now the fun part. It's time to introduce the code to your projects Rakefile +to tell it to use rake-compiler to build your extension: + + # File: extconf.rb + + # these lines must exist already + require 'mkmf' + create_makefile('hello_world') + + # File: Rakefile + + require 'rake/extensiontask' + + Rake::ExtensionTask.new('hello_world') + +That's it? Yes, that's it! No other lines of code are needed for +rake-compiler to work its magic. + +Though, you need to make sure the parameter to `create_makefile` +and `ExtensionTask.new` are the same or rake-compiler will not mimic +the RubyGems standard install process. You can override this standard +behaviour if needed, see the instructions for "non-standard project structure" +below for details. + +If you want to do the same for a JRuby extension written in Java, it's just +as easy: + + # File: Rakefile + + require 'rake/javaextensiontask' + + Rake::JavaExtensionTask.new('hello_world') + +### The simple process + +Those **two** simple lines of code automatically added the Rake tasks needed to +build your 'hello_world' extension. For example, checking the Rake tasks on +MRI Ruby 1.8.x/1.9 returns something similar to: + + $ rake -T + (in /home/user/my_extension) + rake compile # Compile the extension(s) + rake compile:hello_world # Compile just the hello_world extension + +Simply calling `compile` like + + $ rake compile + +performs the entire compile and build process for you and places the resulting +extension inside the `lib` directory of your project. + +To pass `dir_config` options to the compilation, add to the command line: + + $ rake compile -- --with-foo-[dir|lib|bin|...]=/path/to/foo + +NOTE: Please be aware that building C extensions requires the proper +development environment for your Platform, including libraries, headers +and build tools. Check your distro / vendor documentation on how to install +these development resources. + +NOTE: Building Java extensions requires the `javac`, part of the Java +Development Kit (JDK). This should be included by default on Mac OS X, and +downloadable from http://java.sun.com for other operating systems. + +### Generating native RubyGems + +A common usage scenario for rake-compiler is generating native gems that +bundle your extensions. As mentioned above, if you have your development +environment configured correctly, the following examples work even when +building native gems on Windows systems. + +Creating native gems is really easy with rake-compiler's +`Rake::ExtensionTask`: + + # somewhere in your Rakefile, define your gem spec + spec = Gem::Specification.new do |s| + s.name = "my_gem" + s.platform = Gem::Platform::RUBY + s.extensions = FileList["ext/**/extconf.rb"] + end + + # add your default gem packing task + Gem::PackageTask.new(spec) do |pkg| + end + + # feed the ExtensionTask with your spec + Rake::ExtensionTask.new('hello_world', spec) + +As expected, you can still build your pure-ruby gem in the usual way +(standard output) by running: + + $ rake gem + (in /projects/oss/my_gem.git) + mkdir -p pkg + Successfully built RubyGem + Name: my_gem + Version: 0.1.0 + File: my_gem-0.1.0.gem + mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem + +Plus, rake-compiler tasks give you the extra functionality needed to build +native gems by running: + + # rake native gem + (... compilation output ...) + mkdir -p pkg + Successfully built RubyGem + Name: my_gem + Version: 0.1.0 + File: my_gem-0.1.0.gem + mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem + Successfully built RubyGem + Name: my_gem + Version: 0.1.0 + File: my_gem-0.1.0-x86-mingw32.gem + mv my_gem-0.1.0-x86-mingw32.gem pkg/my_gem-0.1.0-x86-mingw32.gem + +Did you notice that you get two gems for the price of one? How's that for a +time saver? + +Similarly, it's just as easy to do the same thing for JRuby extensions: + + # rake java gem + (... compilation output ...) + mkdir -p pkg + Successfully built RubyGem + Name: my_gem + Version: 0.1.0 + File: my_gem-0.1.0.gem + mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem + Successfully built RubyGem + Name: my_gem + Version: 0.1.0 + File: my_gem-0.1.0-java.gem + mv my_gem-0.1.0-java.gem pkg/my_gem-0.1.0-java.gem + + +### Great, but can I use a non-standard project structure? + +Yes you can! While the conventional project structure is recommended, you may +want, or need, to tweak those conventions. Rake-compiler allows you to customize +several settings for `Rake::ExtensionTask`: + + Rake::ExtensionTask.new do |ext| + ext.name = 'hello_world' # indicate the name of the extension. + ext.ext_dir = 'ext/weird_world' # search for 'hello_world' inside it. + ext.lib_dir = 'lib/my_lib' # put binaries into this folder. + ext.config_script = 'custom_extconf.rb' # use instead of the default 'extconf.rb'. + ext.tmp_dir = 'tmp' # temporary folder used during compilation. + ext.source_pattern = "*.{c,cpp}" # monitor file changes to allow simple rebuild. + ext.config_options << '--with-foo' # supply additional options to configure script. + ext.gem_spec = spec # optionally indicate which gem specification + # will be used. + end + + +### Show me all of the supported configuration options + +| Option | Supported By | Description | +| -------------------- | --------------------- | ---------------------------------------- | +| name | Both | Required. Give the target binary a name. | +| gem_spec | Both | [Optional] Indicate which gem specification will be used. | +| tmp_dir | Both | [Optional] Temporary folder used during compilation. | +| ext_dir | Both | [Optional] Where to search for `name`. Default: `ext/#{@name}`. | +| lib_dir | Both | [Optional] Put binaries into this folder. Default: `lib`. | +| config_options | Both | [Optional] Supply additional options to configure script. | +| source_pattern | Both | [Optional] Monitor file changes to allow simple rebuild. Default for CRuby: `*.{c,cc,cpp}`. Default for Java: `**/*.java`. | +| _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 (-)._ | +| 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`. | +| cross_compile | ExtensionTask (CRuby) | [Optional] See [Cross compilation - the future is now.](#cross-compilation---the-future-is-now) Default: `false`. | +| cross_platform | ExtensionTask (CRuby) | [Optional] See [Cross compilation - the future is now.](#cross-compilation---the-future-is-now) Default: `i386-mingw32`. | +| cross_config_options | ExtensionTask (CRuby) | [Optional] See [Cross compilation - the future is now.](#cross-compilation---the-future-is-now) Default: `[]`. | +| no_native | ExtensionTask (CRuby) | [Optional] Set to true to prevent non-CRuby platforms from defining native tasks. Default: `false`. | +| config_includes | ExtensionTask (CRuby) | [Optional] Specify an Array of paths to include as `-I...:...` includes during compilation. Default: `['.']`. | +| classpath | JavaExtensionTask | [Optional] Specify additional classpath paths as an Array. Default: _Uses the current CLASSPATH._ | +| debug | JavaExtensionTask | [Optional] Whether to set the debug flag during complication. Default: `false`. | +| source_version | JavaExtensionTask | [Optional] The JRE version that your source code requires to compile. Default: `1.6`. | +| target_version | JavaExtensionTask | [Optional] The oldest JRE version you want to support. Default: `1.6`. | +| encoding | JavaExtensionTask | [Optional] Specify an -encoding option to provide to the compiler. Default: `nil`. | +| 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._ | + + +## Cross compilation - the future is now. + +Rake-compiler also provides a standardized way to generate, from either Linux +or OSX, extensions and gem binaries for your Windows users! + +How can this be you say? Simple, rake-compiler's cross compilation features +take advantage of GCC's host/target capabilities to build 'target' binaries on +different 'host' OS's. + +### How do I do this from Linux or OSX? + +#### The Easy Way + +Use rake-compiler-dock, a gem that makes use of a virtual machine provisioned with +all the necessary build tools. You can add a task to your Rakefile, that +cross-compiles and packages your gem into Windows fat binaries (with 1.8 to 2.2 +and x86/x64 support). See https://github.com/rake-compiler/rake-compiler-dock for more +information. + +#### The Manual Way + +In addition to having the development tool chain installed (GCC), you also need to +install your platform's `mingw32` cross compilation package. + +Installation depends upon your operating system/distribution. On Ubuntu and Debian +host machines, a simple `apt-get install mingw32` will be enough. + +On Arch, `mingw32` is installed by running `pacman -S mingw32-gcc` + +On OSX, we no longer recommend the usage of MacPorts `mingw32` package because +it stagnated in GCC version 3.4.5. + +Instead we recommend you download mingw-w64 automated build packages available at +SourceForge: + +http://sourceforge.net/downloads/mingw-w64/ + +Browse into *Toolchains targetting Win32* and then *Automated Builds*. + +Files will be ordered by recency, find the latest one with version 1.0 in it, +like this one: + + mingw-w32-1.0-bin_i686-darwin_20110422.tar.bz2 + +Download and extract. After that, make sure the bin directory is added to the PATH, eg: + + export PATH=~/mingw-w64/w32/bin:$PATH + +You can add this to your `.profile` to avoid the repitition. + +#### I've got my tool-chain installed, now what? + +First, you need to build Ruby for Windows on your Linux or OSX system. + +Relax, no need to freak out! Let rake-compiler do all the heavy lifting for you: + + rake-compiler cross-ruby + +And you're done. It will automatically download, configure and compile the latest +stable version of Ruby for Windows, and place it into your `~/.rake-compiler` +directory. + +This will create `~/.rake-compiler/config.yml` file so that rake-compiler +knows where to find the `rbconfig.rb` file that matches the Ruby version +on the Windows host system you're cross-compiling for. An example: + + # File: ~/.rake-compiler/config.yml + + rbconfig-x86-mingw32-1.8.6: /path/to/ruby-1.8.6/rbconfig.rb + rbconfig-x86-mingw32-1.8.7: /path/to/ruby-1.8.7/rbconfig.rb + rbconfig-x86-mingw32-1.9.2: /path/to/ruby-1.9.2/rbconfig.rb + +If, instead, you want to build a different Ruby version than the default one, please +supply a `VERSION`: + + rake-compiler cross-ruby VERSION=1.8.6-p114 + +If you, like me, have multiple versions of MinGW packages installed, you can +specify the HOST that will be used to cross compile Ruby: + + rake-compiler cross-ruby HOST=x86-mingw32 # (OSX mingw32 port) + +The host will vary depending on provider (mingw32 versus mingw-w64 projects). +Please consult the documentation and website of the MinGW package provider before +reporting any issues. + +#### OK, let's cross compile some gems! + +Now, you only need specify a few additional options in your extension definition: + + Rake::ExtensionTask.new('my_extension', gem_spec) do |ext| + # enable cross compilation (requires cross compile toolchain) + ext.cross_compile = true + + # set a single platform or an array of platforms to target + ext.cross_platform = ['x86-mingw32', 'x64-mingw32'] + + # cross-compile options will be passed to extconf.rb for each + # platform build, with platform-specific options in a hash. + ext.cross_config_options << '--with-common-option' + ext.cross_config_options << { + 'x86-mswin32-60 => '--with-some-option', + 'x64-mingw32' => '--enable-64bits', + } + ext.cross_config_options << '--with-final-option' + + # perform alterations on the gemspec when cross compiling + ext.cross_compiling do |gem_spec| + # such as packaging a file that isn't specified in the gemspec + gem_spec.files << 'lib/generated_file.rb' + # or adding a new installation message + gem_spec.post_install_message = "You installed the binary version of this gem!" + end + end + +By default, cross compilation targets 'i386-mingw32' which is the default +GCC platform for Ruby. MRI Ruby's current official distribution uses +`i386-mswin32-60`. The RubyInstaller distribution uses +`x86-mingw32` and `x64-mingw32` for 32-bit and 64-bit +Windows targets, respectively. Note that `i386` and `x86` +are synonymous here; `x86` is preferred going forward. + +The format for `cross_config_options` is an array of strings and +hashes. Hashes will be fetched for each value of `cross_platform` +as the build iterates, or ignored if there is no value for that platform. +You can mix-and-match strings and hashes to get desired option ordering. + +#### Warning, magician about to do some tricks, don't blink! + +Cross compiling is still very simple: + + rake cross compile + +And now, building gems for your Windows users is just 6 more letters: + + rake cross native gem + +And you're done, yeah. + +#### But wait, there's more + +You can specify which version of Ruby to build the extension against: + + rake cross compile RUBY_CC_VERSION=1.8.6 + +For example, if you installed `1.9.2`, you can do: + + rake cross compile RUBY_CC_VERSION=1.9.2 + +Even better, you can target multiple versions (ie. 1.8.6 and 1.9.2) in +the same gem via: + + rake cross compile RUBY_CC_VERSION=1.8.6:1.9.2 + +And better yet, you can bundle both binary extensions into one so-called "fat" +gem via: + + rake cross native gem RUBY_CC_VERSION=1.8.6:1.9.2 + +That will place binaries for both the 1.8 and 1.9 versions of your Ruby +extensions inside your project's `lib_dir` directory: + + lib/1.8/my_extension.so + lib/1.9/my_extension.so + +NOTE: building "fat" gems is currently only supported by rake-compiler when +cross compiling from a Linux or OSX host. Patches are welcome if building +"fat" gems from Windows hosts is desired, or natively for your platform :-) + +Now it's up to you to make your gem load the proper binary at runtime: + + begin + RUBY_VERSION =~ /(\d+\.\d+)/ + require "#{$1}/my_extension" + rescue LoadError + require "my_extension" + end + +The above technique will lookup first for 1.8 or 1.9 version of the extension +and when not found, will look for the plain extension. + +This approach catch the cases of provided fat binaries or gems compiled by the +end user installing the gem. It has also been implemented successfully in +several projects. + +## What are you talking about? (Give me examples) + +I know all the above sounds like a complete foreign language (it does even for me!). +So, what if I show you some examples? + +Check our wiki with links to the proper rake files used by many developers and +projects and how they use rake-compiler. + +http://github.com/rake-compiler/rake-compiler/wiki/projects-using-rake-compiler + +## Future + +rake-compiler is a work in progress and we appreciate any and all feedback +during the development of it! (and contributions too!) + +You can find more information about rake-compiler: + +* GitHub: https://github.com/rake-compiler/rake-compiler +* Issues: https://github.com/rake-compiler/rake-compiler/issues +* Docs: http://rubydoc.info/gems/rake-compiler +* Wiki: https://github.com/rake-compiler/rake-compiler/wiki + +## Disclaimer + +If you have any trouble, don't hesitate to contact the author. As always, +I'm not going to say "Use at your own risk" because I don't want this library +to be risky. + +If you trip on something, I'll share the liability by repairing things +as quickly as I can. Your responsibility is to report the inadequacies. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.rdoc new/README.rdoc --- old/README.rdoc 2019-01-03 23:22:56.000000000 +0100 +++ new/README.rdoc 1970-01-01 01:00:00.000000000 +0100 @@ -1,438 +0,0 @@ -= What is rake-compiler? - -rake-compiler is first and foremost a productivity tool for Ruby developers. -Its goal is to make the busy developer's life easier by simplifying the building -and packaging of Ruby extensions by simplifying code and reducing duplication. - -It follows *convention over configuration* by advocating a standardized build and -package structure for both C and Java based RubyGems. - -rake-compiler is the result of many hard-won experiences dealing with several -diverse RubyGems that provided native extensions for different platforms and -different user configurations in different ways. Details such as differences in -code portability, differences in code clarity, and differences in project directory -structure often made it very difficult for newcomers to those RubyGems. - -From these challenges, rake-compiler was born with the single-minded goal of -making the busy RubyGem developer's life much less difficult. - -== Feature Overview - -Some of the benefits rake-compiler provides include: - -* No custom rake tasks required. Less code duplication and errors. - -* Painlessly build extensions on different platforms (Linux, OSX and Windows). - -* Painlessly build extensions for different Ruby implementations (JRuby, - Rubinius and MRI). - -* Allow multiple extensions to be compiled inside the same gem. - -* Painlessly build "fat" native gems for Windows users (from Linux or OSX). - -* Mimics RubyGems standard installation process, helping as a test environment. - -* Simplifies cross platform extension compilation (targeting Windows from Linux). - -== OK, I'm sold! Show me how to install it! - -Simple: - - $ gem install rake-compiler - -== That's easy. How do I use it? - -Now that you have installed rake-compiler, it's time to give your project a -standardized structure. - -=== Using a standardized project structure - -Let's say you want to compile an extension called 'hello_world'. Organizing -your project's code tree in the following way will help rake-compiler do -its job: - - |-- ext - | `-- hello_world - | |-- extconf.rb - | |-- HelloWorldService.java - | `-- hello_world.c - |-- lib - `-- Rakefile - -TIP: Having a consistent project directory structure will help developers and -newcomers find and understand your code, making it easier for them to -contribute back to your project. - -=== Adding the code to enable rake-compiler - -Now the fun part. It's time to introduce the code to your projects Rakefile -to tell it to use rake-compiler to build your extension: - - # File: extconf.rb - - # these lines must exist already - require 'mkmf' - create_makefile('hello_world') - - - # File: Rakefile - - require 'rake/extensiontask' - - Rake::ExtensionTask.new('hello_world') - -That's it? Yes, that's it! No other lines of code are needed for -rake-compiler to work its magic. - -Though, you need to make sure the parameter to <tt>create_makefile</tt> -and <tt>ExtensionTask.new</tt> are the same or rake-compiler will not mimic -the RubyGems standard install process. You can override this standard -behaviour if needed, see the instructions for "non-standard project structure" -below for details. - -If you want to do the same for a JRuby extension written in Java, it's just -as easy: - - # File: Rakefile - - require 'rake/javaextensiontask' - - Rake::JavaExtensionTask.new('hello_world') - -=== The simple process - -Those *two* simple lines of code automatically added the Rake tasks needed to -build your 'hello_world' extension. For example, checking the Rake tasks on -MRI Ruby 1.8.x/1.9 returns something similar to: - - $ rake -T - (in /home/user/my_extension) - rake compile # Compile the extension(s) - rake compile:hello_world # Compile just the hello_world extension - -Simply calling <tt>compile</tt> like - - $ rake compile - -performs the entire compile and build process for you and places the resulting -extension inside the <tt>lib</tt> directory of your project. - -To pass <tt>dir_config</tt> options to the compilation, add to the command line: - - $ rake compile -- --with-foo-[dir|lib|bin|...]=/path/to/foo - -NOTE: Please be aware that building C extensions requires the proper -development environment for your Platform, including libraries, headers -and build tools. Check your distro / vendor documentation on how to install -these development resources. - -NOTE: Building Java extensions requires the <tt>javac</tt>, part of the Java -Development Kit (JDK). This should be included by default on Mac OS X, and -downloadable from http://java.sun.com for other operating systems. - -=== Generating native RubyGems - -A common usage scenario for rake-compiler is generating native gems that -bundle your extensions. As mentioned above, if you have your development -environment configured correctly, the following examples work even when -building native gems on Windows systems. - -Creating native gems is really easy with rake-compiler's <tt>Rake::ExtensionTask</tt>: - - # somewhere in your Rakefile, define your gem spec - spec = Gem::Specification.new do |s| - s.name = "my_gem" - s.platform = Gem::Platform::RUBY - s.extensions = FileList["ext/**/extconf.rb"] - end - - # add your default gem packing task - Gem::PackageTask.new(spec) do |pkg| - end - - # feed the ExtensionTask with your spec - Rake::ExtensionTask.new('hello_world', spec) - -As expected, you can still build your pure-ruby gem in the usual way -(standard output) by running: - - $ rake gem - (in /projects/oss/my_gem.git) - mkdir -p pkg - Successfully built RubyGem - Name: my_gem - Version: 0.1.0 - File: my_gem-0.1.0.gem - mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem - -Plus, rake-compiler tasks give you the extra functionality needed to build -native gems by running: - - # rake native gem - (... compilation output ...) - mkdir -p pkg - Successfully built RubyGem - Name: my_gem - Version: 0.1.0 - File: my_gem-0.1.0.gem - mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem - Successfully built RubyGem - Name: my_gem - Version: 0.1.0 - File: my_gem-0.1.0-x86-mingw32.gem - mv my_gem-0.1.0-x86-mingw32.gem pkg/my_gem-0.1.0-x86-mingw32.gem - -Did you notice that you get two gems for the price of one? How's that for a -time saver? - -Similarly, it's just as easy to do the same thing for JRuby extensions: - - # rake java gem - (... compilation output ...) - mkdir -p pkg - Successfully built RubyGem - Name: my_gem - Version: 0.1.0 - File: my_gem-0.1.0.gem - mv my_gem-0.1.0.gem pkg/my_gem-0.1.0.gem - Successfully built RubyGem - Name: my_gem - Version: 0.1.0 - File: my_gem-0.1.0-java.gem - mv my_gem-0.1.0-java.gem pkg/my_gem-0.1.0-java.gem - - -=== Great, but can I use a non-standard project structure? - -Yes you can! While the conventional project structure is recommended, you may -want, or need, to tweak those conventions. Rake-compiler allows you to customize -several settings for <tt>Rake::ExtensionTask</tt>: - - Rake::ExtensionTask.new do |ext| - ext.name = 'hello_world' # indicate the name of the extension. - ext.ext_dir = 'ext/weird_world' # search for 'hello_world' inside it. - ext.lib_dir = 'lib/my_lib' # put binaries into this folder. - ext.config_script = 'custom_extconf.rb' # use instead of the default 'extconf.rb'. - ext.tmp_dir = 'tmp' # temporary folder used during compilation. - ext.source_pattern = "*.{c,cpp}" # monitor file changes to allow simple rebuild. - ext.config_options << '--with-foo' # supply additional options to configure script. - ext.gem_spec = spec # optionally indicate which gem specification - # will be used. - end - -== Cross compilation - the future is now. - -Rake-compiler also provides a standardized way to generate, from either Linux -or OSX, extensions and gem binaries for your Windows users! - -How can this be you say? Simple, rake-compiler's cross compilation features -take advantage of GCC's host/target capabilities to build 'target' binaries on -different 'host' OS's. - -=== How do I do this from Linux or OSX? - -==== The Easy Way - -Use rake-compiler-dock, a gem that makes use of a virtual machine provisioned with -all the necessary build tools. You can add a task to your Rakefile, that -cross-compiles and packages your gem into Windows fat binaries (with 1.8 to 2.2 -and x86/x64 support). See https://github.com/rake-compiler/rake-compiler-dock for more -information. - -==== The Manual Way - -In addition to having the development tool chain installed (GCC), you also need to -install your platform's <tt>mingw32</tt> cross compilation package. - -Installation depends upon your operating system/distribution. On Ubuntu and Debian -host machines, a simple <tt>apt-get install mingw32</tt> will be enough. - -On Arch, <tt>mingw32</tt> is installed by running <tt>pacman -S mingw32-gcc</tt> - -On OSX, we no longer recommend the usage of MacPorts <tt>mingw32</tt> package because -it stagnated in GCC version 3.4.5. - -Instead we recommend you download mingw-w64 automated build packages available at -SourceForge: - -http://sourceforge.net/downloads/mingw-w64/ - -Browse into <em>Toolchains targetting Win32</em> and then <em>Automated Builds</em>. - -Files will be ordered by recency, find the latest one with version 1.0 in it, -like this one: - - mingw-w32-1.0-bin_i686-darwin_20110422.tar.bz2 - -Download and extract. After that, make sure the bin directory is added to the PATH, eg: - - export PATH=~/mingw-w64/w32/bin:$PATH - -You can add this to your <tt>.profile</tt> to avoid the repitition. - -==== I've got my tool-chain installed, now what? - -First, you need to build Ruby for Windows on your Linux or OSX system. - -Relax, no need to freak out! Let rake-compiler do all the heavy lifting for you: - - rake-compiler cross-ruby - -And you're done. It will automatically download, configure and compile the latest -stable version of Ruby for Windows, and place it into your <tt>~/.rake-compiler</tt> -directory. - -This will create <tt>~/.rake-compiler/config.yml</tt> file so that rake-compiler -knows where to find the <tt>rbconfig.rb</tt> file that matches the Ruby version -on the Windows host system you're cross-compiling for. An example: - - # File: ~/.rake-compiler/config.yml - - rbconfig-x86-mingw32-1.8.6: /path/to/ruby-1.8.6/rbconfig.rb - rbconfig-x86-mingw32-1.8.7: /path/to/ruby-1.8.7/rbconfig.rb - rbconfig-x86-mingw32-1.9.2: /path/to/ruby-1.9.2/rbconfig.rb - -If, instead, you want to build a different Ruby version than the default one, please -supply a <tt>VERSION</tt>: - - rake-compiler cross-ruby VERSION=1.8.6-p114 - -If you, like me, have multiple versions of MinGW packages installed, you can -specify the HOST that will be used to cross compile Ruby: - - rake-compiler cross-ruby HOST=x86-mingw32 # (OSX mingw32 port) - -The host will vary depending on provider (mingw32 versus mingw-w64 projects). -Please consult the documentation and website of the MinGW package provider before -reporting any issues. - -==== OK, let's cross compile some gems! - -Now, you only need specify a few additional options in your extension definition: - - Rake::ExtensionTask.new('my_extension', gem_spec) do |ext| - # enable cross compilation (requires cross compile toolchain) - ext.cross_compile = true - - # set a single platform or an array of platforms to target - ext.cross_platform = ['x86-mingw32', 'x64-mingw32'] - - # cross-compile options will be passed to extconf.rb for each - # platform build, with platform-specific options in a hash. - ext.cross_config_options << '--with-common-option' - ext.cross_config_options << { - 'x86-mswin32-60 => '--with-some-option', - 'x64-mingw32' => '--enable-64bits', - } - ext.cross_config_options << '--with-final-option' - - # perform alterations on the gemspec when cross compiling - ext.cross_compiling do |gem_spec| - # such as packaging a file that isn't specified in the gemspec - gem_spec.files << 'lib/generated_file.rb' - # or adding a new installation message - gem_spec.post_install_message = "You installed the binary version of this gem!" - end - end - -By default, cross compilation targets 'i386-mingw32' which is the default -GCC platform for Ruby. MRI Ruby's current official distribution uses -<tt>i386-mswin32-60</tt>. The RubyInstaller distribution uses -<tt>x86-mingw32</tt> and <tt>x64-mingw32</tt> for 32-bit and 64-bit -Windows targets, respectively. Note that <tt>i386</tt> and <tt>x86</tt> -are synonymous here; <tt>x86</tt> is preferred going forward. - -The format for <tt>cross_config_options</tt> is an array of strings and -hashes. Hashes will be fetched for each value of <tt>cross_platform</tt> -as the build iterates, or ignored if there is no value for that platform. -You can mix-and-match strings and hashes to get desired option ordering. - -==== Warning, magician about to do some tricks, don't blink! - -Cross compiling is still very simple: - - rake cross compile - -And now, building gems for your Windows users is just 6 more letters: - - rake cross native gem - -And you're done, yeah. - -==== But wait, there's more - -You can specify which version of Ruby to build the extension against: - - rake cross compile RUBY_CC_VERSION=1.8.6 - -For example, if you installed <tt>1.9.2</tt>, you can do: - - rake cross compile RUBY_CC_VERSION=1.9.2 - -Even better, you can target multiple versions (ie. 1.8.6 and 1.9.2) in -the same gem via: - - rake cross compile RUBY_CC_VERSION=1.8.6:1.9.2 - -And better yet, you can bundle both binary extensions into one so-called "fat" -gem via: - - rake cross native gem RUBY_CC_VERSION=1.8.6:1.9.2 - -That will place binaries for both the 1.8 and 1.9 versions of your Ruby -extensions inside your project's <tt>lib_dir</tt> directory: - - lib/1.8/my_extension.so - lib/1.9/my_extension.so - -NOTE: building "fat" gems is currently only supported by rake-compiler when -cross compiling from a Linux or OSX host. Patches are welcome if building -"fat" gems from Windows hosts is desired, or natively for your platform :-) - -Now it's up to you to make your gem load the proper binary at runtime: - - begin - RUBY_VERSION =~ /(\d+\.\d+)/ - require "#{$1}/my_extension" - rescue LoadError - require "my_extension" - end - -The above technique will lookup first for 1.8 or 1.9 version of the extension -and when not found, will look for the plain extension. - -This approach catch the cases of provided fat binaries or gems compiled by the -end user installing the gem. It has also been implemented successfully in -several projects. - -== What are you talking about? (Give me examples) - -I know all the above sounds like a complete foreign language (it does even for me!). -So, what if I show you some examples? - -Check our wiki with links to the proper rake files used by many developers and -projects and how they use rake-compiler. - -http://github.com/rake-compiler/rake-compiler/wiki/projects-using-rake-compiler - -== Future - -rake-compiler is a work in progress and we appreciate any and all feedback -during the development of it! (and contributions too!) - -You can find more information about rake-compiler: - -* GitHub: https://github.com/rake-compiler/rake-compiler -* Issues: https://github.com/rake-compiler/rake-compiler/issues -* Docs: http://rubydoc.info/gems/rake-compiler -* Wiki: https://github.com/rake-compiler/rake-compiler/wiki - -== Disclaimer - -If you have any trouble, don't hesitate to contact the author. As always, -I'm not going to say "Use at your own risk" because I don't want this library -to be risky. - -If you trip on something, I'll share the liability by repairing things -as quickly as I can. Your responsibility is to report the inadequacies. Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/rake/javaextensiontask.rb new/lib/rake/javaextensiontask.rb --- old/lib/rake/javaextensiontask.rb 2019-01-03 23:22:56.000000000 +0100 +++ new/lib/rake/javaextensiontask.rb 2019-12-24 22:04:19.000000000 +0100 @@ -17,6 +17,11 @@ # Generate class files for specific VM version attr_accessor :target_version + attr_accessor :encoding + + # Specify lint option + attr_accessor :lint_option + def platform @platform ||= 'java' end @@ -29,10 +34,12 @@ super @source_pattern = '**/*.java' @classpath = nil - @java_compiling = nil @debug = false @source_version = '1.6' @target_version = '1.6' + @encoding = nil + @java_compiling = nil + @lint_option = nil end def define @@ -92,10 +99,19 @@ EOF warn_once(not_jruby_compile_msg) unless defined?(JRUBY_VERSION) - classpath_arg = java_classpath_arg(@classpath) - debug_arg = @debug ? '-g' : '' - - sh "javac #{java_extdirs_arg} -target #{@target_version} -source #{@source_version} -Xlint:unchecked #{debug_arg} #{classpath_arg} -d #{tmp_path} #{source_files.join(' ')}" + javac_command_line = [ + "javac", + "-target", @target_version, + "-source", @source_version, + java_lint_arg, + "-d", tmp_path, + ] + javac_command_line.concat(java_encoding_args) + javac_command_line.concat(java_extdirs_args) + javac_command_line.concat(java_classpath_args) + javac_command_line << "-g" if @debug + javac_command_line.concat(source_files) + sh(*javac_command_line) # Checkpoint file touch "#{tmp_path}/.build" @@ -185,24 +201,36 @@ end # - # Discover Java Extension Directories and build an extdirs argument + # Discover Java Extension Directories and build an extdirs arguments # - def java_extdirs_arg + def java_extdirs_args extdirs = Java::java.lang.System.getProperty('java.ext.dirs') rescue nil - extdirs = ENV['JAVA_EXT_DIR'] unless extdirs - java_extdir = extdirs.nil? ? "" : "-extdirs \"#{extdirs}\"" + extdirs ||= ENV['JAVA_EXT_DIR'] + if extdirs.nil? + [] + else + ["-extdirs", extdirs] + end end # - # Discover the Java/JRuby classpath and build a classpath argument + # Build an encoding arguments + # + def java_encoding_args + if @encoding.nil? + [] + else + ["-encoding", @encoding] + end + end + # - # @params - # *args:: Additional classpath arguments to append + # Discover the Java/JRuby classpath and build a classpath arguments # # Copied verbatim from the ActiveRecord-JDBC project. There are a small myriad # of ways to discover the Java classpath correctly. # - def java_classpath_arg(*args) + def java_classpath_args jruby_cpath = nil if RUBY_PLATFORM =~ /java/ begin @@ -240,9 +268,21 @@ raise "Could not find jruby.jar. Please set JRUBY_HOME or use jruby in rvm" end - jruby_cpath += File::PATH_SEPARATOR + args.join(File::PATH_SEPARATOR) unless args.empty? - jruby_cpath ? "-cp \"#{jruby_cpath}\"" : "" + if @classpath and @classpath.size > 0 + jruby_cpath = [jruby_cpath, *@classpath].join(File::PATH_SEPARATOR) + end + ["-cp", jruby_cpath] end + # + # Convert a `-Xlint:___` linting option such as `deprecation` into a full javac argument, such as `-Xlint:deprecation`. + # + # @return [String] Default: _Simply `-Xlint` is run, which enables recommended warnings. + # + def java_lint_arg + return '-Xlint' unless @lint_option + + "-Xlint:#{@lint_option}" + end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2019-01-03 23:22:56.000000000 +0100 +++ new/metadata 2019-12-24 22:04:19.000000000 +0100 @@ -1,7 +1,7 @@ --- !ruby/object:Gem::Specification name: rake-compiler version: !ruby/object:Gem::Version - version: 1.0.7 + version: 1.1.0 platform: ruby authors: - Kouhei Sutou @@ -9,7 +9,7 @@ autorequire: bindir: bin cert_chain: [] -date: 2019-01-03 00:00:00.000000000 Z +date: 2019-12-24 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: rake @@ -77,14 +77,14 @@ - rake-compiler extensions: [] extra_rdoc_files: -- README.rdoc +- README.md - LICENSE.txt - History.txt files: - Gemfile - History.txt - LICENSE.txt -- README.rdoc +- README.md - Rakefile - appveyor.yml - bin/rake-compiler @@ -129,7 +129,7 @@ post_install_message: rdoc_options: - "--main" -- README.rdoc +- README.md - "--title" - rake-compiler -- Documentation require_paths: @@ -145,7 +145,8 @@ - !ruby/object:Gem::Version version: 1.8.23 requirements: [] -rubygems_version: 3.0.2 +rubyforge_project: +rubygems_version: 2.7.6.2 signing_key: specification_version: 4 summary: Rake-based Ruby Extension (C, Java) task generator. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/lib/rake/javaextensiontask_spec.rb new/spec/lib/rake/javaextensiontask_spec.rb --- old/spec/lib/rake/javaextensiontask_spec.rb 2019-01-03 23:22:56.000000000 +0100 +++ new/spec/lib/rake/javaextensiontask_spec.rb 2019-12-24 22:04:19.000000000 +0100 @@ -76,9 +76,14 @@ @ext.config_options.should be_empty end + it 'should have no lint option preset to delegate' do + @ext.lint_option.should be_falsey + end + it 'should default to Java platform' do @ext.platform.should == 'java' end + end context '(tasks)' do before :each do @@ -165,6 +170,31 @@ end end end + + context 'A custom extension' do + let(:extension) do + Rake::JavaExtensionTask.new('extension_two') do |ext| + ext.lint_option = lint_option if lint_option + end + end + + context 'without a specified lint option' do + let(:lint_option) { nil } + + it 'should honor the lint option' do + (extension.lint_option).should be_falsey + (extension.send :java_lint_arg).should eq '-Xlint' + end + end + + context "with a specified lint option of 'deprecated'" do + let(:lint_option) { 'deprecated'.freeze } + + it 'should honor the lint option' do + (extension.lint_option).should eq lint_option + (extension.send :java_lint_arg).should eq '-Xlint:deprecated' + end + end end end private diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasks/bin/cross-ruby.rake new/tasks/bin/cross-ruby.rake --- old/tasks/bin/cross-ruby.rake 2019-01-03 23:22:56.000000000 +0100 +++ new/tasks/bin/cross-ruby.rake 2019-12-24 22:04:19.000000000 +0100 @@ -58,13 +58,16 @@ ENV.delete(var) end +source_dir = "#{USER_HOME}/sources/#{RUBY_CC_VERSION}" +build_dir = "#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}" + # define a location where sources will be stored -directory "#{USER_HOME}/sources/#{RUBY_CC_VERSION}" -directory "#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}" +directory source_dir +directory build_dir # clean intermediate files and folders -CLEAN.include("#{USER_HOME}/sources/#{RUBY_CC_VERSION}") -CLEAN.include("#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}") +CLEAN.include(source_dir) +CLEAN.include(build_dir) # remove the final products and sources CLOBBER.include("#{USER_HOME}/sources") @@ -87,20 +90,26 @@ # Extract the sources source_file = RUBY_SOURCE ? RUBY_SOURCE.split('/').last : "#{RUBY_CC_VERSION}.tar.bz2" -file "#{USER_HOME}/sources/#{RUBY_CC_VERSION}" => ["#{USER_HOME}/sources/#{source_file}"] do |t| +file source_dir => ["#{USER_HOME}/sources/#{source_file}"] do |t| chdir File.dirname(t.name) do t.prerequisites.each { |f| sh "tar xf #{File.basename(f)}" } end end # backup makefile.in -file "#{USER_HOME}/sources/#{RUBY_CC_VERSION}/Makefile.in.bak" => ["#{USER_HOME}/sources/#{RUBY_CC_VERSION}"] do |t| - cp "#{USER_HOME}/sources/#{RUBY_CC_VERSION}/Makefile.in", t.name +if RUBY_CC_VERSION >= "ruby-2.7.0" + makefile_in = "#{source_dir}/template/Makefile.in" +else + makefile_in = "#{source_dir}/Makefile.in" +end +makefile_in_bak = "#{makefile_in}.bak" +file makefile_in_bak => [source_dir] do |t| + cp makefile_in, makefile_in_bak end # correct the makefiles -file "#{USER_HOME}/sources/#{RUBY_CC_VERSION}/Makefile.in" => ["#{USER_HOME}/sources/#{RUBY_CC_VERSION}/Makefile.in.bak"] do |t| - content = File.open(t.name, 'rb') { |f| f.read } +file makefile_in => [makefile_in_bak] do |t| + content = File.open(makefile_in_bak, 'rb') { |f| f.read } out = "" @@ -113,7 +122,7 @@ end when_writing("Patching Makefile.in") { - File.open(t.name, 'wb') { |f| f.write(out) } + File.open(makefile_in, 'wb') { |f| f.write(out) } } end @@ -126,8 +135,7 @@ end # generate the makefile in a clean build location -file "#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}/Makefile" => ["#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}", - "#{USER_HOME}/sources/#{RUBY_CC_VERSION}/Makefile.in"] do |t| +file "#{build_dir}/Makefile" => [build_dir, makefile_in] do |t| options = [ "--host=#{MINGW_HOST}", @@ -149,14 +157,14 @@ end # make -file "#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}/ruby.exe" => ["#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}/Makefile"] do |t| +file "#{build_dir}/ruby.exe" => ["#{build_dir}/Makefile"] do |t| chdir File.dirname(t.prerequisites.first) do sh MAKE end end # make install -file "#{USER_HOME}/ruby/#{MINGW_HOST}/#{RUBY_CC_VERSION}/bin/ruby.exe" => ["#{USER_HOME}/builds/#{MINGW_HOST}/#{RUBY_CC_VERSION}/ruby.exe"] do |t| +file "#{USER_HOME}/ruby/#{MINGW_HOST}/#{RUBY_CC_VERSION}/bin/ruby.exe" => ["#{build_dir}/ruby.exe"] do |t| chdir File.dirname(t.prerequisites.first) do sh "#{MAKE} install" end @@ -210,4 +218,3 @@ desc "Build #{RUBY_CC_VERSION} suitable for cross-platform development." task 'cross-ruby' => [:mingw32, :install, 'update-config'] -