AUTO CCT スクリプトを使って作業する

Auto CCT機能はCCTを生成するために一連の python スクリプトを使用します。スクリプトはフィルタと呼ばれます。ほとんどのフィルタにはいくつもの主要なクラスがあります。代表的なものは:

  • Configurator クラス:ConfiguratorにはCCTの多岐に渡る特性(target, hierarchy、 compiler nameなど)が含まれています。サイズ、アライメント値などパーサに必要な様々なフラグも指定します。詳細はConfigurator クラスを参照して下さい。
  • CCTData クラス:通常、C言語にひとつ、C++言語にひとつのCCTDataクラスがあります。このクラスの機能は define の追加、一般のCCTオプションの指定、マクロ定義の追加などです。詳細についてはCCTData クラスを参照して下さい。
  • Visitor クラス (オプション処理):Visitor クラスはコマンドラインの引数を処理します。詳細についてはVisitor クラス (オプションの処理) を参照してください。

クラスはfilter_init 関数に渡す必要があります。詳細については、filter_init 関数 と filterの設定を参照してください。

ゼロからフィルタを生成する方法の詳細については新しいコンパイラを追加するを参照してください。


デバッグ

フィルタを使って作業をするときには、 Perforce QACのログレベルを TRACE に設定することを推奨します。これにより、ログファイルにデバッグの詳細がログファイルまたは、qacli からの出力に表示されます。

エラーが発生した場合に python のスタックトレースが表示されます。

フィルタはログに情報を書込むため debug 関数を呼出します。新しいデバッグ呼出しの追加は問題点の追跡をアシストします。

通常、ジェネレータを起動するため qacli を使用することが推奨されます。これは正確に何が起きているかを確かめるのに役立ちます。

ログファイルを見ると、cctgen.py という名前のスクリプトがあります。これが qainject バイナリを順番に起動します。ログレベルをTRACEに設定することでこれらのプロセスがどのように起動されるかを見ることができます。従って、qacli とは関係なく呼出すことができます。


フィルタの場所と qafilter.conf

フィルタは製品に付属しているCCTと共に格納されています。Perforce QACが初回にスタートするときに、インストレーションフォルダからユーザのlocal data へコピーされます。

Windows での場所:

C:\Perforce\QAC-<version>\config\cct\cctgen\qainject_filters

および

%LOCALAPPDATA%\Perforce\QAC-<version>\config\cct\cctgen\qainject_filters 

フォルダはすべてのフィルタおよび、当該実行ファイルにどのフィルタが使用されているかを説明するファイル qafilter.conf も含みます。例えば、icc で始まるすべての実行ファイルに対し qa_icc_filter.py ファイルを起動する行は:

# IAR compilers 
filter qa_icc   icc* 

#で始まるコメント行は qacli help -a コマンドで使用され、コンパイラの名前を表示するためすべてのサポートされているフィルタを表示します。


CCTの例

どの関数がセクションの出力を制御するかに関する情報をもつCCTの例です。以下は簡潔にするためセクションまたは、設定が削減されているTI CCTです。

{
"PLATFORM" : "PLATFORM_WIN64",
"COMPILER_HIERARCHY" : "TI",
"COMPILER_NAME": "ARMCL",
"COMPILER_VERSION": "20.2",
"HOST": "x64",
"TARGET": "ARM",
"SOURCE_LANGUAGE": "C",
"COMPILER_CMD": "c:\\ti\\ccs1110\\armcl.exe",
"COMPILER_ADDITIONAL_ARGS" : ["--plain_char=signed"],
"ADDITIONAL_INCLUDES": "DATA/autocct/Stub/TI_C",

"INCLUDE_LIST" : [
    {"INCLUDE_STRUCTURE": {
        "INCLUDE_TYPE": "MasterScript",
        "INCLUDE_VALUE": "DATA/autocct/Script/master_script.py"
        }
    }],
"SYNCHRONISATION" : {
    "INCLUDE_FLAGS":"-I",
    "DEFINE_FLAGS":"-D",
    "SETTINGS_FILE_OPTIONS": {
        "FLAG":"-@,--cmd_file=",
        "EXTENSION":",",
        "LITERAL_QUOTES":","
        }
    }
}

  • PLATFORM :使用しているOSにより、PLATFORM_WIN64 または PLATFORM_LIN64 です。
  • COMPILER_HIERARCHY :Configurator内の hierarchy 関数から取得します。
  • COMPILER_NAME :filter_init へのパラメータから取得または、Configurator内の user_visible_ name によりオーバーライドされます。
  • COMPILER_VERSION :filter_init へ与えられたパラメータをもつコンパイラから抽出されます。
  • HOST :使用してるホストコンピュータにより、x64 または x86 です。
  • TARGET :このケースではConfiguratorから取得されます。
  • SOURCE_LANGUAGE :ファイル拡張子により決定されます。
  • COMPILER_CMD :コンパイラバイナリへのパスです。
  • COMPILER_ADDITIONAL_ARGS :filter_init 関数への ignore_options パラメータにより制御されたため特定のオプションが削除された最初のコンパイルコマンドのパラメータです。
  • ADDITIONAL_INCLUDES :CCTData内の additional_include 関数から取得します。
  • INCLUDE_STRUCTURE :このケースでは CCTData内の masterscript_include から取得します。これはCIP生成スクリプトをへのパスです。
  • SYNCHRONISATION :設定は様々なコンパイラフラグの働きがすでに分かっているためAuto CCTの設定には関係なく同期を実行します。この設定は作成されたCCTが後に異なる同期メソッドで使用されることを考慮して念のため生成されます。
  • INCLUDE_FLAGS :CCTData 内の include_flags から取得します。DEFINE_FLAGS はCCTData 内の define_ flags から取得します。
  • SETTINGS_FILE_OPTIONS :CCTData内の get_settings_file_options から取得します。
