rake-builder 0.0.12 → 0.0.13
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/Rakefile +1 -0
- data/lib/compiler.rb +84 -0
- data/lib/rake/builder/qt_builder.rb +103 -25
- data/lib/rake/builder.rb +75 -34
- metadata +7 -5
data/Rakefile
CHANGED
data/lib/compiler.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
|
2
|
+
module Compiler
|
3
|
+
|
4
|
+
class Base
|
5
|
+
EXTRA_PATHS = [ '/opt/local/include' ]
|
6
|
+
|
7
|
+
def self.for( compiler )
|
8
|
+
COMPILERS[ compiler ].new
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@paths = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def include_paths( headers )
|
16
|
+
paths = []
|
17
|
+
headers.each do | header |
|
18
|
+
path = find_header( header )
|
19
|
+
raise "Can't find header '#{ header }' in any known include path" if path.nil?
|
20
|
+
paths << path
|
21
|
+
end
|
22
|
+
paths.uniq
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def find_header( header )
|
28
|
+
EXTRA_PATHS.each do | path |
|
29
|
+
if File.exist?( "#{ path }/#{ header }" )
|
30
|
+
return path
|
31
|
+
end
|
32
|
+
end
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
class GCC < Base
|
39
|
+
|
40
|
+
def self.framework_path( framework, qt_major )
|
41
|
+
"/Library/Frameworks/#{ framework }.framework/Versions/#{ qt_major }/Headers"
|
42
|
+
end
|
43
|
+
|
44
|
+
def default_include_paths( language )
|
45
|
+
return @paths[ language ] if @paths[ language ]
|
46
|
+
|
47
|
+
paths = []
|
48
|
+
# Below is the recommended(!) way of getting standard serach paths from GCC
|
49
|
+
output = `echo | gcc -v -x #{ language } -E - 2>&1 1>/dev/null`
|
50
|
+
collecting = false
|
51
|
+
output.each_line do | line |
|
52
|
+
case
|
53
|
+
when line =~ /#include <\.\.\.> search starts here:/
|
54
|
+
collecting = true
|
55
|
+
when line =~ /End of search list\./
|
56
|
+
collecting = false
|
57
|
+
when line =~ / \(framework directory\)/
|
58
|
+
# Skip frameworks
|
59
|
+
else
|
60
|
+
paths << line.strip if collecting
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
@paths[ language ] = paths
|
65
|
+
end
|
66
|
+
|
67
|
+
def missing_headers( include_paths, source_files )
|
68
|
+
include_path = include_paths.map { | path | "-I#{ path }" }.join( ' ' )
|
69
|
+
command = "makedepend -f- -- #{ include_path } -- #{ source_files.join( ' ' ) } 2>&1 1>/dev/null"
|
70
|
+
output = `#{ command }`
|
71
|
+
missing = []
|
72
|
+
output.each_line do | line |
|
73
|
+
match = line.match( /cannot find include file "([^"]*)"/m )
|
74
|
+
missing << match[ 1 ] if match
|
75
|
+
end
|
76
|
+
|
77
|
+
missing
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
COMPILERS = { :gcc => GCC }
|
83
|
+
|
84
|
+
end
|
@@ -8,10 +8,10 @@ module Rake
|
|
8
8
|
# generate Info.plist
|
9
9
|
# package task
|
10
10
|
|
11
|
+
attr_accessor :qt_version
|
11
12
|
attr_accessor :frameworks
|
12
13
|
attr_accessor :resource_files
|
13
|
-
attr_accessor :
|
14
|
-
attr_accessor :architecture
|
14
|
+
attr_accessor :ui_files
|
15
15
|
|
16
16
|
def initialize( &block )
|
17
17
|
super( &block )
|
@@ -25,11 +25,20 @@ module Rake
|
|
25
25
|
super
|
26
26
|
@programming_language = 'c++'
|
27
27
|
@header_file_extension = 'h'
|
28
|
-
@frameworks = [
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
@frameworks = []
|
29
|
+
case
|
30
|
+
when RUBY_PLATFORM =~ /linux$/
|
31
|
+
@include_paths << '/usr/include/qt4'
|
32
|
+
@moc_defines = [ '-D__GNUC__' ]
|
33
|
+
when RUBY_PLATFORM =~ /darwin/i
|
34
|
+
@framework_paths = [ '/Library/Frameworks' ]
|
35
|
+
@moc_defines = [ '-D__APPLE__', '-D__GNUC__' ]
|
36
|
+
else
|
37
|
+
raise "Unrecognised platform"
|
38
|
+
end
|
39
|
+
@compilation_defines = [ '-DQT_GUI_LIB', '-DQT_CORE_LIB', '-DQT_SHARED' ]
|
32
40
|
@resource_files = []
|
41
|
+
@ui_files = []
|
33
42
|
end
|
34
43
|
|
35
44
|
def configure
|
@@ -39,37 +48,83 @@ module Rake
|
|
39
48
|
super
|
40
49
|
|
41
50
|
@resource_files = Rake::Path.expand_all_with_root( @resource_files, @rakefile_path )
|
51
|
+
@ui_files = Rake::Path.expand_all_with_root( @ui_files, @rakefile_path )
|
42
52
|
@compilation_options += [ '-pipe', '-g', '-gdwarf-2', '-Wall', '-W' ]
|
43
|
-
@
|
44
|
-
@architecture ||= 'i386'
|
45
|
-
@compilation_options += [ architecture_option ]
|
46
|
-
|
47
|
-
@frameworks.each do | framework |
|
48
|
-
@include_paths << "/Library/Frameworks/#{ framework }.framework/Versions/#{ qt_major }/Headers"
|
49
|
-
@include_paths << "/usr/include/#{ framework }"
|
50
|
-
end
|
53
|
+
@include_paths << @objects_path # for UI headers
|
51
54
|
end
|
52
55
|
|
53
56
|
def define
|
54
57
|
super
|
58
|
+
define_ui_tasks
|
55
59
|
define_moc_tasks
|
56
60
|
define_resource_tasks
|
57
61
|
end
|
58
62
|
|
59
63
|
def generated_files
|
60
|
-
super + moc_files + qrc_files
|
64
|
+
super + moc_files + ui_headers + qrc_files
|
65
|
+
end
|
66
|
+
|
67
|
+
def generated_headers
|
68
|
+
super + ui_headers
|
61
69
|
end
|
62
70
|
|
63
71
|
def source_files
|
64
72
|
( super + moc_files + qrc_files ).uniq
|
65
73
|
end
|
66
74
|
|
75
|
+
def header_files
|
76
|
+
( super + ui_headers ).uniq
|
77
|
+
end
|
78
|
+
|
67
79
|
def compiler_flags
|
68
|
-
|
80
|
+
flags = compilation_options + @compilation_defines + [ include_path ]
|
81
|
+
if RUBY_PLATFORM =~ /darwin/i
|
82
|
+
flags += framework_paths
|
83
|
+
flags << architecture_option
|
84
|
+
end
|
85
|
+
flags.join( ' ' )
|
69
86
|
end
|
70
87
|
|
71
88
|
def link_flags
|
72
|
-
|
89
|
+
flags = [ @linker_options, library_paths_list, library_dependencies_list ]
|
90
|
+
if RUBY_PLATFORM =~ /darwin/i
|
91
|
+
flags += [ '-headerpad_max_install_names', architecture_option ]
|
92
|
+
flags += framework_paths + framework_options
|
93
|
+
end
|
94
|
+
flags.join( ' ' )
|
95
|
+
end
|
96
|
+
|
97
|
+
# Exclude paths like QtFoo/Bar, but grab frameworks
|
98
|
+
def missing_headers
|
99
|
+
super
|
100
|
+
@missing_headers.reject! do | path |
|
101
|
+
m = path.match( /^(Qt\w+)\/(\w+?(?:\.h)?)$/ )
|
102
|
+
if m
|
103
|
+
framework = m[ 1 ]
|
104
|
+
@frameworks << framework
|
105
|
+
framework_path = Compiler::GCC.framework_path( framework, qt_major )
|
106
|
+
header_path = "#{ framework_path }/#{ m[ 2 ] }"
|
107
|
+
File.exist?( header_path )
|
108
|
+
else
|
109
|
+
false
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
@frameworks.each do | framework |
|
114
|
+
@include_paths << Compiler::GCC.framework_path( framework, qt_major )
|
115
|
+
@include_paths << "/usr/include/#{ framework }"
|
116
|
+
end
|
117
|
+
|
118
|
+
# Last chance: exclude headers of the form 'Aaaaaa' if found under frameworks
|
119
|
+
@missing_headers.reject! do | header |
|
120
|
+
@frameworks.any? do | framework |
|
121
|
+
framework_path = Compiler::GCC.framework_path( framework, qt_major )
|
122
|
+
header_path = "#{ framework_path }/#{ header }"
|
123
|
+
File.exist?( header_path )
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
@missing_headers
|
73
128
|
end
|
74
129
|
|
75
130
|
# QT-specific
|
@@ -78,18 +133,38 @@ module Rake
|
|
78
133
|
@qt_version.match( /^(\d+)/ )[ 1 ]
|
79
134
|
end
|
80
135
|
|
81
|
-
def
|
82
|
-
"-
|
136
|
+
def framework_paths
|
137
|
+
@framework_paths.map { |p| "-F#{ p }" }
|
138
|
+
end
|
139
|
+
|
140
|
+
def framework_options
|
141
|
+
@frameworks.map { |p| "-framework #{ p }" }
|
83
142
|
end
|
84
143
|
|
85
|
-
|
86
|
-
|
144
|
+
# UI
|
145
|
+
# /Developer/Tools/Qt/uic ../scanner_cpp/mainwindow.ui -o ui_mainwindow.h
|
146
|
+
|
147
|
+
def define_ui_tasks
|
148
|
+
@ui_files.each do | ui_file |
|
149
|
+
ui_header = ui_header_path( ui_file )
|
150
|
+
file ui_header => [ @objects_path, ui_file ] do |t|
|
151
|
+
command = "uic #{ ui_file } -o #{ ui_header }"
|
152
|
+
shell command
|
153
|
+
end
|
154
|
+
end
|
87
155
|
end
|
88
156
|
|
89
|
-
def
|
90
|
-
@
|
157
|
+
def ui_headers
|
158
|
+
@ui_files.collect do | ui_file |
|
159
|
+
ui_header_path( ui_file )
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def ui_header_path( ui_file )
|
164
|
+
header_name = 'ui_' + File.basename( ui_file ).gsub( '.ui', '.h' )
|
165
|
+
Rake::Path.expand_with_root( header_name, @objects_path )
|
91
166
|
end
|
92
|
-
|
167
|
+
|
93
168
|
# MOC
|
94
169
|
|
95
170
|
def define_moc_tasks
|
@@ -98,7 +173,10 @@ module Rake
|
|
98
173
|
moc = moc_pathname( header_file )
|
99
174
|
|
100
175
|
file moc => [ header_file ] do |t|
|
101
|
-
|
176
|
+
options = @compilation_defines
|
177
|
+
options += framework_paths if RUBY_PLATFORM =~ /darwin/i
|
178
|
+
options += @moc_defines
|
179
|
+
command = "moc #{ options.join( ' ' ) } #{ header_file } -o #{ moc }"
|
102
180
|
shell command
|
103
181
|
end
|
104
182
|
|
data/lib/rake/builder.rb
CHANGED
@@ -5,6 +5,7 @@ require 'rake'
|
|
5
5
|
require 'rake/tasklib'
|
6
6
|
require 'rake/path'
|
7
7
|
require 'rake/file_task_alias'
|
8
|
+
require 'compiler'
|
8
9
|
|
9
10
|
module Rake
|
10
11
|
|
@@ -23,8 +24,8 @@ module Rake
|
|
23
24
|
module VERSION #:nodoc:
|
24
25
|
MAJOR = 0
|
25
26
|
MINOR = 0
|
26
|
-
TINY =
|
27
|
-
|
27
|
+
TINY = 13
|
28
|
+
|
28
29
|
STRING = [ MAJOR, MINOR, TINY ].join('.')
|
29
30
|
end
|
30
31
|
|
@@ -39,7 +40,10 @@ module Rake
|
|
39
40
|
# The types of file that can be built
|
40
41
|
TARGET_TYPES = [ :executable, :static_library, :shared_library ]
|
41
42
|
|
42
|
-
#
|
43
|
+
# processor type: 'i386', 'x86_64', 'ppc' or 'ppc64'.
|
44
|
+
attr_accessor :architecture
|
45
|
+
|
46
|
+
# The programming language: 'c++', 'c' or 'objective-c' (default 'c++')
|
43
47
|
# This also sets defaults for source_file_extension
|
44
48
|
attr_accessor :programming_language
|
45
49
|
|
@@ -165,6 +169,8 @@ module Rake
|
|
165
169
|
end
|
166
170
|
|
167
171
|
def initialize_attributes
|
172
|
+
@architecture = 'i386'
|
173
|
+
@compiler_data = Compiler::Base.for( :gcc )
|
168
174
|
@logger = Logger.new( STDOUT )
|
169
175
|
@logger.level = Logger::UNKNOWN
|
170
176
|
@logger.formatter = Formatter.new
|
@@ -179,9 +185,13 @@ module Rake
|
|
179
185
|
@target = 'a.out'
|
180
186
|
@generated_files = []
|
181
187
|
@compilation_options = []
|
188
|
+
@include_paths = []
|
182
189
|
end
|
183
190
|
|
184
191
|
def configure
|
192
|
+
@compilation_options += [ architecture_option ] if RUBY_PLATFORM =~ /apple/i
|
193
|
+
@compilation_options.uniq!
|
194
|
+
|
185
195
|
@programming_language.downcase!
|
186
196
|
raise "Don't know how to build '#{ @programming_language }' programs" if KNOWN_LANGUAGES[ @programming_language ].nil?
|
187
197
|
@compiler ||= KNOWN_LANGUAGES[ @programming_language ][ :compiler ]
|
@@ -201,7 +211,8 @@ module Rake
|
|
201
211
|
@install_path ||= default_install_path( @target_type )
|
202
212
|
|
203
213
|
@linker_options ||= ''
|
204
|
-
@include_paths
|
214
|
+
@include_paths += []
|
215
|
+
@include_paths = Rake::Path.expand_all_with_root( @include_paths.uniq, @rakefile_path )
|
205
216
|
@generated_files = Rake::Path.expand_all_with_root( @generated_files, @rakefile_path )
|
206
217
|
|
207
218
|
@default_task ||= :build
|
@@ -209,32 +220,9 @@ module Rake
|
|
209
220
|
|
210
221
|
@makedepend_file = @objects_path + '/.' + target_basename + '.depend.mf'
|
211
222
|
|
212
|
-
load_local_config
|
213
|
-
|
214
|
-
@include_paths = Rake::Path.expand_all_with_root( @include_paths, @rakefile_path )
|
215
|
-
|
216
223
|
raise "No source files found" if source_files.length == 0
|
217
224
|
end
|
218
225
|
|
219
|
-
def local_config
|
220
|
-
filename = '.rake-builder'
|
221
|
-
filename += '.' + @task_namespace.to_s if @task_namespace
|
222
|
-
Rake::Path.expand_with_root( filename, @rakefile_path )
|
223
|
-
end
|
224
|
-
|
225
|
-
def load_local_config
|
226
|
-
return if ! File.exist?( local_config )
|
227
|
-
|
228
|
-
config = YAML.load_file( local_config )
|
229
|
-
|
230
|
-
version = config[ :rake_builder ][ :config_file ][ :version ]
|
231
|
-
raise "Config file version missing" if version.nil?
|
232
|
-
|
233
|
-
@include_paths += config[ :include_paths ] if config[ :include_paths ]
|
234
|
-
rescue => e
|
235
|
-
raise "#{__FILE__}:#{__LINE__}: Failed to load local config file '#{ local_config }': #{ e.message }"
|
236
|
-
end
|
237
|
-
|
238
226
|
def define_tasks
|
239
227
|
if @task_namespace
|
240
228
|
namespace @task_namespace do
|
@@ -287,12 +275,38 @@ module Rake
|
|
287
275
|
|
288
276
|
directory @objects_path
|
289
277
|
|
290
|
-
file
|
278
|
+
file local_config => scoped_task( :missing_headers ) do
|
279
|
+
added_includes = @compiler_data.include_paths( missing_headers )
|
280
|
+
config = { :rake_builder => { :config_file => { :version=> '1.0' } },
|
281
|
+
:include_paths => added_includes }
|
282
|
+
File.open( local_config, 'w' ) do | file |
|
283
|
+
file.write config.to_yaml
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
file @makedepend_file => [ scoped_task( :load_local_config ),
|
288
|
+
scoped_task( :missing_headers ),
|
289
|
+
@objects_path,
|
290
|
+
*project_files ] do
|
291
291
|
@logger.add( Logger::DEBUG, "Analysing dependencies" )
|
292
292
|
command = "makedepend -f- -- #{ include_path } -- #{ file_list( source_files ) } 2>/dev/null > #{ @makedepend_file }"
|
293
293
|
shell command
|
294
294
|
end
|
295
295
|
|
296
|
+
task :load_local_config => local_config do
|
297
|
+
config = YAML.load_file( local_config )
|
298
|
+
|
299
|
+
version = config[ :rake_builder ][ :config_file ][ :version ]
|
300
|
+
raise "Config file version missing" if version.nil?
|
301
|
+
|
302
|
+
config[ :include_paths ] ||= []
|
303
|
+
@include_paths += Rake::Path.expand_all_with_root( config[ :include_paths ], @rakefile_path )
|
304
|
+
end
|
305
|
+
|
306
|
+
task :missing_headers => [ *generated_headers ] do
|
307
|
+
missing_headers
|
308
|
+
end
|
309
|
+
|
296
310
|
# Reimplemented mkdepend file loading to make objects depend on
|
297
311
|
# sources with the correct paths:
|
298
312
|
# the standard rake mkdepend loader doesn't do what we want,
|
@@ -355,6 +369,10 @@ module Rake
|
|
355
369
|
end
|
356
370
|
end
|
357
371
|
|
372
|
+
def generated_headers
|
373
|
+
[]
|
374
|
+
end
|
375
|
+
|
358
376
|
def scoped_task( task )
|
359
377
|
if @task_namespace
|
360
378
|
"#{ task_namespace }:#{ task }"
|
@@ -368,7 +386,8 @@ module Rake
|
|
368
386
|
@generated_files << object
|
369
387
|
file object => [ source ] do |t|
|
370
388
|
@logger.add( Logger::INFO, "Compiling '#{ source }'" )
|
371
|
-
|
389
|
+
command = "#{ @compiler } -c #{ compiler_flags } -o #{ object } #{ source }"
|
390
|
+
shell command
|
372
391
|
end
|
373
392
|
end
|
374
393
|
|
@@ -395,6 +414,15 @@ module Rake
|
|
395
414
|
end
|
396
415
|
end
|
397
416
|
|
417
|
+
# Discovery
|
418
|
+
|
419
|
+
def missing_headers
|
420
|
+
return @missing_headers if @missing_headers
|
421
|
+
default_includes = @compiler_data.default_include_paths( @programming_language )
|
422
|
+
all_includes = default_includes + @include_paths
|
423
|
+
@missing_headers = @compiler_data.missing_headers( all_includes, source_files )
|
424
|
+
end
|
425
|
+
|
398
426
|
# Compiling and linking parameters
|
399
427
|
|
400
428
|
def include_path
|
@@ -402,21 +430,34 @@ module Rake
|
|
402
430
|
end
|
403
431
|
|
404
432
|
def compiler_flags
|
405
|
-
include_path + ' ' + compilation_options.join(
|
433
|
+
flags = include_path + ' ' + compilation_options.join( ' ' )
|
434
|
+
flags << ' ' << architecture_option if RUBY_PLATFORM =~ /darwin/i
|
435
|
+
flags
|
436
|
+
end
|
437
|
+
|
438
|
+
def architecture_option
|
439
|
+
"-arch #{ @architecture }"
|
406
440
|
end
|
407
441
|
|
408
442
|
def link_flags
|
409
|
-
[ @linker_options, library_paths_list, library_dependencies_list ]
|
443
|
+
flags = [ @linker_options, architecture_option, library_paths_list, library_dependencies_list ]
|
444
|
+
flags << architecture_option if RUBY_PLATFORM =~ /darwin/i
|
445
|
+
flags.join( " " )
|
410
446
|
end
|
411
447
|
|
412
448
|
# Paths
|
413
449
|
|
450
|
+
def local_config
|
451
|
+
filename = '.rake-builder'
|
452
|
+
Rake::Path.expand_with_root( filename, @rakefile_path )
|
453
|
+
end
|
454
|
+
|
414
455
|
def save_rakefile_info( block )
|
415
456
|
if RUBY_VERSION < '1.9'
|
416
457
|
# Hack the path from the block String representation
|
417
458
|
@rakefile = block.to_s.match( /@([^\:]+):/ )[ 1 ]
|
418
459
|
else
|
419
|
-
@rakefile = block.source_location
|
460
|
+
@rakefile = block.source_location[ 0 ]
|
420
461
|
end
|
421
462
|
@rakefile_path = File.expand_path( File.dirname( @rakefile ) )
|
422
463
|
end
|
@@ -455,8 +496,8 @@ module Rake
|
|
455
496
|
source_files + header_files
|
456
497
|
end
|
457
498
|
|
458
|
-
def file_list( files )
|
459
|
-
files.join(
|
499
|
+
def file_list( files, delimiter = ' ' )
|
500
|
+
files.join( delimiter )
|
460
501
|
end
|
461
502
|
|
462
503
|
def library_paths_list
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rake-builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 5
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 13
|
10
|
+
version: 0.0.13
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joe Yates
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-02-20 00:00:00 +00:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -43,6 +43,7 @@ extensions: []
|
|
43
43
|
extra_rdoc_files:
|
44
44
|
- COPYING
|
45
45
|
- README.rdoc
|
46
|
+
- lib/compiler.rb
|
46
47
|
- lib/rake/builder/qt_builder.rb
|
47
48
|
- lib/rake/builder.rb
|
48
49
|
- lib/rake/file_task_alias.rb
|
@@ -59,6 +60,7 @@ files:
|
|
59
60
|
- COPYING
|
60
61
|
- Rakefile
|
61
62
|
- README.rdoc
|
63
|
+
- lib/compiler.rb
|
62
64
|
- lib/rake/builder/qt_builder.rb
|
63
65
|
- lib/rake/builder.rb
|
64
66
|
- lib/rake/file_task_alias.rb
|
@@ -131,7 +133,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
131
133
|
version: "0"
|
132
134
|
requirements: []
|
133
135
|
|
134
|
-
rubyforge_project:
|
136
|
+
rubyforge_project: nowarning
|
135
137
|
rubygems_version: 1.3.7
|
136
138
|
signing_key:
|
137
139
|
specification_version: 3
|