SCons入門(3)

SCons入門(1) - Pashango’s Blog
SCons入門(2) - Pashango’s Blog

ファイル/ディレクトリ操作「Copy,Move,Delete,Touch,Mkdir,Chmod」

SConsではファイル/ディレクトリ操作用に以下の関数が用意されている。

Copy(dst, src) ファイル/ディレクトリのコピー
Move(dst, src) ファイル/ディレクトリの移動
Delete(tgt) ファイル/ディレクトリの削除
Touch(tgt) タイムスタンプの更新
Mkdir(tgt) ディレクトリの作成
Chmod(tgt, prm) パーミッションの変更

これらの関数は単独では使用できない、Commandなどのアクション部分に組み込んで初めて動作する。
SConstructのサンプルは以下のとおり。

Command("file.out", "file.in",
        [
          Mkdir("tmpdir"),
          Copy("tmpdir/main.c", "main.c"),
          "mycommand $SOURCE $TARGET",
          Move("$TARGET", "tmpdir/$TARGET"),
          Delete("tmpdir"),
          Touch("$TARGET"),
          Chmod("$TARGET", 0755),
        ])

実行結果は以下のとおり、テンポラリデイレクトリの生成/削除を行い、最後にパーミッションを変更している。

>scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
Mkdir("tmpdir")
Copy("tmpdir/foo.in", "foo.in")
mycommad foo.in foo.out
Move("foo.out", "tmpdir/foo.out")
Delete("tmpdir")
Touch("foo.out")
Chmod("foo.out", 0755)
scons: done building targets.

アクションを実行する「Execute」

必要なディレクトリをビルド前に作成したい状況があるが「Mkdir」は単独では使用できない、そんな時は「Execute」と「Mkdir」を組み合わせて使う。

if Execute(Mkdir('output_dir')):
    # ディレクトリの作成に失敗したらExit
    Exit(1)

これで、ビルド前にあらかじめディレクトリを作成してくれる。

ヒエラルキービルドをする「SConscript」

大規模なプロジェクトになると、各ディレクトリ毎にSConstructを分けたくなるかもしれない。
そんな時は「SConscript」を使えば、他のディレクトリのビルドを制御する事が出来る。

SConscript(['drivers/display/SConscript',
            'drivers/mouse/SConscript',
            'parser/SConscript',
            'utilities/SConscript'])