Boost.Build @ AIX + IBM XL C/C++ (vacpp)
既に id:Cryolite 先生が http://d.hatena.ne.jp/Cryolite/20110901#p1 でやっているように、Boost.Build において、各ターゲットの種類に対してビルドプロパティの値が具体的にどのようなコマンドラインオプションに対応するかを、AIX + IBM XL C/C++ (vacpp) の場合において図示するという、やはり、私以外の誰も得をしないし、そもそも他に理解できる人が居るのかすら怪しい表を私も作ってみることにしました。
id:Cryolite 先生の表自体は私がとても便利に使わせていただきました。ありがとうございます。
基本的な見方は http://d.hatena.ne.jp/Cryolite/20110901#p1 の場合と一緒で、基本コマンド + 各ビルドプロパティに対応するオプション が実際に走るコマンドになります。
こんな表を作っておいてなんですが、$BOOST_ROOT/tools/build/v2/tools/vacpp.jam は比較的読みやすいのでわざわざこの表を参照しなくても……。
vacpp の場合、<threading> プロパティによって使うコマンドが変わります。
基本コマンド | |||||||
---|---|---|---|---|---|---|---|
feature | value | obj(C++) | obj(C) | lib (built shared) | lib (built static) | exe | run |
threading | single | xlC -qcpluscmt -qfuncsect -c -o "target" "source" | xlc -qcpluscmt -c -o "target" "source" | xlC_r -G -o "target" "sources" | ar ru "target" "sources" | xlC -o "target" "sources" | |
multi | xlC_r -qcpluscmt -qfuncsect -c -o "target" "source" | xlc_r -qcpluscmt -c -o "target" "source" | xlC_r -o "target" "sources" | ||||
オプション | |||||||
feature | value | obj(C++) | obj(C) | lib (built shared) | lib (built static) | exe | run |
link | shared | -bnoipath | N/A | -brtl -bnoipath | |||
static | N/A | ||||||
runtime-link | shared | ||||||
static | |||||||
runtime-debugging | on | ||||||
off | |||||||
optimization | off | -qNOOPTimize | |||||
speed | -O3 -qstrict | ||||||
space | -O2 -qcompact | ||||||
profiling | off | ||||||
on | -pg | -pg | -pg | ||||
inlining (not recommended) | off | -qnoinline | |||||
on | -qinline | ||||||
full | |||||||
rtti | on | -qrtti | |||||
off | -qnortti | ||||||
exception-hadnling | on | -qeh | |||||
off | -qnoeh | ||||||
asynch-exceptions | on | ||||||
off | |||||||
extern-c-nothrow | on | ||||||
off | |||||||
debug-symbols | on | -g -qfullpath | -g -qfullpath | -g -qfullpath | |||
off | -s | -s | |||||
strip | on | ||||||
off | |||||||
define | value | -Dvalue | |||||
undef | value | -Uvalue | |||||
include | path | -I"path" | |||||
sysinclude | path | -I"path" | |||||
cflags | value | value | |||||
cxxflags | value | value | |||||
fflags | value | ||||||
asmflags | value | ||||||
linkflags | value | value | value | ||||
arflags | value | value | |||||
version | value | ||||||
flags | value | ||||||
location-prefix | value | ||||||
use | target | ||||||
dependency | target | ||||||
implicit-dependency | target | ||||||
warnings | all | ||||||
on | |||||||
off | |||||||
warnings-as-errors | on | ||||||
off | |||||||
c++-template-depth | n | ||||||
source | target | ||||||
library | target | ||||||
file | target | ||||||
find-shared-library | value | -lvalue | -lvalue | ||||
find-static-library | value | -lvalue | -lvalue | ||||
library-path | path | -Lpath | -Lpath | ||||
name | value | ||||||
tag | value | ||||||
search | path | ||||||
location | path | ||||||
dll-path | path | LIBPATH 環境変数 (LD_LIBRARY_PATH に相当) に path を追加 | |||||
hardcode-dll-paths | true | *意味無し* | |||||
false | |||||||
xdll-path | path | *意味無し* | LIBPATH 環境変数 (LD_LIBRARY_PATH に相当) に path を追加 | ||||
def-file | target | ||||||
suppress-import-lib | true | ||||||
false | |||||||
allow | value | ||||||
address-model | |||||||
32 | |||||||
64 | -q64 | -q64 | -X 64 | ||||
c++abi | |||||||
contditional | value | ||||||
build | yes | ||||||
no | |||||||
user-interface | console | ||||||
gui | |||||||
wince | |||||||
native | |||||||
auto |
注意事項
ライブラリ検索パスの埋め込み
通常 Boost.Build は プログラムにライブラリ検索パスを埋め込みますが*1、AIX の場合はライブラリ検索の挙動が Linux などとは異なるため、bjam ではパスの埋め込みを行わないようです。
AIX の linker には GNU linker の -lrpath/-lrpath-link オプションと一見よく似た -blibpath オプションが存在します。しかし、このオプション指定した場合 LIBPATH (LD_LIBRARY_PATH に相当する) やシステムのデフォルトのライブラリ検索パスが無視され、-blibpath で指定したパスのみから探索が行なわれることになるようです(あってる?)。そのため、生成された実行ファイルをインストールせずに直接実行した場合は依存するライブラリが見付からず実行に失敗します。run rule から実行するか、自分で LIBPATH 環境変数を適切に設定してください。
(この記事作った理由はこれが言いたいだけだったり)
*1:install rule では <hardcode-dll-paths> feature が明示的に false にされているため埋め込みは起こりません。