SCons

参考リンク

Gnu Make の親戚みたいなやつです。Makefile の代わりに SConstruct ファイル (Python のファイル) を書くことでソースコードコンパイルをやってくれます。Makefile と異なるのは依存関係を明示的に書く必要がないという点でしょうか。

SConstruct ファイルを書く

SConstruct ファイルの文法は Python のようです。

フラグをつけてコンパイルする場合
env = Environment(CCFLAGS = '-g -DMY_DEBUG')
env.Program(target = 'foo', source = ['foo1.c', 'foo2.c'])
ライブラリもビルドする場合
srcs_foo = Split("""
foo1.c foo2.c
foo3.c
""")

srcs_bar = Split("""
bar1.c
""")

libs_bar = Split("""
m foo
""")

path_libs_bar = Split("""
.
""")

env = Environment(CCFLAGS = '-g -O4', LIBS=libs_bar, LIBPATH=path_libs_bar)
env.Library(target = 'foo', source = srcs_foo)
env.Program(target = 'bar', source = srcs_bar)

Split を使っていますが libs_bar = ['m', 'foo'] などと書いても同じですし、LIBS=['m', 'foo'] のように直接書いても良いです。

複数プログラムをビルドする場合
srcs_foo = Split("""
foo1.c foo2.c foo3.c
""")

srcs_bar1 = Split("""
bar1.c
""")

srcs_bar2 = Split("""
bar2.c
""")

libs_bar = Split("""
m foo
""")

path_libs_bar = Split("""
.
""")

env = Environment(CCFLAGS = '-g -O4', LIBS=libs_bar, LIBPATH=path_libs_bar)
env.Library(target = 'foo', source = srcs_foo)
env.Program(target = 'bar1', source = srcs_bar1)
env.Program(target = 'bar2', source = srcs_bar2)
コンパイルしたバイナリをインストールする場合

下記を付け加えます。

env.InstallAs(['../../bin/bin_bar1', '../../bin/bin_bar2'], ['bar1', 'bar2'])
Alias('install', '../../bin/')

make, make clean, make install, make bar1

コマンドラインから scons を実行します。

scons
  • -Q オプションをつけると scons が静かになり主に gcc のメッセージが表示されます。
  • -c オプションをつけると make clean の振る舞いをします。
  • install オプションをつけると make install の振る舞いをします。

先の例のように複数の Program 行がある場合、全てのターゲットがビルドされます。
特定のターゲットのみをビルドする場合は、引数にターゲット名を指定します。

scons -Q bar1

Vim との連携

:Scons で scons を呼び出せるようになります。