CTKアプリのコンパイルとビルド
出典: CTK: Cell ToolKit Library
「CTKユーザマニュアル」に戻る
「CTKによるCプログラミング」や「CTKによるC++プログラミング」では ctk-toolツールを使ったCTKアプリのビルド方法について 特に説明なしに述べてきましたが、 CTKアプリのソースコードをビルドするには、 実際には大きく分けて次のような3つの方法があります。
- CTKのビルドツールを使う
- CTKのビルド補助ツールを使う
- CTKがインストールされているディレクトリを元にコンパイル・リンカオプションを(Makefile中やコマンドラインで)指定する
1番目の方法は、単純なテストコードや小さいアプリケーションを開発するのに適しています。2番目の方法と3番目の方法は、より大きなアプリケーションの開発や、既存のアプリケーション中でCTKを使う場合により適しています。2番目と3番目の方法には本質的な違いはありません。
ここでは、それぞれの方法についてもう少し詳しく説明します。
[編集]
ctk-tool (ビルドツール)によるビルド
- CTKをインストールすると、<installdir>/bin以下にCTKアプリのビルドのための差ポートスクリプトがインストールされます。最も単純なCTKアプリのビルド方法は、ctk-toolというCTKのビルドツールを使う方法です。
PPEプログラムのビルド
- ctk-toolを使ってPPEソースコードをビルドして実行ファイルを作るには、次のようにします。
$ <installdir>/bin/ctk-tool ppu-build [--output=出力ファイル名] ソースファイル1 [ソースファイル2 ...]
- 引数にはソースファイル以外にオブジェクトファイルも指定できます。
- ppu-build のあとに--output=出力ファイルというオプションをつけることで、出力される実行ファイル名を指定できます。
- ppu-buildのあとに--lang=言語を指定することで、コンパイルに使う言語を指定できます。現在、cあるいはcxxを指定可能です。(ソースファイル名が指定されている場合、デフォルトでは拡張子によって(ppu-)gccあるいは(ppu-)g++が選択されます。オブジェクトファイルが指定された場合、デフォルトでは(ppu-)gccが使われます。)
- ctk-toolを使ってPPEソースコードをコンパイルしてオブジェクトファイルを作るには、次のようにします。
$ <installdir>/bin/ctk-tool ppu-compile ソースファイル1 [ソースファイル2 ...]
- デフォルトでは、指定されたソースファイルにそれぞれ対応するオブジェクトファイルが生成されます。
- ppu-compileのあとに--lang=言語を指定することで、ソースファイルの言語を指定できます。現在、cあるいはcxxを指定可能です。
- ppu-compileのあとに--object=拡張子を指定することで、オブジェクトファイルの拡張子を指定できます。デフォルトではo (xxx.o)というファイル名でオブジェクトファイルが生成されます。
- ppu-compileのあとに--objprefix=prefixを指定することで、各オブジェクトファイル名の前にprefixをつけることができます。例えばctk-tool ppu-compile --objprefix=spu- *.cのようにすると、spu-xxx.oというファイル名のオブジェクトファイルが生成されます。
SPEプログラムのビルド
- 同様に、ctk-toolを以下のように使うことで、SPEプログラムのソースコードやオブジェクトファイルから実行ファイルをビルドできます。
$ <installdir>/bin/ctk-tool spu-build [--output=出力ファイル名] ソースファイル1 [ソースファイル2...]
- ソースファイルからオブジェクトファイルにコンパイルだけする場合は次のようにします。
$ <installdir>/bin/ctk-tool spu-compile ソースファイル1 [ソースファイル2...]
CESOFオブジェクトの生成
- SPEプログラムは、CESOF (Cell Embedded SPE Object Format)というフォーマットとしてリンクすることで、PPEプログラム中にリンクすることができます。ctk-toolを使ってSPEプログラムの実行ファイルからCESOFオブジェクトを作るには次のようにします:
$ <installdir>/bin/ctk-tool cesof-embed SPE実行ファイル
- SPEプログラムのソースコードやオブジェクトファイルからCESOF形式のオブジェクトを生成するには、次のようにします:
$ <installdir>/bin/ctk-tool cesof-build [--output=出力ファイル名] ソースファイル1 [ソースファイル2...]
- オブジェクトファイル名やシンボル名は、デフォルトでは先頭に指定されたソースファイル名からつけられます。明示的に指定する場合、--output=出力ファイル名オプションで指定してください。
$ <installdir>/bin/ctk-tool cesof-build --output=test test-main.c func.c ==> spu-gcc -c test-main.c ... ... Generated: test-embed.o test-embed.h Symbol: test
- 上の例では、test-main.cとfunc.cというSPEプログラムのソースコードをビルドして、test-embed.oというCESOFオブジェクトを生成しています。このSPEプログラムは、ctk_spe_program_t型(あるいはlibspeのspe_program_handle_t型)の変数としてtestというシンボル名でPPEプログラムから参照されます。
- test-embed.hは、testシンボルをextern宣言しているだけのヘッダファイルです。PPEプログラムからシンボルを参照するときに使うことができます。
CESOF共有ライブラリの生成
- SPEプログラムは、CESOFオブジェクトとしたあとさらにPPEのための共有ライブラリにリンクすることもできます。SPEモジュールを共有ライブラリとして配布したい場合などに有用です。
- ctk-toolを使ってSPE実行ファイルからCESOF共有ライブラリを生成するには、次のようにします:
$ <installdir>/bin/ctk-tool cesof-embed-lib SPE実行ファイル名
- ctk-toolを使ってSPEのソースファイルやオブジェクトファイルからCESOF共有ライブラリを生成するには、次のようにします:
$ <installdir>/bin/ctk-tool cesof-build-lib [--output=出力ファイル名] ソースファイル1 [ソースファイル2...]
- この場合、lib出力ファイル名.soという共有ライブラリとlib出力ファイル名.hというヘッダファイルが生成されます。この共有ライブラリはPPEプログラムとリンク可能です。
その他の使い方
- ctk-tool helpと実行すると、ctk-toolの簡単なヘルプが表示されます。
$ <installdir>/bin/ctk-tool help Usage: ...
[編集]
ctk-config (ビルド補助ツール)を使ったビルド
- CTKビルドツールctk-toolは、Makefileやその他のツールを使ってより大きなソフトウェアをビルドしたいときにはあまり向いていません。
- そのような場合、CTK使ったアプリケーションで使うべきコンパイラやその適切なオプションを何らかの方法で得て、その結果をMakefileなどに記述する必要があります。
- CTKでは、インストールされているCTKライブラリが想定している(必要とする)コンパイラやリンカ、そのオプションなどを出力するだけの ctk-config という補助ツールが用意されています。
- ctk-configを使ってPPEプログラムをコンパイラするときの適切なコンパイラオプションを得るには、例えば次のようにします:
$ <installdir>/bin/ctk-config --ppu-cflags
- すると、コンパイラオプション(例えば-I<CTKヘッダファイルのディレクトリ>など)が表示されます。
- 同様に、C++で書かれたSPEプログラムをコンパイルするときに使うべきコンパイラとコンパイルオプションを得るには、次のように実行します:
$ <installdir>/bin/ctk-config --spu-cxx --spu-cxxflags
- ctk-configの出力結果には改行がついていませんので、例えばコマンドラインで次のように指定したり
$ `<installdir>/bin/ctk-config --spu-cxx` spu_main.cpp `<installdir>/bin/ctk-config --spu-cxxflags --spu-ldflags` -lm `<installdir>/bin/ctk-config --spu-libs`
- Makefile中で次のように使ったりすることができます。
SPU_CC = `<installdir>/bin/ctk-config --spu-cc` SPU_CXX = $(shell <installdir>/bin/ctk-config --spu-cxx)
- ctk-configに指定できるオプションの一覧は次のようになります。これらのオプションは複数一度に指定可能です。
| --ppu-cc | PPEプログラムのためのCコンパイラのパス |
|---|---|
| --ppu-cxx | PPEプログラムのためのCコンパイラのパス |
| --ppu-ld | PPEプログラムのためのリンカのパス |
| --ppu-cflags | PPEプログラムのためのCコンパイラオプション |
| --ppu-cxxflags | PPEプログラムのためのC++コンパイラオプション |
| --ppu-ldflags | PPEプログラムのためのリンカオプション |
| --ppu-libs | PPEプログラムのための追加ライブラリ(ex. -lctk) |
| --spu-cc | SPEプログラムのためのCコンパイラのパス |
| --spu-cxx | SPEプログラムのためのCコンパイラのパス |
| --spu-ld | SPEプログラムのためのリンカのパス |
| --spu-cflags | SPEプログラムのためのCコンパイラオプション |
| --spu-cxxflags | SPEプログラムのためのC++コンパイラオプション |
| --spu-ldflags | SPEプログラムのためのリンカオプション |
| --spu-libs | SPEプログラムのための追加ライブラリ(ex. -lctk_spu) |
| --spu-strip | SPEプログラムのためのstripプログラムのパス |
| --spu-task-ldflags | SPEタスクのためのリンカオプション |
| --embedspu | SPEプログラムをCESOF形式にするためのツールのパス |
- CTKアプリをビルドするのに、ctk-configが出力するツールやオプションを必ずしも指定しなければいけないというわけではありません。(例えば、ppu-gccでコンパイル・インストールされているCTKライブラリは、gcc -m64でコンパイルされたアプリケーションのオブジェクトファイルとリンク可能です)
- ctk-configをオプションなしで実行すると、簡単なヘルプが表示されます。
[編集]
手動(Manual)設定によるビルド
- CTKがインストールされているディレクトリやPPEやSPEのコンパイルツールのパスが自明である場合、ctk-toolやctk-configを使うわざわざ使う意義はあまりありません。
- 例えば、ppu-gccやspu-gccが標準の実行パスにあり、かつCTKが/usr/local/ctk以下にインストールされている場合、次のようにすればCTKアプリをビルドできます:
| PPEプログラム | |
|---|---|
| コンパイラ | ppu-gccあるいはgcc |
| コンパイラオプション | -I/usr/local/ctk/include |
| リンカオプション | -L/usr/local/ctk/lib -R/usr/local/lib |
| リンクするライブラリ | -lctk |
| SPEプログラム | |
| コンパイラ | spu-gcc |
| コンパイラオプション | -I/usr/local/ctk/include |
| リンカオプション | -L/usr/local/ctk/lib/spu |
| リンクするライブラリ | -lctk_spu |
| SPE Taskプログラム | |
| コンパイラ | spu-gcc |
| コンパイラオプション | -I/usr/local/ctk/include |
| リンカオプション | -L/usr/local/ctk/lib/spu -Ttext 0x5000 |
| リンクするライブラリ | -lctk_spu |
- /usr/local/ctkの部分は、インストールされているディレクトリにあわせて適切に変更してください。
- 東芝環境でPS3環境などと同様にSPEプログラムからの標準入出力を使いたい場合、リンカオプションにいくつか付加的なオプションをつける必要があります。正確なオプションについては <installdir>/bin/ctk-config --spu-ldflagsの出力を参照してください。
- なお、これらのオプションをつけなくても、-lctk_spuをリンクしていればctk_xxx という関数名でCTK組み込みの標準入出力関数を呼び出すことができます(ex. ctk_printf など)。
「CTKユーザマニュアル」に戻る
