2 require 'rubygems/package_task'
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']
21 MAKE = ENV['MAKE'] || %w[gmake make].find { |c| system(c, '-v') }
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']})$/)
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"
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"]
42 JRUBY_PARSER_JAR = File.expand_path("lib/json/ext/parser.jar")
43 JRUBY_GENERATOR_JAR = File.expand_path("lib/json/ext/generator.jar")
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') }
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)
54 sh("#{@myruby} #{args.first}", options, &block)
58 desc "Installing library (pure)"
59 task :install_pure => :version do
63 task :install_ext_really do
64 sitearchdir = CONFIG["sitearchdir"]
66 for file in Dir["json/ext/*.#{CONFIG['DLEXT']}"]
67 d = File.join(sitearchdir, file)
68 mkdir_p File.dirname(d)
71 warn " *** Installed EXT ruby library."
75 desc "Installing library (extension)"
76 task :install_ext => [ :compile, :install_pure, :install_ext_really ]
78 desc "Installing library (extension)"
79 if RUBY_PLATFORM =~ /java/
80 task :install => :install_pure
82 task :install => :install_ext
85 if defined?(Gem) and defined?(Gem::PackageTask)
86 spec_pure = Gem::Specification.new do |s|
88 s.version = PKG_VERSION
90 s.description = "This is a JSON implementation in pure Ruby."
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'
102 s.executables = [ "edit_json.rb", "prettify_json.rb" ]
104 s.extra_rdoc_files << 'README.rdoc'
106 '--title' << 'JSON implemention for ruby' << '--main' << 'README.rdoc'
107 s.test_files.concat Dir['./tests/test_*.rb']
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"
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
122 Gem::PackageTask.new(spec_pure) do |pkg|
124 pkg.package_files = PKG_FILES
127 spec_ext = Gem::Specification.new do |s|
129 s.version = PKG_VERSION
130 s.summary = PKG_TITLE
131 s.description = "This is a JSON implementation as a Ruby extension in C."
135 s.extensions = FileList['ext/**/extconf.rb']
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'
145 s.executables = [ "edit_json.rb", "prettify_json.rb" ]
147 s.extra_rdoc_files << 'README.rdoc'
149 '--title' << 'JSON implemention for Ruby' << '--main' << 'README.rdoc'
150 s.test_files.concat Dir['./tests/test_*.rb']
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"
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
165 Gem::PackageTask.new(spec_ext) do |pkg|
167 pkg.package_files = PKG_FILES
171 desc 'Create all gemspec files'
172 task :gemspec => [ :gemspec_pure, :gemspec_ext ]
175 desc m = "Writing version information for #{PKG_VERSION}"
178 File.open(File.join('lib', 'json', 'version.rb'), 'w') do |v|
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:
192 desc "Testing library (pure ruby)"
193 task :test_pure => :clean do
195 ENV['RUBYOPT'] = "-Ilib #{ENV['RUBYOPT']}"
196 myruby '-S', 'testrb', *Dir['./tests/test_*.rb']
199 desc "Testing library (pure ruby and extension)"
200 task :test => [ :test_pure, :test_ext ]
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}"
218 file JAVA_PARSER_SRC => JAVA_RAGEL_PATH do
220 if RAGEL_CODEGEN == 'ragel'
221 sh "ragel Parser.rl -J -o Parser.java"
223 sh "ragel -x Parser.rl | #{RAGEL_CODEGEN} -J"
228 desc "Generate parser for java with ragel"
229 task :ragel => JAVA_PARSER_SRC
231 desc "Delete the ragel generated Java source"
233 rm_rf JAVA_PARSER_SRC
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')
242 sh 'javac', '-classpath', classpath, '-source', '1.5', src
247 warn "WARNING: Cannot find jruby in path => Cannot build jruby extension!"
250 desc "Compiling jruby extension"
251 task :compile => JAVA_CLASSES
253 desc "Package the jruby gem"
254 task :jruby_gem => :create_jar do
255 sh 'gem build json-java.gemspec'
257 mv "json-#{PKG_VERSION}-java.gem", 'pkg'
260 desc "Testing library (jruby)"
261 task :test_ext => :create_jar do
263 myruby '-S', 'testrb', '-Ilib', *Dir['./tests/test_*.rb']
266 file JRUBY_PARSER_JAR => :compile 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"
276 sh 'jar', 'cf', File.basename(JRUBY_PARSER_JAR), *parser_classes
277 mv File.basename(JRUBY_PARSER_JAR), File.dirname(JRUBY_PARSER_JAR)
281 desc "Create parser jar"
282 task :create_parser_jar => JRUBY_PARSER_JAR
284 file JRUBY_GENERATOR_JAR => :compile 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"
294 sh 'jar', 'cf', File.basename(JRUBY_GENERATOR_JAR), *generator_classes
295 mv File.basename(JRUBY_GENERATOR_JAR), File.dirname(JRUBY_GENERATOR_JAR)
299 desc "Create generator jar"
300 task :create_generator_jar => JRUBY_GENERATOR_JAR
302 desc "Create parser and generator jars"
303 task :create_jar => [ :create_parser_jar, :create_generator_jar ]
305 desc "Build all gems and archives for a new release of the jruby extension."
306 task :build => [ :clean, :version, :jruby_gem ]
308 task :release => :build
310 desc "Compiling extension"
311 task :compile => [ EXT_PARSER_DL, EXT_GENERATOR_DL ]
313 file EXT_PARSER_DL => EXT_PARSER_SRC do
318 cp "#{EXT_PARSER_DIR}/parser.#{CONFIG['DLEXT']}", EXT_ROOT_DIR
321 file EXT_GENERATOR_DL => EXT_GENERATOR_SRC do
322 cd EXT_GENERATOR_DIR do
326 cp "#{EXT_GENERATOR_DIR}/generator.#{CONFIG['DLEXT']}", EXT_ROOT_DIR
329 desc "Testing library (extension)"
330 task :test_ext => :compile do
332 ENV['RUBYOPT'] = "-Iext:lib #{ENV['RUBYOPT']}"
333 myruby '-S', 'testrb', *Dir['./tests/test_*.rb']
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'
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'
350 desc "Benchmarking library"
351 task :benchmark => [ :benchmark_parser, :benchmark_generator ]
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}"
358 desc "Generate parser with ragel"
359 task :ragel => EXT_PARSER_SRC
361 desc "Delete the ragel generated C source"
366 file EXT_PARSER_SRC => RAGEL_PATH do
368 if RAGEL_CODEGEN == 'ragel'
369 sh "ragel parser.rl -G2 -o parser.c"
371 sh "ragel -x parser.rl | #{RAGEL_CODEGEN} -G2"
373 src = File.read("parser.c").gsub(/[ \t]+$/, '')
374 File.open("parser.c", "w") {|f| f.print src}
378 desc "Generate diagrams of ragel parser (ps)"
379 task :ragel_dot_ps do
382 File.new(RAGEL_PATH).grep(/^\s*machine\s*(\S+);\s*$/) { specs << $1 }
384 if RAGEL_DOTGEN == 'ragel'
385 sh "ragel #{RAGEL_PATH} -S#{s} -p -V | dot -Tps -o#{root}/#{s}.ps"
387 sh "ragel -x #{RAGEL_PATH} -S#{s} | #{RAGEL_DOTGEN} -p|dot -Tps -o#{root}/#{s}.ps"
392 desc "Generate diagrams of ragel parser (png)"
393 task :ragel_dot_png do
396 File.new(RAGEL_PATH).grep(/^\s*machine\s*(\S+);\s*$/) { specs << $1 }
398 if RAGEL_DOTGEN == 'ragel'
399 sh "ragel #{RAGEL_PATH} -S#{s} -p -V | dot -Tpng -o#{root}/#{s}.png"
401 sh "ragel -x #{RAGEL_PATH} -S#{s} | #{RAGEL_DOTGEN} -p|dot -Tpng -o#{root}/#{s}.png"
406 desc "Generate diagrams of ragel parser"
407 task :ragel_dot => [ :ragel_dot_png, :ragel_dot_ps ]
409 desc "Build all gems and archives for a new release of json and json_pure."
410 task :build => [ :clean, :gemspec, :package ]
412 task :release => :build
415 desc "Compile in the the source directory"
416 task :default => [ :clean, :gemspec, :test ]