640 likes | 794 Views
Boost.Build. 2010 年 10 月 23 日 Boost. 勉強会 #3 関西 郵便はみがき. 自己紹介. 郵便はみがき y-hamigaki ( はてな ) yhamigaki (Twitter) ブログ「かそくそうち」 http://d.hatena.ne.jp/y-hamigaki/ フリーソフト 「 Dante98 for Windows 」 ライブラリ「 Hamigaki C++ Libraries 」. 概要. はじめに Boost.Jam と Jam 言語 Boost.Build Tips まとめ. はじめに.
E N D
Boost.Build 2010年10月23日 Boost.勉強会 #3 関西 郵便はみがき
自己紹介 郵便はみがき • y-hamigaki(はてな)yhamigaki(Twitter) • ブログ「かそくそうち」 http://d.hatena.ne.jp/y-hamigaki/ • フリーソフト「Dante98 for Windows」 • ライブラリ「Hamigaki C++ Libraries」
概要 • はじめに • Boost.JamとJam言語 • Boost.Build • Tips • まとめ
Boost.Buildとは • Boostで用いられるビルドシステム • マルチプラットフォーム、マルチコンパイラ • Jam言語による柔軟な制御 • 「make + 簡易configure」のようなもの • モジュールによる機能拡張
Boost.BuildとBoost.Jamの関係 • Boost.Jamがビルドツール • Boost.BuildはBoost.Jamとそのスクリプト集 • 狭義にはスクリプト集だけを指して Boost.Buildと呼ぶことも
Boost.Jam (bjam) • Perforce Jam→FT Jam→Boost.Jam • 内蔵のJambaseをBoost向けにカスタマイズ • bjamをjamにリネームするとJamとして動作 • 言語機能の追加(module, class, …) • Pythonとの連動 • ${BOOST_ROOT}/tools/jam/src ${BOOST_ROOT}/tools/build/v2/engine/src
Perforce Jam • マルチプラットフォームのビルドツール • Jam言語で依存関係やオプションを設定 • Jambaseが各コンパイラを知っている • ヘッダファイルの依存関係を自動解析 • 最新バージョンは2.5 (2003年4月)
Makefileの例 proga: data.omain.oio.o cc data.omain.oio.o -o proga data.o: data.cdata.h cc -c data.c main.o: data.hio.hmain.c cc -c main.c io.o: io.hio.c cc -c io.c http://www.perforce.com/jam/jam.html
Jamfileの例 Main proga : data.cmain.cio.c ; http://www.perforce.com/jam/jam.html
Jam言語 • チューリング完全 • データ型は文字列のリストのみ • トークンは空白文字で区切る • #以降改行までがコメント(トークン中は無効) • 大文字/小文字は区別する
Hello, world! #hello.jam EXIT␣Hello,␣world!␣; $ jam –f hello.jam Hello, world! $
変数 X␣=␣Boost␣;␣#変数Xに文字列「Boost」を代入 ECHO␣$(X)␣;␣#「Boost」を出力 Y␣=␣Build␣Jam␣;␣#Yに「Build」と「Jam」代入 ECHO␣$(Y)␣;␣#「Build Jam」を出力 ECHO␣$(X)␣$(Y)␣;␣#「Boost Build Jam」を出力 ECHO␣$(X).$(Y)␣;␣#「Boost.Build Boost.Jam」
パス名 dir1/dir2 / basename .ext (member) ディレクトリ名 ベース名 拡張子 アーカイブメンバ :D :B :S :M ph␣=␣dir1/dir2/basename.ext(member)␣; ECHO␣$(ph:BS=.cpp)␣;␣#「basename.cpp」
ルール(関数) rule␣hello { ECHO␣Hello,␣world␣; } hello␣;␣#「Hello, world!」を出力
引数 rule␣greet { ECHO␣"Hello,␣$(1)-$(2)."␣; } greet␣Taro␣:␣kun␣;␣#「Hello, Taro-kun.」 greet␣Naoko␣:␣san␣;␣#「Hello, Naoko-san.」
名前付き引数(bjam拡張) rule␣greet␣(␣name␣:␣postfix␣) { ECHO␣"Hello,␣$(name)-$(postfix)."␣; } greet␣Taro␣:␣kun␣;␣#「Hello, Taro-kun.」 greet␣Naoko␣:␣san␣;␣#「Hello, Naoko-san.」
引数の制約(bjam拡張) rule␣hoge␣(␣A␣*␣:␣B␣+␣:␣C␣?␣:␣D␣)
戻り値 rule␣greet-msg␣(␣name␣:␣postfix␣) { return␣"Hello,␣$(name)-$(postfix)."␣; } #「Hello, Taro-kun.」を出力 ECHO␣[␣greet-msg␣Taro␣:␣kun␣]␣;
if文 if␣$(X) { ECHO␣OK␣;␣#Xが真の場合 } else { ECHO␣NG␣;␣#Xが偽の場合 }
for文 for␣X␣in␣one␣two␣three { ECHO␣$(X)␣; } one two three
while文 X␣=␣one␣two␣three␣; while␣$(X) { ECHO␣$(X[1])␣;␣#先頭要素を出力 X␣=␣$(X[2-])␣;␣#後ろの要素で再設定 }
モジュール(bjam拡張) module␣foo { rule␣hello␣{␣ECHO␣hello␣;␣} } module␣bar␣{ IMPORT␣foo␣:␣hello␣:␣bar␣:␣foo.hello␣; foo.hello ; }
サンプルプログラム(剰余) rule␣mod␣(␣A␣B␣)␣{ local␣C␣=␣$(A)␣; while␣$(C)␣>␣-:␣{ A␣=␣$(C)␣; C␣=␣[␣CALC␣$(A)␣-␣$(B)␣]␣; } return␣$(A)␣; }
サンプルプログラム(FizzBuzz) N = 1 ; while $(N) != 101 { if [ mod $(N) 15 ] = 0 { ECHO FizzBuzz ; } elseif [ mod $(N) 3 ] = 0 { ECHO Fizz ; } elseif [ mod $(N) 5 ] = 0 { ECHO Buzz ; } else { ECHO $(N) ; } N = [ CALC $(N) + 1 ] ; }
actions • ルールを呼び出すと同名actionsがビルドコマンドとしてセットされる • 第一引数がターゲット、第二引数がソース rule␣copy␣(␣target␣:␣source␣)␣{␣} actions␣copy␣{ cp␣$(>)␣$(<) } copy␣out.txt␣:␣in.txt␣;
DEPENDS • ビルド依存関係を指定する組み込みルール • 既定のターゲットは「all」 rule␣copy␣(␣target␣:␣source␣)␣{ DEPENDS␣$(target)␣:␣$(source)␣; DEPENDS␣all␣:␣$(target)␣; }
Clean • ターゲットを削除するルール(Jambaseで定義) • 通常、ターゲット名はclean rule␣copy␣(␣target␣:␣source␣)␣{ DEPENDS␣$(target)␣:␣$(source)␣; DEPENDS␣all␣:␣$(target)␣; Clean␣clean␣:␣$(target)␣; }
jamコマンド • 「all」をビルド • 「out.txt」をビルド • クリーン jam jam out.txt Jam clean
Boost.Build Version1 • JambaseをBoost向けに改良 • ツールセットやビルドオプション(ABI)の違い毎に別ディレクトリへ出力 ↓ 一度に複数のツールセットでビルド可能 • 環境設定は環境変数とコマンドライン引数
Boost.Build Version2 (BBv2) • Boost 1.34.0以降の標準ビルドシステム • 設定ファイルでツールセット毎に環境設定 • C/C++以外のツールにも対応、拡張可能 • ${BOOST_ROOT}/tools/build/v2
BBv2の例 #Jamroot exe␣proga␣:␣data.cpp␣main.cpp␣io.cpp␣;
BBv2実行例 $ bjam toolset=gcc ...found 17 targets... ...updating 7 targets... common.mkdir bin common.mkdir bin/gcc-4.3.4 common.mkdir bin/gcc-4.3.4/debug gcc.compile.c++ bin/gcc-4.3.4/debug/data.o gcc.compile.c++ bin/gcc-4.3.4/debug/main.o gcc.compile.c++ bin/gcc-4.3.4/debug/io.o gcc.link bin/gcc-4.3.4/debug/proga.exe ...updated 7 targets...
環境設定 • jamスクリプトによる設定ファイル • site-config.jam→マシン単位の設定 • user-config.jam→ユーザー単位の設定 • ホームディレクトリ等に配置
user-config.jamの例 module␣{ BZIP2_SOURCE␣=␣C:/src/bzip2-1.0.6␣; ZLIB_SOURCE␣=␣C:/src/zlib-1.2.5␣; } using␣msvc␣:␣10.0␣; using␣msvc␣:␣9.0␣; using␣gcc␣:␣:␣C:/mingw/bin/g++.exe␣; import␣python-config␣;
プロジェクト設定 • ビルド設定をディレクトリ内で共有 • サブディレクトリへも反映 • プロジェクトを利用する側の設定も指定(usage-requirements)
プロパティの指定方法 • フィーチャーthreadingをmultiにする <threading>multi • ツールセットがmsvcならばHOGE=1を定義 <toolset>msvc:<define>HOGE=1 • ツールセットがgccでOSがWindowsなら静的リンクを用いる <toolset>gcc,<os>NT:<link>static
プロジェクトの例 project␣test-proj :␣source-location␣src :␣requirements␣<include>$(BOOST_ROOT) :␣usage-requirements␣<include>. :␣default-build␣debug :␣build-dir␣bin ;
プロジェクトの参照 use-project␣/boost␣:␣$(BOOST_ROOT) ; project␣my-proj :␣requirements␣<library>/boost//headers ; • 参照先プロジェクトのusage-requirementsをプロジェクトのrequirementsに反映させる
ターゲット 次の形式のルールでビルドターゲットを定義する rule␣ルール名␣( main-target-name␣: sources␣+␣: requirements␣*␣: default-build␣*␣: usage-requirements␣*␣)
Boost.Test使用例 import␣testing␣; use-project␣/boost␣:␣$(BOOST_ROOT)␣; run␣test.cpp␣:␣:␣: <define>BOOST_ALL_NO_LIB=1 <library>/boost/test//boost_unit_test_framework ;
デバッグ • クラッシュしたらJITデバッガを起動する • coreをgdb等でデバッグ • testing.launcherフィーチャー