require 'erb' require 'open3' require 'rake/clean' require 'rake/testtask' require 'rubygems/package' CLEAN.include '**/*.o' CLEAN.include "**/*.#{(defined?(RbConfig) ? RbConfig : Config)::MAKEFILE_CONFIG['DLEXT']}" CLOBBER.include 'doc' CLOBBER.include '**/*.log' CLOBBER.include '**/Makefile' CLOBBER.include '**/extconf.h' CLOBBER.include '**/extconf.h' CLOBBER.include '**/whisper.*' CLOBBER.include '**/ggml.*' CLOBBER.include '**/dr_wav.h' BUILD_VERSION=2 # Determine the current version of the software if File.read('../../CMakeLists.txt') =~ /project.*\s*VERSION\s*(\d.+)\)/ CURRENT_VERSION = "#{$1}.#{BUILD_VERSION}" else CURRENT_VERSION = "0.0.0.#{BUILD_VERSION}" end def shell(args, opts = {}) puts "> #{args.join(' ')}" cmd, live_stream, cwd = args, opts[:live_stdout], opts[:cwd] Dir.chdir(cwd) { wait_thr = nil Open3.popen3(*cmd) do |stdin, stdout, stderr, thr| stdin.close wait_thr = thr # Ruby 1.8 will not yield thr, this will be nil while line = stdout.gets do live_stream.puts(line) if live_stream end while line = stderr.gets do puts line end end # prefer process handle directly from popen3, but if not available # fallback to global. p_status = wait_thr ? wait_thr.value : $? exit_code = p_status.exitstatus error = (exit_code != 0) } end make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make' MAKECMD = ENV['MAKE_CMD'] || make_program MAKEOPTS = ENV['MAKE_OPTS'] || '' WHISPER_SO = "ext/whisper.#{(defined?(RbConfig) ? RbConfig : Config)::MAKEFILE_CONFIG['DLEXT']}" file 'ext/Makefile' => 'ext/extconf.rb' do shell(['ruby', 'extconf.rb', ENV['EXTCONF_OPTS'].to_s], { live_stdout: STDOUT, cwd: "#{Dir.pwd}/ext" } ) end def make(target = '') shell(["#{MAKECMD}", "#{MAKEOPTS}", "#{target}"].reject(&:empty?), { live_stdout: STDOUT, cwd: "#{Dir.pwd}/ext" } ) end # Let make handle dependencies between c/o/so - we'll just run it. file WHISPER_SO => (['ext/Makefile'] + Dir['ext/*.cpp'] + Dir['ext/*.c'] + Dir['ext/*.h']) do make end desc "Compile the shared object" task :compile => [WHISPER_SO] desc "Default Task (Test project)" task :default => :test Rake::TestTask.new(:test) do |t| t.test_files = FileList['tests/test_*.rb'] t.verbose = false end desc 'Generate gem specification' task :gemspec do system("cp ../../LICENSE .") system("cp ../../README.md .") tspec = ERB.new(File.read(File.join(File.dirname(__FILE__),'lib','whispercpp.gemspec.erb'))) File.open(File.join(File.dirname(__FILE__),'whispercpp.gemspec'),'wb') do|f| f << tspec.result end end desc 'Build gem' task :package => :gemspec do spec_source = File.read File.join(File.dirname(__FILE__),'whispercpp.gemspec') spec = nil # see: http://gist.github.com/16215 Thread.new { spec = eval("#{spec_source}") }.join spec.validate Gem::Package.build(spec) end