2021年11月23日火曜日

MakeじゃないのよSConsは その4

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 件のコメント:

コメントを投稿