夏休み終ったけどbjam始めてみます 4日目

夏休みはもう終ってしまいましたが、bjamはたまーに使っています。
C++ソースコードコンパイルするだけなら、bjamは最短なのではないでしょうか。
…と思いましたがmake最短ですね…。

boost使いたいです

3日目に書いた方法でboostを使ってもいいのですが、せっかくのbjamなので、bjamっぽく使いましょう。今回の方法はboostのソースツリーを持って必要に応じてコンパイルする設定のため、ディスク容量的には不利ですが、を指定すれば、コンパイル済みのライブラリも使えるので、こちらの方がスマートなのではないでしょうか。

まず、boostのソースがある位置をbjamに教えてあげないといけません。方法は2つあります。

1つ目は環境変数BOOST_ROOTを使う方法です。

$ export BOOST_ROOT=${HOME}/boost_1_47_0

もう1つはuser-config.jamに設定を書く方法です。

$ cat ~/user-config.jam
using boost : 1.47 : <root>/home/fujita/boost_1_47_0

そして、プロジェクトのJamrootファイルに以下の文を書きます。

import boost ;
boost.use-project ;

boost.use-projectにはバージョン指定も可能です。

boost.use-project 1.47 ;

これで、/boost//regexや/boost//filesystemといったライブラリが定義されます。ヘッダのみでいい場合は/boost//headersをrequirementsに追加します。例えば、a.cppをfilesystem付きでコンパイルしたい場合は、

exe a : a.cpp /boost/headers /boost//filesystem ;

とします。

夏休みなのでbjam始めてみます 3日目

0xの使い方やライブラリ回りは、プロのbjammerことid:Flast先生に教えてもらいました。

複数のソースから1つの実行ファイルを作りたい

単に依存関係を並べればいいようです。

Jamroot:

exe a : a.cpp b.cpp ;
$ $BOOST_ROOT/bjam release
...found 13 targets...
...updating 6 targets...
common.mkdir bin
common.mkdir bin/darwin-4.6
common.mkdir bin/darwin-4.6/release
darwin.compile.c++ bin/darwin-4.6/release/a.o
darwin.compile.c++ bin/darwin-4.6/release/b.o
darwin.link bin/darwin-4.6/release/a
...updated 6 targets...

システムに入ってるライブラリを使いたい

requirementsの所にで名前を教えてあげればいいようです。ただし、先頭のlibはいりません(libz→z、libpng→png)。システム標準でない場所にライブラリが入っている場合はで場所を教えてあげます。

Jamroot:

lib z : : <name>z <search>/opt/local/lib : : <include>/opt/local/include ;
exe a : a.cpp z ;

a.cpp

#include <iostream>
#include <zlib.h>

int main() { std::cout << zlibVersion() << '\n'; return 0; }
$ $BOOST_ROOT/bjam release
...found 11 targets...
...updating 5 targets...
common.mkdir bin
common.mkdir bin/darwin-4.6
common.mkdir bin/darwin-4.6/release
darwin.compile.c++ bin/darwin-4.6/release/a.o
darwin.link bin/darwin-4.6/release/a
...updated 5 targets...
$ ./bin/darwin-4.6/release/a
1.2.5

C++0xを使いたい

projectのrequirementsでオプションを追加してあげればいいようです。

Jamroot:

project : requirements <cxxflags>-std=c++0x ;
exe a : a.cpp ;

夏休みなのでbjam始めてみます 2日目

1日目と同日公開ですが、2日目です。はい。デフォルトのvariantがdebugなので、ぼーっとしてると遅いバイナリを作ってしまいそうで怖いですね。3日目に続くかは謎です。

variantオプション

bjamはデフォルトでdebugモードでビルドされます。ビルドモードを変更するにはbjamの引数にvariantオプションを渡すか、単にdebugやreleaseと引数に加えます。なお、コンパイルオプションその他を一杯表示させるには、 -d+2 オプションを渡します。逆に、出力を最小限にしたい場合は-d0を渡します。

