1 / 64

Boost.Build

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 まとめ. はじめに.

giacinto
Download Presentation

Boost.Build

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Boost.Build 2010年10月23日 Boost.勉強会 #3 関西 郵便はみがき

  2. 自己紹介 郵便はみがき • y-hamigaki(はてな)yhamigaki(Twitter) • ブログ「かそくそうち」 http://d.hatena.ne.jp/y-hamigaki/ • フリーソフト「Dante98 for Windows」 • ライブラリ「Hamigaki C++ Libraries」

  3. 概要 • はじめに • Boost.JamとJam言語 • Boost.Build • Tips • まとめ

  4. はじめに

  5. Boost.Buildとは • Boostで用いられるビルドシステム • マルチプラットフォーム、マルチコンパイラ • Jam言語による柔軟な制御 • 「make + 簡易configure」のようなもの • モジュールによる機能拡張

  6. Boost.BuildとBoost.Jamの関係 • Boost.Jamがビルドツール • Boost.BuildはBoost.Jamとそのスクリプト集 • 狭義にはスクリプト集だけを指して Boost.Buildと呼ぶことも

  7. Boost.JamとJam言語

  8. 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

  9. Perforce Jam • マルチプラットフォームのビルドツール • Jam言語で依存関係やオプションを設定 • Jambaseが各コンパイラを知っている • ヘッダファイルの依存関係を自動解析 • 最新バージョンは2.5 (2003年4月)

  10. 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

  11. Jamfileの例 Main proga : data.cmain.cio.c ; http://www.perforce.com/jam/jam.html

  12. Jam言語 • チューリング完全 • データ型は文字列のリストのみ • トークンは空白文字で区切る • #以降改行までがコメント(トークン中は無効) • 大文字/小文字は区別する

  13. Hello, world! #hello.jam EXIT␣Hello,␣world!␣; $ jam –f hello.jam Hello, world! $

  14. 変数 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」

  15. 変数展開

  16. パス名 dir1/dir2 / basename .ext (member) ディレクトリ名 ベース名 拡張子 アーカイブメンバ :D :B :S :M ph␣=␣dir1/dir2/basename.ext(member)␣; ECHO␣$(ph:BS=.cpp)␣;␣#「basename.cpp」

  17. ルール(関数) rule␣hello { ECHO␣Hello,␣world␣; } hello␣;␣#「Hello, world!」を出力

  18. 引数 rule␣greet { ECHO␣"Hello,␣$(1)-$(2)."␣; } greet␣Taro␣:␣kun␣;␣#「Hello, Taro-kun.」 greet␣Naoko␣:␣san␣;␣#「Hello, Naoko-san.」

  19. 名前付き引数(bjam拡張) rule␣greet␣(␣name␣:␣postfix␣) { ECHO␣"Hello,␣$(name)-$(postfix)."␣; } greet␣Taro␣:␣kun␣;␣#「Hello, Taro-kun.」 greet␣Naoko␣:␣san␣;␣#「Hello, Naoko-san.」

  20. 引数の制約(bjam拡張) rule␣hoge␣(␣A␣*␣:␣B␣+␣:␣C␣?␣:␣D␣)

  21. 戻り値 rule␣greet-msg␣(␣name␣:␣postfix␣) { return␣"Hello,␣$(name)-$(postfix)."␣; } #「Hello, Taro-kun.」を出力 ECHO␣[␣greet-msg␣Taro␣:␣kun␣]␣;

  22. if文 if␣$(X) { ECHO␣OK␣;␣#Xが真の場合 } else { ECHO␣NG␣;␣#Xが偽の場合 }

  23. 条件式

  24. for文 for␣X␣in␣one␣two␣three { ECHO␣$(X)␣; } one two three

  25. while文 X␣=␣one␣two␣three␣; while␣$(X) { ECHO␣$(X[1])␣;␣#先頭要素を出力 X␣=␣$(X[2-])␣;␣#後ろの要素で再設定 }

  26. モジュール(bjam拡張) module␣foo { rule␣hello␣{␣ECHO␣hello␣;␣} } module␣bar␣{ IMPORT␣foo␣:␣hello␣:␣bar␣:␣foo.hello␣; foo.hello ; }

  27. サンプルプログラム(剰余) rule␣mod␣(␣A␣B␣)␣{ local␣C␣=␣$(A)␣; while␣$(C)␣>␣-:␣{ A␣=␣$(C)␣; C␣=␣[␣CALC␣$(A)␣-␣$(B)␣]␣; } return␣$(A)␣; }

  28. サンプルプログラム(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 ] ; }

  29. actions • ルールを呼び出すと同名actionsがビルドコマンドとしてセットされる • 第一引数がターゲット、第二引数がソース rule␣copy␣(␣target␣:␣source␣)␣{␣} actions␣copy␣{ cp␣$(>)␣$(<) } copy␣out.txt␣:␣in.txt␣;

  30. DEPENDS • ビルド依存関係を指定する組み込みルール • 既定のターゲットは「all」 rule␣copy␣(␣target␣:␣source␣)␣{ DEPENDS␣$(target)␣:␣$(source)␣; DEPENDS␣all␣:␣$(target)␣; }

  31. Clean • ターゲットを削除するルール(Jambaseで定義) • 通常、ターゲット名はclean rule␣copy␣(␣target␣:␣source␣)␣{ DEPENDS␣$(target)␣:␣$(source)␣; DEPENDS␣all␣:␣$(target)␣; Clean␣clean␣:␣$(target)␣; }

  32. jamコマンド • 「all」をビルド • 「out.txt」をビルド • クリーン jam jam out.txt Jam clean

  33. Boost.Build

  34. Boost.Build Version1 • JambaseをBoost向けに改良 • ツールセットやビルドオプション(ABI)の違い毎に別ディレクトリへ出力 ↓ 一度に複数のツールセットでビルド可能 • 環境設定は環境変数とコマンドライン引数

  35. Boost.Build Version2 (BBv2) • Boost 1.34.0以降の標準ビルドシステム • 設定ファイルでツールセット毎に環境設定 • C/C++以外のツールにも対応、拡張可能 • ${BOOST_ROOT}/tools/build/v2

  36. BBv2の例 #Jamroot exe␣proga␣:␣data.cpp␣main.cpp␣io.cpp␣;

  37. 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...

  38. プロパティ

  39. 環境設定 • jamスクリプトによる設定ファイル • site-config.jam→マシン単位の設定 • user-config.jam→ユーザー単位の設定 • ホームディレクトリ等に配置

  40. 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␣;

  41. プロジェクト設定 • ビルド設定をディレクトリ内で共有 • サブディレクトリへも反映 • プロジェクトを利用する側の設定も指定(usage-requirements)

  42. projectルールの引数

  43. プロパティの指定方法 • フィーチャーthreadingをmultiにする <threading>multi • ツールセットがmsvcならばHOGE=1を定義 <toolset>msvc:<define>HOGE=1 • ツールセットがgccでOSがWindowsなら静的リンクを用いる <toolset>gcc,<os>NT:<link>static

  44. プロジェクトの例 project␣test-proj :␣source-location␣src :␣requirements␣<include>$(BOOST_ROOT) :␣usage-requirements␣<include>. :␣default-build␣debug :␣build-dir␣bin ;

  45. プロジェクトの参照 use-project␣/boost␣:␣$(BOOST_ROOT) ; project␣my-proj :␣requirements␣<library>/boost//headers ; • 参照先プロジェクトのusage-requirementsをプロジェクトのrequirementsに反映させる

  46. ターゲット 次の形式のルールでビルドターゲットを定義する rule␣ルール名␣( main-target-name␣: sources␣+␣: requirements␣*␣: default-build␣*␣: usage-requirements␣*␣)

  47. ターゲットルール

  48. 単体テスト

  49. 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 ;

  50. デバッグ • クラッシュしたらJITデバッガを起動する • coreをgdb等でデバッグ • testing.launcherフィーチャー

More Related