夏休み終ったけど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の所に
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というオプションはAppleのgccにしか存在しないためです。(本当にこの修正で大丈夫なのか、よくわかんないですけど)
--- $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日目に続くかは謎です。