Makefileのように更新されたファイルのみコンパイルするCakefileのメモ

はじめに

タイトルの通り、Makefileのように更新されたファイルのみコンパイルするCakefileが欲しかったので書いてみました。

Cakefile

やってることは単純で、CoffeeScriptファイルの最終更新時刻がJavaScriptファイルの時刻より新しければコンパイルするだけです。
SRCDIRにCoffeeScriptファイルがあるディレクトリのパスを、OUTDIRに生成されるJavaScriptファイルの保存先を指定してください。

sys  = require 'sys'
fs   = require 'fs'
exec = require('child_process').exec

COMMAND = 'coffee'
OPTIONS = '-cb'
SRCDIR = '.'    # *.coffeeファイルがあるディレクトリへのパス
OUTDIR = './js' # *.jsファイルの保存先

targetList = ['Hoge', 'Piyo']

# SRCDIR以下のすべてのCoffeeScriptファイルを指定したいときはこっち
#targetList = []
#for f in fs.readdirSync SRCDIR
#  targetList.push RegExp.$1 if f.match /^(\w+)\.coffee$/

task 'all', 'compile target files', ->
  for target in targetList
    try
      cs = fs.statSync "#{SRCDIR}/#{target}.coffee"
    catch error
      sys.puts "file not found: #{error.path}"
      continue
    try
      js = fs.statSync "#{OUTDIR}/#{target}.js"
      continue if cs.mtime < js.mtime  # 更新されていなければ次のターゲットへ
    catch error
      null  # jsファイルが存在しなくても特に何もしない
    sys.puts "#{COMMAND} #{OPTIONS} -o #{OUTDIR} #{SRCDIR}/#{target}.coffee"
    exec "#{COMMAND} #{OPTIONS} -o #{OUTDIR} #{SRCDIR}/#{target}.coffee"

task 'clean', 'delete target files', ->
  for target in targetList
    exec "rm #{OUTDIR}/#{target}.js"

おわりに

makeコマンドのように引数を指定しなくてもmakeして欲しいなーと思って、invokeを使う方法も考えたんですがうまく書けませんでした(:´Д`)
/usr/local/lib/coffee-script/lib/cake.js辺りを書き換えたらcakeコマンドの挙動を変えれそうですが、できればCakefile内で何とかしたいです。