Makeで言うところの暗黙のルール以外を適用したい場合について。
SConsにはProgram(), Object(), Library()などなど、組み込みのBuilderが多数用意されていて、9割方はそれらを使えば済む。しかし、例えばヘッダファイルをビルド時に動的に生成したい場合、Makeほど簡単ではない。
Makeの場合、生成ファイルや依存関係を定義する際に、生成するためのコマンドも指定できる。…と言うか、生成コマンドを省略すると暗黙のルールが適用されるだけ。以下、erbを使ってfoo.h.erbからfoo.hを生成する例。ただし、foo.h.erbの中でfoo.yamlを参照しているものとする。
foo.h : foo.h.erb foo.yaml
erb $< > $@
一方SConsには、暗黙のルールというものが存在しなさそう。新たにBuilderを定義して使うのが基本っぽい。
env_bld = Builder(action = 'erb $SOURCE > $TARGET')
env = Environment()
env['BUILDERS']['Erb'] = erb_bld
foo = env.Erb('foo.h', 'foo.h.erb')
Depends(foo, 'foo.yaml')
う〜ん、かなりかったるい。Builderの追加先として、しれっと新たなenvironmentを作っているのは、DefaultEnvironment()に追加してもレシーバを省略してErb(...)と書くことができなかったため。何かやり方があるのだろうか?
…で、流石にこれは面倒だと思ったのか、今回のような一点もののケースのためにCommand Builderというものも用意されている。
Command('foo.h', ['foo.h.erb', 'foo.yaml'], 'erb $SOURCE > $TARGET')
こっちの方が、はるかに楽だね。
0 件のコメント:
コメントを投稿