* compiler behavior
* parsing extensions
-xn 16384
-na 16384
-ar+
-ex ansipc
-ex pc
-ex asm
-ex longlong
-fpc+
-sl-
-xc-

parsing extension セクションは CCTData内の parser_extensions 関数から取得します。

* CIP replacement
-q "C:\ti\ccs1110\ccs\tools\compiler\ti-cgt-arm_20.2.5.LTS\include\libcxx"
-si "C:\ti\ccs1110\ccs\tools\compiler\ti-cgt-arm_20.2.5.LTS\include\libcxx"
-q "C:\ti\ccs1110\ccs\tools\compiler\ti-cgt-arm_20.2.5.LTS\include\libcxx\ext"
-si "C:\ti\ccs1110\ccs\tools\compiler\ti-cgt-arm_20.2.5.LTS\include\libcxx\ext"

CIPがコンパイラインクルードパスを生成しない場合、Configurator 内の _generates_cip_includes のメンバ変数を True に設定する必要があります。

設定の後、read_includes 関数の結果(filter_init関数に渡される)がこのセクションを生成するために使用されます。

* preprocessor symbol definitions
-sd __intaddr__="1 prl_ignore_paren"
-sd __interrupt=""
-sd interrupt=""
-sd __LONG_LONG_MAX__="9223372036854775807"
-sd __LONG_MAX__="2147483647"
-sd _OPTIMIZE_FOR_SPACE="1"
-sd __PRAGMA_REDEFINE_EXTNAME="1"
-sd prl_ignore_paren="_ignore_paren"
-sd _PRL_STRINGIFY(x)="#x"
-sd __PTRDIFF_T_TYPE__="int"
-sd __signed_chars__="1"
-sd __SIZE_T_TYPE__="unsigned"
-sd __SIZEOF_DOUBLE__="8"
-sd __SIZEOF_FLOAT__="4"
-sd __SIZEOF_INT__="4"
-sd __SIZEOF_LONG__="4"
-sd __STDC__="1"
-sd __STDC_VERSION__="199409L"
-sd __TI_VFPLIB_SUPPORT__="1"
-sd __TI_WCHAR_T_BITS__="16"
-sd __TIME__=_PRL_STRINGIFY("13:10:40")
-sd __TIMESTAMP__="__DATE__ __TIME__"
-sd __TMS470__="1"
-sd __va_argcsu="1 prl_ignore_paren"
-sd __va_argref="1 prl_ignore_paren"
-sd __VERSION__=_PRL_STRINGIFY("EDG gcc 4.8 mode")
-sd __WCHAR_T_TYPE__="unsigned short"

これらの設定のほとんどはコンパイラに定義済のマクロのリストを要求した結果です。これらは通常、filter_init 関数の info_args パラメータでコンパイラを実行することで取得します。

あるいは、read_defines 関数(filter_init に渡される)を使用します。他の値は CCTData内の extra_defines 関数から取得します。

* intrinsic types
-it ptrdiff_t="int"
-it size_t="unsigned"
-it wchar_t="unsigned short"

intrinsic types は CCTData内の type_mappings 関数から取得します。

* basic type size and alignment
-s char="8"
-a char="1"
-s double="64"
-a double="8"
-s float="32"
-a float="4"
-s int="32"
-a int="4"
-s ldouble="64"
-a ldouble="8"
-s long="32"
-a long="4"
-s longlong="64"
-a longlong="8"
-s short="16"
-a short="2"

型サイズとアライメントセクションは CCTData内の ize_type_map から計算されます。

* qac parser options
-bits
-ex c++
-ex dollar
-u-

GNU Visitor クラスから継承する TI  フィルタの Visitor クラスはデフォルトで bits, ex dollar および u の設定をもちます。

これらの設定の詳細については、Visitor クラス (オプションの処理)_qac_parser_options およびCCTData クラスsigned_char_defines を参照してください。-ex c++ フラグはバージョンが C90 でないときに C ソースコードのシステムにより追加されます。