Debug:

$ $BOOST_ROOT/bjam -d+2 debug
[]
"g++-mp-4.6"  -ftemplate-depth-128 -O0 -fno-inline -Wall -g -dynamic -gdwarf-2 -fexceptions -fPIC     -c -o "bin/darwin-4.6/debug/a.o" "a.cpp"
[]

Release:

$ $BOOST_ROOT/bjam -d+2 variant=release
[]
"g++-mp-4.6"  -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -dynamic -gdwarf-2 -fexceptions -fPIC  -DNDEBUG   -c -o "bin/darwin-4.6/release/a.o" "a.cpp"
[]

なお、variantは複数指定できるので、releaseとdebugを同時にビルドできます。

Debug+Release:

$ $BOOST_ROOT/bjam -d+2 debug release
[]
"g++-mp-4.6"  -ftemplate-depth-128 -O0 -fno-inline -Wall -g -dynamic -gdwarf-2 -fexceptions -fPIC     -c -o "bin/darwin-4.6/debug/a.o" "a.cpp"
[]
"g++-mp-4.6"  -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -dynamic -gdwarf-2 -fexceptions -fPIC  -DNDEBUG   -c -o "bin/darwin-4.6/release/a.o" "a.cpp"
[]

-j オプション

GNU Makeと同様に-jオプションを指定すると、平行ビルドで実行されます。多数のコアがあるマシンで実行する場合は、ビルド時間が短縮される可能性があります。
boost本体レベルの規模となると物理8コアのマシンで、ビルド時間が-jなしで604秒、-j8付きで93.8秒となり、8倍とはいきませんが、6倍程度高速化されています。

夏休みなのでbjam始めてみます 1日目

bjamが欲しいので、まずはboostをダウンロードして展開し、bjamをビルドします。そして、boostを展開したディレクトリをBOOST_ROOT環境変数に定義しておきます。BOOT_ROOTはbjamの動作上も必要です。

$ export BOOST_ROOT=/path/to/boost
$ cd $BOOST_ROOT
$ ./bootstrap

boost 1.47.0からbootstrapで作成されるbjamの実行ファイル名が、"bjam"と"b2"の2つになっています。1.47の段階ではこれらのファイルの内容は同一で単なるコピーのようですが、以降はbjamで統一します。

Mac環境で、Appleによって提供されていないgccを使う場合は、以下の修正を行う必要があります。(例えばMacports) -no-cpp-precompというオプションはApplegccにしか存在しないためです。(本当にこの修正で大丈夫なのか、よくわかんないですけど)

--- $BOOST_ROOT/tools/build/v2/tools/darwin.jam.org	2011-07-30 19:12:42.000000000 +0900
+++ $BOOST_ROOT/tools/build/v2/tools/darwin.jam	2011-07-30 19:12:49.000000000 +0900
@@ -498,7 +498,7 @@
 flags darwin.compile OPTIONS <link>shared : -dynamic ;
 
 # Misc options.
-flags darwin.compile OPTIONS : -no-cpp-precomp -gdwarf-2 -fexceptions ;
+flags darwin.compile OPTIONS : -gdwarf-2 -fexceptions ;
 #~ flags darwin.link OPTIONS : -fexceptions ;
 
 # Add the framework names to use.

さて、a.cppとJamrootファイルを用意して適当にコンパイルしてみます。

a.cpp:

#include <iostream>
int main() { std::cout << "Hello bjam\n"; return 0; }

Jamroot:

exe a : a.cpp ;
$ ls
Jamroot a.cpp
$ $BOOST_ROOT/bjam
...found 9 targets...
...updating 4 targets...
common.mkdir bin/darwin-4.6
common.mkdir bin/darwin-4.6/debug
darwin.compile.c++ bin/darwin-4.6/debug/a.o
darwin.link bin/darwin-4.6/debug/a
...updated 4 targets...
$ ./bin/darwin-4.6/debug/a
Hello bjam

あ、2日目に続くかは謎です。