dedc09a163df5597213708f8fe08b5a19d74f49b
[packages/precise/mcollective.git] / lib / mcollective / vendor / json / Rakefile
1 begin
2   require 'rubygems/package_task'
3 rescue LoadError
4 end
5
6 require 'rbconfig'
7 begin
8   include RbConfig
9 rescue NameError
10   include Config
11 end
12
13
14 require 'rake/clean'
15 CLOBBER.include Dir['benchmarks/data/*.{dat,log}'], 'doc', 'Gemfile.lock'
16 CLEAN.include FileList['diagrams/*.*'], 'doc', 'coverage', 'tmp',
17   FileList["ext/**/{Makefile,mkmf.log}"], 'build', 'dist', FileList['**/*.rbc'],
18   FileList["{ext,lib}/**/*.{so,bundle,#{CONFIG['DLEXT']},o,obj,pdb,lib,manifest,exp,def,jar,class,dSYM}"],
19   FileList['java/src/**/*.class']
20
21 MAKE = ENV['MAKE'] || %w[gmake make].find { |c| system(c, '-v') }
22 PKG_NAME          = 'json'
23 PKG_TITLE         = 'JSON Implementation for Ruby'
24 PKG_VERSION       = File.read('VERSION').chomp
25 PKG_FILES         = FileList["**/*"].exclude(/CVS|pkg|tmp|coverage|Makefile|\.nfs\.|\.iml\Z/).exclude(/\.(so|bundle|o|class|#{CONFIG['DLEXT']})$/)
26
27 EXT_ROOT_DIR      = 'ext/json/ext'
28 EXT_PARSER_DIR    = "#{EXT_ROOT_DIR}/parser"
29 EXT_PARSER_DL     = "#{EXT_PARSER_DIR}/parser.#{CONFIG['DLEXT']}"
30 RAGEL_PATH        = "#{EXT_PARSER_DIR}/parser.rl"
31 EXT_PARSER_SRC    = "#{EXT_PARSER_DIR}/parser.c"
32 PKG_FILES << EXT_PARSER_SRC
33 EXT_GENERATOR_DIR = "#{EXT_ROOT_DIR}/generator"
34 EXT_GENERATOR_DL  = "#{EXT_GENERATOR_DIR}/generator.#{CONFIG['DLEXT']}"
35 EXT_GENERATOR_SRC = "#{EXT_GENERATOR_DIR}/generator.c"
36
37 JAVA_DIR            = "java/src/json/ext"
38 JAVA_RAGEL_PATH     = "#{JAVA_DIR}/Parser.rl"
39 JAVA_PARSER_SRC     = "#{JAVA_DIR}/Parser.java"
40 JAVA_SOURCES        = FileList["#{JAVA_DIR}/*.java"]
41 JAVA_CLASSES        = []
42 JRUBY_PARSER_JAR    = File.expand_path("lib/json/ext/parser.jar")
43 JRUBY_GENERATOR_JAR = File.expand_path("lib/json/ext/generator.jar")
44
45 RAGEL_CODEGEN     = %w[rlcodegen rlgen-cd ragel].find { |c| system(c, '-v') }
46 RAGEL_DOTGEN      = %w[rlgen-dot rlgen-cd ragel].find { |c| system(c, '-v') }
47
48 def myruby(*args, &block)
49   @myruby ||= File.join(CONFIG['bindir'], CONFIG['ruby_install_name'])
50   options = (Hash === args.last) ? args.pop : {}
51   if args.length > 1 then
52     sh(*([@myruby] + args + [options]), &block)
53   else
54     sh("#{@myruby} #{args.first}", options, &block)
55   end
56 end
57
58 desc "Installing library (pure)"
59 task :install_pure => :version do
60   myruby 'install.rb'
61 end
62
63 task :install_ext_really do
64   sitearchdir = CONFIG["sitearchdir"]
65   cd 'ext' do
66     for file in Dir["json/ext/*.#{CONFIG['DLEXT']}"]
67       d = File.join(sitearchdir, file)
68       mkdir_p File.dirname(d)
69       install(file, d)
70     end
71     warn " *** Installed EXT ruby library."
72   end
73 end
74
75 desc "Installing library (extension)"
76 task :install_ext => [ :compile, :install_pure, :install_ext_really ]
77
78 desc "Installing library (extension)"
79 if RUBY_PLATFORM =~ /java/
80   task :install => :install_pure
81 else
82   task :install => :install_ext
83 end
84
85 if defined?(Gem) and defined?(Gem::PackageTask)
86   spec_pure = Gem::Specification.new do |s|
87     s.name = 'json_pure'
88     s.version = PKG_VERSION
89     s.summary = PKG_TITLE
90     s.description = "This is a JSON implementation in pure Ruby."
91
92     s.files = PKG_FILES
93
94     s.require_path = 'lib'
95     s.add_development_dependency 'permutation'
96     s.add_development_dependency 'bullshit'
97     s.add_development_dependency 'sdoc'
98     s.add_development_dependency 'rake', '~>0.9.2'
99     s.add_dependency 'spruz', '~>0.2.8'
100
101     s.bindir = "bin"
102     s.executables = [ "edit_json.rb", "prettify_json.rb" ]
103
104     s.extra_rdoc_files << 'README.rdoc'
105     s.rdoc_options <<
106       '--title' <<  'JSON implemention for ruby' << '--main' << 'README.rdoc'
107     s.test_files.concat Dir['./tests/test_*.rb']
108
109     s.author = "Florian Frank"
110     s.email = "flori@ping.de"
111     s.homepage = "http://flori.github.com/#{PKG_NAME}"
112     s.rubyforge_project = "json"
113   end
114
115   desc 'Creates a json_pure.gemspec file'
116   task :gemspec_pure => :version do
117     File.open('json_pure.gemspec', 'w') do |gemspec|
118       gemspec.write spec_pure.to_ruby
119     end
120   end
121
122   Gem::PackageTask.new(spec_pure) do |pkg|
123       pkg.need_tar = true
124       pkg.package_files = PKG_FILES
125   end
126
127   spec_ext = Gem::Specification.new do |s|
128     s.name = 'json'
129     s.version = PKG_VERSION
130     s.summary = PKG_TITLE
131     s.description = "This is a JSON implementation as a Ruby extension in C."
132
133     s.files = PKG_FILES
134
135     s.extensions = FileList['ext/**/extconf.rb']
136
137     s.require_path = EXT_ROOT_DIR
138     s.require_paths << 'ext'
139     s.require_paths << 'lib'
140     s.add_development_dependency 'permutation'
141     s.add_development_dependency 'bullshit'
142     s.add_development_dependency 'sdoc'
143
144     s.bindir = "bin"
145     s.executables = [ "edit_json.rb", "prettify_json.rb" ]
146
147     s.extra_rdoc_files << 'README.rdoc'
148     s.rdoc_options <<
149       '--title' <<  'JSON implemention for Ruby' << '--main' << 'README.rdoc'
150     s.test_files.concat Dir['./tests/test_*.rb']
151
152     s.author = "Florian Frank"
153     s.email = "flori@ping.de"
154     s.homepage = "http://flori.github.com/#{PKG_NAME}"
155     s.rubyforge_project = "json"
156   end
157
158   desc 'Creates a json.gemspec file'
159   task :gemspec_ext => :version do
160     File.open('json.gemspec', 'w') do |gemspec|
161       gemspec.write spec_ext.to_ruby
162     end
163   end
164
165   Gem::PackageTask.new(spec_ext) do |pkg|
166     pkg.need_tar      = true
167     pkg.package_files = PKG_FILES
168   end
169
170
171   desc 'Create all gemspec files'
172   task :gemspec => [ :gemspec_pure, :gemspec_ext ]
173 end
174
175 desc m = "Writing version information for #{PKG_VERSION}"
176 task :version do
177   puts m
178   File.open(File.join('lib', 'json', 'version.rb'), 'w') do |v|
179     v.puts <<EOT
180 module JSON
181   # JSON version
182   VERSION         = '#{PKG_VERSION}'
183   VERSION_ARRAY   = VERSION.split(/\\./).map { |x| x.to_i } # :nodoc:
184   VERSION_MAJOR   = VERSION_ARRAY[0] # :nodoc:
185   VERSION_MINOR   = VERSION_ARRAY[1] # :nodoc:
186   VERSION_BUILD   = VERSION_ARRAY[2] # :nodoc:
187 end
188 EOT
189   end
190 end
191
192 desc "Testing library (pure ruby)"
193 task :test_pure => :clean do
194   ENV['JSON'] = 'pure'
195   ENV['RUBYOPT'] = "-Ilib #{ENV['RUBYOPT']}"
196   myruby '-S', 'testrb', *Dir['./tests/test_*.rb']
197 end
198
199 desc "Testing library (pure ruby and extension)"
200 task :test => [ :test_pure, :test_ext ]
201
202 namespace :gems do
203   task :install do
204     sh 'bundle'
205   end
206 end
207
208 if defined?(RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
209   if ENV.key?('JAVA_HOME')
210     warn " *** JAVA_HOME was set to #{ENV['JAVA_HOME'].inspect}"
211   else File.directory?(local_java = '/usr/local/java/jdk')
212     ENV['JAVA_HOME'] = local_java
213     warn " *** JAVA_HOME is set to #{ENV['JAVA_HOME'].inspect}"
214     ENV['PATH'] = ENV['PATH'].split(/:/).unshift(java_path = "#{ENV['JAVA_HOME']}/bin") * ':'
215     warn " *** java binaries are assumed to be in #{java_path.inspect}"
216   end
217
218   file JAVA_PARSER_SRC => JAVA_RAGEL_PATH do
219     cd JAVA_DIR do
220       if RAGEL_CODEGEN == 'ragel'
221         sh "ragel Parser.rl -J -o Parser.java"
222       else
223         sh "ragel -x Parser.rl | #{RAGEL_CODEGEN} -J"
224       end
225     end
226   end
227
228   desc "Generate parser for java with ragel"
229   task :ragel => JAVA_PARSER_SRC
230
231   desc "Delete the ragel generated Java source"
232   task :ragel_clean do
233     rm_rf JAVA_PARSER_SRC
234   end
235
236   JRUBY_JAR = File.join(CONFIG["libdir"], "jruby.jar")
237   if File.exist?(JRUBY_JAR)
238     JAVA_SOURCES.each do |src|
239       classpath = (Dir['java/lib/*.jar'] << 'java/src' << JRUBY_JAR) * ':'
240       obj = src.sub(/\.java\Z/, '.class')
241       file obj => src do
242         sh 'javac', '-classpath', classpath, '-source', '1.5', src
243       end
244       JAVA_CLASSES << obj
245     end
246   else
247     warn "WARNING: Cannot find jruby in path => Cannot build jruby extension!"
248   end
249
250   desc "Compiling jruby extension"
251   task :compile => JAVA_CLASSES
252
253   desc "Package the jruby gem"
254   task :jruby_gem => :create_jar do
255     sh 'gem build json-java.gemspec'
256     mkdir_p 'pkg'
257     mv "json-#{PKG_VERSION}-java.gem", 'pkg'
258   end
259
260   desc "Testing library (jruby)"
261   task :test_ext => :create_jar do
262     ENV['JSON'] = 'ext'
263     myruby '-S', 'testrb', '-Ilib', *Dir['./tests/test_*.rb']
264   end
265
266   file JRUBY_PARSER_JAR => :compile do
267     cd 'java/src' do
268       parser_classes = FileList[
269         "json/ext/ByteListTranscoder*.class",
270         "json/ext/OptionsReader*.class",
271         "json/ext/Parser*.class",
272         "json/ext/RuntimeInfo*.class",
273         "json/ext/StringDecoder*.class",
274         "json/ext/Utils*.class"
275       ]
276       sh 'jar', 'cf', File.basename(JRUBY_PARSER_JAR), *parser_classes
277       mv File.basename(JRUBY_PARSER_JAR), File.dirname(JRUBY_PARSER_JAR)
278     end
279   end
280
281   desc "Create parser jar"
282   task :create_parser_jar => JRUBY_PARSER_JAR
283
284   file JRUBY_GENERATOR_JAR => :compile do
285     cd 'java/src' do
286       generator_classes = FileList[
287         "json/ext/ByteListTranscoder*.class",
288         "json/ext/OptionsReader*.class",
289         "json/ext/Generator*.class",
290         "json/ext/RuntimeInfo*.class",
291         "json/ext/StringEncoder*.class",
292         "json/ext/Utils*.class"
293       ]
294       sh 'jar', 'cf', File.basename(JRUBY_GENERATOR_JAR), *generator_classes
295       mv File.basename(JRUBY_GENERATOR_JAR), File.dirname(JRUBY_GENERATOR_JAR)
296     end
297   end
298
299   desc "Create generator jar"
300   task :create_generator_jar => JRUBY_GENERATOR_JAR
301
302   desc "Create parser and generator jars"
303   task :create_jar => [ :create_parser_jar, :create_generator_jar ]
304
305   desc "Build all gems and archives for a new release of the jruby extension."
306   task :build => [ :clean, :version, :jruby_gem ]
307
308   task :release => :build
309 else
310   desc "Compiling extension"
311   task :compile => [ EXT_PARSER_DL, EXT_GENERATOR_DL ]
312
313   file EXT_PARSER_DL => EXT_PARSER_SRC do
314     cd EXT_PARSER_DIR do
315       myruby 'extconf.rb'
316       sh MAKE
317     end
318     cp "#{EXT_PARSER_DIR}/parser.#{CONFIG['DLEXT']}", EXT_ROOT_DIR
319   end
320
321   file EXT_GENERATOR_DL => EXT_GENERATOR_SRC do
322     cd EXT_GENERATOR_DIR do
323       myruby 'extconf.rb'
324       sh MAKE
325     end
326     cp "#{EXT_GENERATOR_DIR}/generator.#{CONFIG['DLEXT']}", EXT_ROOT_DIR
327   end
328
329   desc "Testing library (extension)"
330   task :test_ext => :compile do
331     ENV['JSON'] = 'ext'
332     ENV['RUBYOPT'] = "-Iext:lib #{ENV['RUBYOPT']}"
333     myruby '-S', 'testrb', *Dir['./tests/test_*.rb']
334   end
335
336   desc "Benchmarking parser"
337   task :benchmark_parser do
338     ENV['RUBYOPT'] = "-Ilib:ext #{ENV['RUBYOPT']}"
339     myruby 'benchmarks/parser_benchmark.rb'
340     myruby 'benchmarks/parser2_benchmark.rb'
341   end
342
343   desc "Benchmarking generator"
344   task :benchmark_generator do
345     ENV['RUBYOPT'] = "-Ilib:ext #{ENV['RUBYOPT']}"
346     myruby 'benchmarks/generator_benchmark.rb'
347     myruby 'benchmarks/generator2_benchmark.rb'
348   end
349
350   desc "Benchmarking library"
351   task :benchmark => [ :benchmark_parser, :benchmark_generator ]
352
353   desc "Create RDOC documentation"
354   task :doc => [ :version, EXT_PARSER_SRC ] do
355     sh "sdoc -o doc -t '#{PKG_TITLE}' -m README.rdoc README.rdoc lib/json.rb #{FileList['lib/json/**/*.rb']} #{EXT_PARSER_SRC} #{EXT_GENERATOR_SRC}"
356   end
357
358   desc "Generate parser with ragel"
359   task :ragel => EXT_PARSER_SRC
360
361   desc "Delete the ragel generated C source"
362   task :ragel_clean do
363     rm_rf EXT_PARSER_SRC
364   end
365
366   file EXT_PARSER_SRC => RAGEL_PATH do
367     cd EXT_PARSER_DIR do
368       if RAGEL_CODEGEN == 'ragel'
369         sh "ragel parser.rl -G2 -o parser.c"
370       else
371         sh "ragel -x parser.rl | #{RAGEL_CODEGEN} -G2"
372       end
373       src = File.read("parser.c").gsub(/[ \t]+$/, '')
374       File.open("parser.c", "w") {|f| f.print src}
375     end
376   end
377
378   desc "Generate diagrams of ragel parser (ps)"
379   task :ragel_dot_ps do
380     root = 'diagrams'
381     specs = []
382     File.new(RAGEL_PATH).grep(/^\s*machine\s*(\S+);\s*$/) { specs << $1 }
383     for s in specs
384       if RAGEL_DOTGEN == 'ragel'
385         sh "ragel #{RAGEL_PATH} -S#{s} -p -V | dot -Tps -o#{root}/#{s}.ps"
386       else
387         sh "ragel -x #{RAGEL_PATH} -S#{s} | #{RAGEL_DOTGEN} -p|dot -Tps -o#{root}/#{s}.ps"
388       end
389     end
390   end
391
392   desc "Generate diagrams of ragel parser (png)"
393   task :ragel_dot_png do
394     root = 'diagrams'
395     specs = []
396     File.new(RAGEL_PATH).grep(/^\s*machine\s*(\S+);\s*$/) { specs << $1 }
397     for s in specs
398       if RAGEL_DOTGEN == 'ragel'
399         sh "ragel #{RAGEL_PATH} -S#{s} -p -V | dot -Tpng -o#{root}/#{s}.png"
400       else
401         sh "ragel -x #{RAGEL_PATH} -S#{s} | #{RAGEL_DOTGEN} -p|dot -Tpng -o#{root}/#{s}.png"
402       end
403     end
404   end
405
406   desc "Generate diagrams of ragel parser"
407   task :ragel_dot => [ :ragel_dot_png, :ragel_dot_ps ]
408
409   desc "Build all gems and archives for a new release of json and json_pure."
410   task :build => [ :clean, :gemspec, :package ]
411
412   task :release => :build
413 end
414
415 desc "Compile in the the source directory"
416 task :default => [ :clean, :gemspec, :test ]