Rakeメモ - rule

ruleは、Makeの型ルールをもっと高度にしたものですね。

rule '.o' => ['.c'] do |task|
  sh "gcc #{task.source} #{task.name}"
end
  • 依存先が'.'で始まる場合は、いわゆるサフィックスルール(古いタイプの)
    • task.nameがターゲット名(file, taskでも使える)
    • task.sourceが依存先ファイル(の1つめ)(file, taskでは使えない)
    • task.sourcesが全依存先ファイルの配列(Array)(file, taskでは使えない)
    • task.prerequisitesが全依存先ファイルのFileList(?)(file, taskでも使える)
      • FileListはto_sがjoin(' ')してくれる
      • sourcesとprerequisitesの違いは?クラスだけ??
  • '.c' は proc{|task_name| task_name.ext('.c')} と等価

sourcesとprerequisitesの違いがわかりません…全部prerequisitesでいいんじゃないかと思うのですが。

rule '.o' => [proc{|task_name| task_name.sub(/\.o$/, '.c')}] do |task| ...
  • Procで依存先を解決
  • ターゲットのファイル名(String)が引数に渡されるので、依存先のファイル名を返す
  • 依存先の配列は最終的にflattenされるので、ネストしてもOK
    • つまり、複数ファイルを返せる

これを使えば、どんな複雑なルールでもかけそうです。

rule '.o' => ['../filename.ext'] do |task| ...
  • スラッシュを含む場合はファイル名の変換しない
    • この場合は'../filename.ext'そのまま

ディレクトリをまたぐ場合は、ファイル名固定のようです。正直何のためにあるのかわかりません。

rule '.o' => ['%X.c'] do |task| ...
  • '%'を含む場合はpathmapを使って変換
  • '%X.c' は proc{|task_name| task_name.pathmap('%X.c')} と等価
    • pathmapについては後述
rule '.o' => ['HOGEHOGE'] do |task| ...
  • '%''/'を含まず、'.'で始まらない場合は、ファイル名そのまま(この場合'HOGEHOGE')
rule '.o' => ['.c', proc{|task_name| (1..5).map{|n| "#{task_name.sub(/\.o$/, '')}.#{n}"}}, 'HOGEHOGE'] do |task| ...
  • もちろん組み合わせもOK
rule(/\.o$/ => ['.c']) do |task| ...
  • ターゲットに正規表現OK
    • Rubyの文法上の制約から、メソッド呼び出しの括弧を省略できない
    • rule '.o' ... は rule(/\.o$/ ...) と等価