gem-compile 0.0.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.
- data/AUTHORS +1 -0
- data/README.md +60 -0
- data/bin/gem-compile +162 -0
- data/lib/rubygems/commands/compile_command.rb +33 -0
- data/lib/rubygems/compiler.rb +108 -0
- data/lib/rubygems_plugin.rb +4 -0
- metadata +61 -0
data/AUTHORS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
FURUHASHI Sadayuki <frsyuki _at_ users.sourceforge.jp>
|
data/README.md
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
gem-compile
|
2
|
+
===========
|
3
|
+
Create binary gems from gems with extensions.
|
4
|
+
|
5
|
+
|
6
|
+
## Overview
|
7
|
+
|
8
|
+
gem-compile is a RubyGem command plugin that adds 'complie' command.
|
9
|
+
It creates binary gems from gems with extensions.
|
10
|
+
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
$ gem build gem-compile.gemspec
|
15
|
+
$ gem install gem-compile-*.gem
|
16
|
+
or
|
17
|
+
$ gem install gem-compile
|
18
|
+
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
$ gem compile [options] GEMFILE -- --build-flags
|
23
|
+
or
|
24
|
+
$ gem-compile [options] GEMFILE -- --build-flags
|
25
|
+
|
26
|
+
options:
|
27
|
+
-p, --platform PLATFORM Output platform name
|
28
|
+
|
29
|
+
|
30
|
+
## Example
|
31
|
+
|
32
|
+
$ gem compile msgpack-0.3.4.gem
|
33
|
+
With above command line, msgpack-0.3.4-x86-mingw32.gem file will be created on MinGW environment.
|
34
|
+
|
35
|
+
$ gem compile --platform mswin32 msgpack-0.3.4.gem
|
36
|
+
With above command line, msgpack-0.3.4-x86-mswin32.gem file will be created.
|
37
|
+
|
38
|
+
|
39
|
+
## License
|
40
|
+
|
41
|
+
Copyright (c) 2010 FURUHASHI Sadayuki
|
42
|
+
|
43
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
44
|
+
of this software and associated documentation files (the "Software"), to deal
|
45
|
+
in the Software without restriction, including without limitation the rights
|
46
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
47
|
+
copies of the Software, and to permit persons to whom the Software is
|
48
|
+
furnished to do so, subject to the following conditions:
|
49
|
+
|
50
|
+
The above copyright notice and this permission notice shall be included in
|
51
|
+
all copies or substantial portions of the Software.
|
52
|
+
|
53
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
54
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
55
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
56
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
57
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
58
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
59
|
+
THE SOFTWARE.
|
60
|
+
|
data/bin/gem-compile
ADDED
@@ -0,0 +1,162 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# gem-compile
|
4
|
+
#
|
5
|
+
# Copyright (c) 2010 FURUHASHI Sadayuki
|
6
|
+
#
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
12
|
+
# furnished to do so, subject to the following conditions:
|
13
|
+
#
|
14
|
+
# The above copyright notice and this permission notice shall be included in
|
15
|
+
# all copies or substantial portions of the Software.
|
16
|
+
#
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
+
# THE SOFTWARE.
|
24
|
+
#
|
25
|
+
require 'optparse'
|
26
|
+
require 'fileutils'
|
27
|
+
|
28
|
+
args = ARGV.dup
|
29
|
+
|
30
|
+
if ARGV.include?('--')
|
31
|
+
build_args = args[args.index("--") + 1...args.length]
|
32
|
+
args = args[0...args.index("--")]
|
33
|
+
end
|
34
|
+
|
35
|
+
config = {
|
36
|
+
:platform => nil
|
37
|
+
}
|
38
|
+
|
39
|
+
op = OptionParser.new
|
40
|
+
op.on('-p', '--platform PLATFORM',
|
41
|
+
'Output platform name') {|s| config[:platform] = s }
|
42
|
+
|
43
|
+
op.banner += " GEMFILE -- --build-flags"
|
44
|
+
|
45
|
+
op.parse!(args)
|
46
|
+
|
47
|
+
if args.length != 1
|
48
|
+
puts op.to_s
|
49
|
+
exit 0
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
require 'rubygems/format'
|
54
|
+
require 'rubygems/ext'
|
55
|
+
require 'rubygems/builder'
|
56
|
+
|
57
|
+
Gem::Command.build_args = build_args if build_args
|
58
|
+
|
59
|
+
gem = args.first
|
60
|
+
platform = config[:platform] || Gem::Platform::RUBY
|
61
|
+
|
62
|
+
|
63
|
+
gem_dir = "#{File.basename(gem)}.build"
|
64
|
+
gem_dir = File.expand_path(gem_dir)
|
65
|
+
|
66
|
+
begin
|
67
|
+
format = Gem::Format.from_file_by_path(gem)
|
68
|
+
rescue => ex
|
69
|
+
puts ex
|
70
|
+
exit 1
|
71
|
+
end
|
72
|
+
|
73
|
+
spec = format.spec
|
74
|
+
|
75
|
+
if spec.extensions.empty?
|
76
|
+
puts "There are no extensions to build."
|
77
|
+
exit 1
|
78
|
+
end
|
79
|
+
|
80
|
+
if spec.platform != Gem::Platform::RUBY
|
81
|
+
puts "The package seems to be built already."
|
82
|
+
exit 1
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
format.file_entries.each do |entry, file_data|
|
87
|
+
path = entry['path'].untaint
|
88
|
+
path = File.expand_path File.join(gem_dir, path)
|
89
|
+
|
90
|
+
FileUtils.rm_rf(path) if File.exists?(path)
|
91
|
+
FileUtils.mkdir_p File.dirname(path)
|
92
|
+
|
93
|
+
File.open(path, "wb") do |out|
|
94
|
+
out.write file_data
|
95
|
+
end
|
96
|
+
|
97
|
+
FileUtils.chmod entry['mode'], path
|
98
|
+
|
99
|
+
puts path
|
100
|
+
end
|
101
|
+
|
102
|
+
ran_rake = false
|
103
|
+
start_dir = Dir.pwd
|
104
|
+
dest_path = File.join gem_dir, spec.require_paths.first
|
105
|
+
|
106
|
+
spec.extensions.each do |extension|
|
107
|
+
break if ran_rake
|
108
|
+
results = []
|
109
|
+
|
110
|
+
builder = case extension
|
111
|
+
when /extconf/ then
|
112
|
+
Gem::Ext::ExtConfBuilder
|
113
|
+
when /configure/ then
|
114
|
+
Gem::Ext::ConfigureBuilder
|
115
|
+
when /rakefile/i, /mkrf_conf/i then
|
116
|
+
ran_rake = true
|
117
|
+
Gem::Ext::RakeBuilder
|
118
|
+
else
|
119
|
+
results = ["No builder for extension '#{extension}'"]
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
|
123
|
+
begin
|
124
|
+
Dir.chdir File.join(gem_dir, File.dirname(extension))
|
125
|
+
results = builder.build(extension, gem_dir, dest_path, results)
|
126
|
+
|
127
|
+
puts results.join("\n")
|
128
|
+
|
129
|
+
rescue => ex
|
130
|
+
results = results.join "\n"
|
131
|
+
|
132
|
+
File.open('gem_make.out', 'wb') { |f| f.puts results }
|
133
|
+
|
134
|
+
mesage = <<-EOF
|
135
|
+
ERROR: Failed to build gem native extension."
|
136
|
+
|
137
|
+
#{results}
|
138
|
+
|
139
|
+
Results logged to #{File.join(Dir.pwd, 'gem_make.out')}
|
140
|
+
EOF
|
141
|
+
|
142
|
+
puts message
|
143
|
+
ensure
|
144
|
+
Dir.chdir start_dir
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
spec.extensions = []
|
150
|
+
|
151
|
+
built_files = Dir.glob("#{dest_path}/**/*")
|
152
|
+
basedir = File.join gem_dir, ""
|
153
|
+
built_files.each {|path| path.slice!(0, basedir.length) }
|
154
|
+
|
155
|
+
spec.files = (spec.files + built_files).sort.uniq
|
156
|
+
spec.platform = platform if platform
|
157
|
+
|
158
|
+
Dir.chdir gem_dir
|
159
|
+
out_fname = Gem::Builder.new(spec).build
|
160
|
+
|
161
|
+
FileUtils.mv(out_fname, start_dir)
|
162
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'rubygems/command'
|
2
|
+
require 'rubygems/compiler'
|
3
|
+
|
4
|
+
class Gem::Commands::CompileCommand < Gem::Command
|
5
|
+
def initialize
|
6
|
+
super 'compile', 'Create binary gems from gems with extensions',
|
7
|
+
:platform => Gem::Platform::CURRENT
|
8
|
+
|
9
|
+
add_option('-p', '--platform PLATFORM', 'Output platform name') do |value, options|
|
10
|
+
options[:platform] = value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def arguments # :nodoc:
|
15
|
+
"GEMFILE name of gem to compile"
|
16
|
+
end
|
17
|
+
|
18
|
+
def usage # :nodoc:
|
19
|
+
"#{program_name} GEMFILE"
|
20
|
+
end
|
21
|
+
|
22
|
+
def execute
|
23
|
+
gem = options[:args].shift
|
24
|
+
|
25
|
+
unless gem then
|
26
|
+
raise Gem::CommandLineError,
|
27
|
+
"Please specify a gem name or file on the command line"
|
28
|
+
end
|
29
|
+
|
30
|
+
Gem::Compiler.compile(gem, options[:platform])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'rubygems/format'
|
2
|
+
require 'rubygems/ext'
|
3
|
+
require 'rubygems/builder'
|
4
|
+
require 'rubygems/exceptions'
|
5
|
+
require 'rubygems/user_interaction'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
class Gem::Compiler
|
9
|
+
|
10
|
+
extend Gem::UserInteraction
|
11
|
+
|
12
|
+
def self.compile(gem, platform = Gem::Platform::CURRENT)
|
13
|
+
gem_dir = "#{File.basename(gem)}.build"
|
14
|
+
gem_dir = File.expand_path(gem_dir)
|
15
|
+
|
16
|
+
format = Gem::Format.from_file_by_path(gem)
|
17
|
+
|
18
|
+
spec = format.spec
|
19
|
+
|
20
|
+
if spec.extensions.empty?
|
21
|
+
raise Gem::Exception, "There are no extensions to build."
|
22
|
+
end
|
23
|
+
|
24
|
+
if spec.platform != Gem::Platform::RUBY
|
25
|
+
raise Gem::Exception, "The package seems to be built already."
|
26
|
+
end
|
27
|
+
|
28
|
+
format.file_entries.each do |entry, file_data|
|
29
|
+
path = entry['path'].untaint
|
30
|
+
path = File.expand_path File.join(gem_dir, path)
|
31
|
+
|
32
|
+
FileUtils.rm_rf(path) if File.exists?(path)
|
33
|
+
FileUtils.mkdir_p File.dirname(path)
|
34
|
+
|
35
|
+
File.open(path, "wb") do |out|
|
36
|
+
out.write file_data
|
37
|
+
end
|
38
|
+
|
39
|
+
FileUtils.chmod entry['mode'], path
|
40
|
+
|
41
|
+
say path if Gem.configuration.really_verbose
|
42
|
+
end
|
43
|
+
|
44
|
+
ran_rake = false
|
45
|
+
start_dir = Dir.pwd
|
46
|
+
dest_path = File.join gem_dir, spec.require_paths.first
|
47
|
+
|
48
|
+
spec.extensions.each do |extension|
|
49
|
+
break if ran_rake
|
50
|
+
results = []
|
51
|
+
|
52
|
+
builder = case extension
|
53
|
+
when /extconf/ then
|
54
|
+
Gem::Ext::ExtConfBuilder
|
55
|
+
when /configure/ then
|
56
|
+
Gem::Ext::ConfigureBuilder
|
57
|
+
when /rakefile/i, /mkrf_conf/i then
|
58
|
+
ran_rake = true
|
59
|
+
Gem::Ext::RakeBuilder
|
60
|
+
else
|
61
|
+
results = ["No builder for extension '#{extension}'"]
|
62
|
+
nil
|
63
|
+
end
|
64
|
+
|
65
|
+
begin
|
66
|
+
Dir.chdir File.join(gem_dir, File.dirname(extension))
|
67
|
+
results = builder.build(extension, gem_dir, dest_path, results)
|
68
|
+
|
69
|
+
say results.join("\n") if Gem.configuration.really_verbose
|
70
|
+
|
71
|
+
rescue => ex
|
72
|
+
results = results.join "\n"
|
73
|
+
|
74
|
+
File.open('gem_make.out', 'wb') { |f| f.puts results }
|
75
|
+
|
76
|
+
mesage = <<-EOF
|
77
|
+
ERROR: Failed to build gem native extension."
|
78
|
+
|
79
|
+
#{results}
|
80
|
+
|
81
|
+
Results logged to #{File.join(Dir.pwd, 'gem_make.out')}
|
82
|
+
EOF
|
83
|
+
|
84
|
+
raise ExtensionBuildError, message
|
85
|
+
ensure
|
86
|
+
Dir.chdir start_dir
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
spec.extensions = []
|
91
|
+
|
92
|
+
built_files = Dir.glob("#{dest_path}/**/*")
|
93
|
+
basedir = File.join gem_dir, ""
|
94
|
+
built_files.each {|path| path.slice!(0, basedir.length) }
|
95
|
+
|
96
|
+
spec.files = (spec.files + built_files).sort.uniq
|
97
|
+
spec.platform = platform if platform
|
98
|
+
|
99
|
+
Dir.chdir gem_dir
|
100
|
+
begin
|
101
|
+
out_fname = Gem::Builder.new(spec).build
|
102
|
+
FileUtils.mv(out_fname, start_dir)
|
103
|
+
ensure
|
104
|
+
Dir.chdir start_dir
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gem-compile
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- FURUHASHI Sadayuki
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-03-31 00:00:00 +09:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: frsyuki@users.sourceforge.jp
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README.md
|
24
|
+
- AUTHORS
|
25
|
+
files:
|
26
|
+
- lib/rubygems/commands/compile_command.rb
|
27
|
+
- lib/rubygems/compiler.rb
|
28
|
+
- lib/rubygems_plugin.rb
|
29
|
+
- bin/gem-compile
|
30
|
+
- README.md
|
31
|
+
- AUTHORS
|
32
|
+
has_rdoc: true
|
33
|
+
homepage: http://github.com/frsyuki/gem-compile
|
34
|
+
licenses: []
|
35
|
+
|
36
|
+
post_install_message:
|
37
|
+
rdoc_options: []
|
38
|
+
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
version:
|
47
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: "0"
|
52
|
+
version:
|
53
|
+
requirements: []
|
54
|
+
|
55
|
+
rubyforge_project:
|
56
|
+
rubygems_version: 1.3.5
|
57
|
+
signing_key:
|
58
|
+
specification_version: 3
|
59
|
+
summary: gem-compile, create binary gems from gems with extensions
|
60
|
+
test_files: []
|
61
|
+
|