CubeSuite+のコード生成(以下Cg)は、有用で効果的なツールです。今回は、このCgの目的を整理します。
図は、あるプロジェクトのCubeSuite+画面です。プロジェクトツリーのファイルに、コード生成カテゴリがあり、Cg出力のヘッダファイルとソースファイルは、ここに配置されます。ファイルには、新たなカテゴリを追加し、Cg出力ファイルと区別できるようにしています。
Cgの目的は、API生成とテンプレート作成の2つです。それゆえ、Cgの出力ファイルには、2つ様式があります。1つがAPI関連のヘッダとソース分離様式、もう1つがテンプレート関連のヘッダ、ソース一体様式です。
目的 | 様式 | 例 | 生成内容 |
API生成 | 分離様式 | r_cg_周辺.h | 周辺APIプトロタイプ宣言、型定義など |
r_cg_周辺.c | 周辺APIソース | ||
r_cg_周辺_user.c | r_cg_周辺.h とr_cg_macrodriver.h、userdefine.hは追加済みの空ソースファイル | ||
テンプレート生成 | 一体様式 | r_main.c | 全r_cg_周辺.h とr_cg_macrodriver.h、userdefine.hは追加済みのメインループ付き空ソースファイル |
r_systeminit.c | 全r_cg_周辺.h とr_cg_macrodriver.h、userdefine.hは追加済みの周辺初期化API付き初期化ソースファイル |
※userdefine.hは、Cg生成時、空ヘッダファイル。
APIのプトロタイプ宣言や型定義が記述されたヘッダファイルは、r_main.cに自動追加され、Cgが生成したAPIをファイル内で宣言なしに使えます。分離様式は、このように使用側で明示的な宣言が不要になる利点があります。APIやライブラリのように、ソースにバグが無く品質が良い関数を使うのに適した方法です。一方、ユーザが作成した関数は、(バグがあるかもしれませんので)使用側で明示的に宣言した方が良いでしょう。
通常は、Cg出力のコード生成カテゴリのファイルの中身に、ユーザがソースを書き加えることでプログラムが完成します(どこに書き加えるかは、2012/8/13記事参照)。具体的には、r_cg_周辺.cとr_main.cの空ソース部分、userdefine.hが対象です。r_cg_周辺.cでユーザが追加した関数は、r_main.cなどの使用側で明示的に使用宣言します。userdefine.hは、ユーザ追加ソースで必要となるマクロや型定義などを記述します。
Cgが指定する場所へソースを書き加えれば、後に構成が変わってCg再生成をしても、ユーザが追加したソースはそのまま引き継がれます。Cgの目的が2つあり、生成ファイルとその内容を俯瞰的に理解していないと、有用性が判りづらい点もあるので、整理しました。