task/ext.rake in rucy-0.1.2 vs task/ext.rake in rucy-0.1.3

- old
+ new

@@ -1,37 +1,96 @@ # -*- mode: ruby; coding: utf-8 -*- +require 'rbconfig' +require 'rucy/module' + + namespace :ext do - dir = "#{EXTDIR}/#{NAME}" - name = "#{NAME}/tester" - outname = "#{name}.#{EXTEXT}" - out = File.join EXTDIR, outname + rbconf = RbConfig::CONFIG + + mod = MODULE + name = env :NAME, MODULE.name.downcase + extdir = env :EXTDIR, 'ext' + docdir = env :DOCDIR, 'doc' + dlext = env :DLEXT, rbconf['DLEXT'] || 'so' + ruby = env :RUBY, 'ruby' + make = env :MAKE, 'make' + cc = env :CC, rbconf['CC'] || 'g++' + rdoc = env :RDOC, 'rdoc'# 'yardoc' + rucy2rdoc = env :RUCY2RDOC, 'rucy2rdoc' + defs = env :DEFS, [] + incdirs = env(:INCDIRS) ? env(:INCDIRS) : [] + cflags = env(:CFLAGS, '-Wall -O -g').dup + + dir = "#{extdir}/#{name}" + modname = "#{name}/native" + outname = "#{name}.#{dlext}" + out = File.join extdir, outname + + srcs = FileList["#{dir}/**/*.cpp"] + + incroot = rbconf['rubyhdrdir'] + incdirs.concat mod.include_dirs + Rucy.include_dirs + [ + incroot, + "#{incroot}/#{RUBY_PLATFORM}", + '/opt/local/include', + '/opt/include' + ] + incdirs.uniq! + + defs << 'WIN32' if win32? + defs << 'COCOA' if cocoa? + cflags << defs.map{|s| " -D#{s}"}.join + cflags << incdirs.map{|s| " -I#{s}"}.join + extconf = File.join dir, "extconf.rb" makefile = File.join dir, "Makefile" depend = File.join dir, "depend" - cpps = Dir.glob("#{dir}/**/*.cpp") + rdocdir = ".doc/#{dir}" + rdocs = Hash[srcs.map{|path| [path, "#{rdocdir}/#{File.basename path}"]}] + docindex = "#{docdir}/index.html" - task :build => makefile do - sh %( cd #{dir} && #{MAKE} ) - end + task :build => out + + task :rdoc => rdocs.values + + task :doc => docindex + task :clean do - sh %( cd #{dir} && #{MAKE} clean ) if File.exist? makefile - sh %( rm -f #{makefile} #{depend} ) + sh %( cd #{dir} && #{make} clean ) if File.exist? makefile + sh %( rm -rf #{makefile} #{depend} #{docdir} #{rdocs.values.join ' '} ) end + file out => makefile do + sh %( cd #{dir} && #{make} ) + end + file makefile => [extconf, depend] do - sh %( cd #{dir} && #{RUBY} #{File.basename extconf} ) + sh %( cd #{dir} && #{ruby} #{File.basename extconf} ) end - file depend => ["lib:build"] + cpps do - incdirs = INCDIRS.map{|s| " -I#{s}"}.join - srcs = cpps.map{|cpp| File.basename cpp}.join ' ' + file depend => ["lib:build"] + srcs do + inc = incdirs.map{|s| " -I#{s}"}.join + src = srcs.map{|cpp| File.basename cpp}.join ' ' dep = File.basename depend - sh %( cd #{dir} && #{CC} -M #{CFLAGS} #{incdirs} #{srcs} > #{dep} ) + sh %( cd #{dir} && #{cc} -M #{cflags} #{inc} #{src} > #{dep} ) end + + file docindex => "ext:rdoc" do + sh %( #{rdoc} #{rdocs.values.join ' '} ) + end + + rdocs.each do |(cpp, rdoc)| + file rdoc => [cpp, rdocdir] do + sh %( #{rucy2rdoc} #{cpp} > #{rdoc} ) + end + end + + directory rdocdir + end# :ext