waf + msvc + boost

boost::threadをwafでコンパイルしようとして頑張った。

  1. Visual Studioでググった通りにコンパイル
  2. オプションを復元してコマンドでコンパイル
  3. wafで同じオプションになるようにwscript書く

最終的なwscriptは以下の通り

#!/usr/bin/env python
def configure(conf):
    conf.load('msvc', funs='no_autodetect')
    conf.env.CXXFLAGS = ["/MD", "/EHsc"] #["/MDd", "/EHsc"]
    conf.env["INCLUDES"] = ["C:\\...\\boost_1_51_0"]
    conf.env.LINKFLAGS = ["/MACHINE:X86"]
    conf.env.LIBPATH = ["C:\\...\\boost_1_51_0\\stage\\lib"]
    conf.env.LIB = "libboost_thread-vc110-mt-1_51"#-gd-1_51"
def build(bld):
    bld.program(source="test.cpp", target="test")

結果だけ見ると大したことはないのだけれど、普段64bit環境の人からすると conf.env.LINKFLAGS = ["/MACHINE:X86"] は相当曲者。 boostをビルドしたときにx86がyesになっててどっちでコンパイルしてるんだと思ったらそういうことでした。

あと、CXXFLAGSのMDとライブラリのファイル名は関係しています。 MDdにするとデバッグ用のライブラリをリンクしなくてはなりません。 boostの命名規則に気づかなくて悩みました。 それと拡張子が要らなかったり(gccだとlibの接頭語いらなかったりするし)。

あと、+=で追加にするとデフォルトのヘッダと衝突してあばばばばってなったり。 長い戦いだった。