CCTData クラス


フィルタが C、C++両方の言語をサポートしている場合、通常1つの基底クラスとそれを継承する2つのクラス(CとC++にひとつづつ)があります。クラスは filter_init 関数によりシステムに渡されます。 例えば、最小限の宣言は以下のようになります。

class TICCTData(CCTData):
    def __init__(self):
        super(TICCTData, self).__init__()
class TICCTDataC(TICCTData):
    def __init__(self):
        super(TICCTDataC, self).__init__()
class TICCTDataCPP(TICCTData):
    def __init__(self):
        super(TICCTDataCPP, self).__init__()

これらのクラスの情報はそのコンパイラ特有の静的なものになる傾向があり、通常はオプションによって変化しません。

オーバーライド可能な関数

以下の関数または、プロパティは所定のフィルタに対しオーバーライドが可能です。最初の3つ(parser_extensions、compiler_behavior、 extra_defines) の戻り値はCCTの特定のセクションに追加されます。

CCTの実施に関しては、CCTのどのセクションにテキストが現れるかは関係がありません。このように別々になっているのはCCTの可読性を増すためです。


parser_extensions 

コンパイラに対するCCT設定のリストを返します。例:

@property
def parser_extensions(self):
    extensions = super(TICCTDataCPP, self).parser_extensions + [
        ["-dpft+"],
        ["-duc99dilt+"],
        ["* special handling for __complex__."],
        [
            r'-coderegex'
            r' "s/__complex__\s+(float|(long\s+)*double(\s+long)*)/__complex__(\1)/"'
        ],

compiler_behavior 

コンパイラに関する様々なCCT設定を表示します。例:

@property
def compiler_behavior(self):
    return [
        ["-ifn-"],
        ["-sdep-"],
        ["-sig-"],
    ]


extra_defines 

さらなるマクロ定義を追加することができます。例:

def extra_defines(self, defines):
    extra = super(TICCTDataC, self).extra_defines(defines)
    extra += [
        ['__interrupt', ''],
        ['_XKEYCHECK', '1'],
        ['__assume(a)', None],
        ['_NATIVE_NULLPTR_SUPPORTED', True],
    ]
    return extra

上記の例の値の ‘None’はマクロが空白値を持っていることを示しており、'True'は等号なしでCCTにマクロを追加することに留意してください。上記の設定は次に示す行を持つCCTを生成します。

-sd __interrupt=""
-sd _XKEYCHECK="1"
-sd __assume(a)=
-sd _NATIVE_NULLPTR_SUPPORTED

type_mappings 

GNUを使用する場合の関数の記述は以下です。

@property
def type_mappings(self):
    return (
        ("__WCHAR_TYPE__", "wchar_t"),
        ("__PTRDIFF_TYPE__", "ptrdiff_t"),
        ("__SIZE_TYPE__", "size_t"),
    )

これらのタイプに対しどの定義済みのコンパイラマクロを使用するかをシステムに示します。


additional_includes 

この関数の戻り値はCCTの ADDITIONAL_INCLUDES の値です。解析に使用されたインクルードファイルのフォルダを明示します。一般的にはサブフォルダです。


masterscript_include 

この関数の戻り値はCCTのMasterScriptに対する INCLUDE_VALUEの値です。これは、 CIP 生成スクリプトとして知られています。例えば、このCCTの戻り値は以下に示す "DATA/autocct/Script/master_script.py" です。

* "INCLUDE_LIST" : [
*    {"INCLUDE_STRUCTURE": {
*       "INCLUDE_TYPE": "MasterScript",
*       "INCLUDE_VALUE": "DATA/autocct/Script/master_script.py"
*      }
*    }],

helperscript_include および helperscript_include2 

masterscript_include と同様に、これら2つの関数は HelperScript INCLUDE_TYPE の値を指定します。ほとんどのCCTにはヘルパースクリプトが1つだけ用意されていますが、2つめが必要な場合は helperscript_include2 関数で記述することができます。


get_settings_file_options 

CCTの同期に関する SETTINGS_FILE_OPTIONS 部分で使用される値を返します。 AUTO CCT はこの設定なしで同期を実行しますが、他の設定が用意されている場合、生成されたCCTはその同期法を使用している可能性があります。例:

@property
def get_settings_file_options(self):
    return {'EXTENSION': ',', 'FLAG': '-@,--cmd_file=', 'LITERAL_QUOTES': ','}

これはファイル内で --cmd_file を使用してオプションを指定する同期の方法です。AUTO CCT は filter_init 関数に渡された値を使用します。詳細については filter_init 関数 と filterの設定 を参照してください。


include_flags 

get_settings_file_options と同様、この設定は他の同期法に関するものです。CCTで INCLUDE_FLAGS 値を設定します。


signed_char_defines および unsigned_char_defines 

CCTにおける -u 設定(符号無しchar型)は通常定義済みのマクロ値により決定されます。このプロパティにより返された define はchar 型が符号付きかどうかを知るために使用されます。例:

@property
def unsigned_char_defines(self):
    return ['__unsigned_chars__']

unsigned_char_defines に関しては、返された define が存在し値 1を持つ場合、CCT内で -u フラグは ’true ‘と設定されます(-u+)。 コンパイラがこのように動作する define を持たない場合、オプションを処理するために  Visitor クラスに プロセスを追加する必要があります。

詳細については、Visitor クラス (オプションの処理)を参照してください。


signed_bits_defines および unsigned_bits_defines 

-bits 設定 (signed型ビットフィールド)は通常コマンドラインオプションをチェックすることにより実装されますが、define をチェックすることも可能です。詳細についてはVisitor クラス (オプションの処理)を参照してください。 例:

@property
def unsigned_bits_defines(self):
    return ['__UBIT']

@property
def signed_bits_defines(self):
    return ['__SBIT']

上記の例では、define__SBIT が値1を持つ場合、 -bits が有効になります。__UBIT が値1を持つ場合、-bits は無効になります。


size_type_map

これは、Configurator クラス の custom_size_map と非常に類似している関数ですが、コンパイル環境へのアクセスは少ないです。CCTData の値は通常固定値でコンパイラオプションに依存しません。

この例では、コンパイラはコンパイラヘッダの型を定義するので2種類のみCCTに追加する必要があります。

@property
def size_type_map(self):
    return {
        "codeptr": "__SIZEOF_POINTER__",
        "dataptr": "__SIZEOF_POINTER__",
    }