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| ...