On this page |
vcc
コンパイラはVEXソースコードをHoudiniで実行可能な形式にコンパイルします。
VEXコンパイラ(vcc)ではVEXコードのコンパイル、VEX関数用ダイアログスクリプトの生成が可能です。
さらに、指定したコンテキストで利用可能なグローバル変数と関数の一覧を作ることでクィックヘルプを追加することもできます。
コマンドラインオプション ¶
Note
ほとんどのオプションには、ショートとロングの形式があります。ロング形式は、ショート形式の後に大括弧([
)内に表示されます。
-h [--help]
コンパイラのヘルプメッセージを表示します。
コンパイラオプション ¶
-o [--vex-output] [file|-]
VEXコード出力が必要な時に指定します。ファイル名が’stdout'なら、出力がコンソールに表示されます。
--hda-output
、--otl-output
、--ds-output
のどれも指定しなかった場合は、このオプションが暗黙に定義されます。
デフォルトでは、出力のファイル名はコンテキスト関数から構築されます。
コンテキスト関数が定義されていない場合、入力のファイル名はベースとして使われます。
複数の入力ファイルを指定すると、ファイル名の引数が無視され、出力ファイル名は前述の規則から構築されます。
-d [--compile-all]
コンテキスト関数で直接的または間接的に使われていなくても、すべての関数をVEXコードにコンパイルします。このオプションはincludeファイルの構文をチェックするのに役に立ちます。
-z [--no-optimize]
最適化せずにVEXコードを生成します。
-V [--no-version-id]
VEXコードにHoudiniのバージョン識別子を埋め込みません。
プリプロセッサオプション ¶
-E [--parse-only]
入力ファイルを構文解析して標準出力に結果を出力するだけです。コンパイルは行ないません。
-D [--define] name[=value]
プリプロセッサ用のマクロを定義します。nameに値を指定しなかった場合は、名前が1に定義されます。
-I [--include-dir] path
指定したpathをインクルードパスに追加します(プリプロセッサへ指示する#include
が参照するファイルのディレクトリ検索のリスト)。標準のHoudiniインクルードパスはvex/include
です。
診断オプション ¶
-w id[,id...]
特定の警告と情報のメッセージの表示を抑制します。 wlistは抑制する警告番号をカンマで区切ったリストです。
-F [--Werror]
抑制していない警告すべてをエラーとして扱います。
-e [--Werror-output] file
診断出力すべてを標準エラー出力ではなく、指定したファイル名にリダイレクトします。
-q [--Wno-info]
情報メッセージを抑制します。
-Q [--Werror-only]
情報と警告のメッセージを抑制します。--Wno-info
を上書きします。
--fmessage-limit <N>
停止する前に表示するメッセージの最大数を設定します。制限しない場合は0(デフォルト)に設定します。
VEXコンテキストオプション ¶
-c [--context] name
コンテキスト関数を定義していない場合、これはソースをコンパイルする時に使用するVEXコンテキストを指定するために使うことができます。
-X [--list-context] context
指定したVEXコンテキストで定義されているグローバル変数と関数の型や引数の数を表示します。context
の引数の値は、利用可能なVEXコンテキストをリストするために使うことができます。
アセットオプション ¶
-L [--hda-append] [file|-]
VEXソースから生成したデジタルアセットを、指定したHDAファイルに追加します。そのHDAファイルが存在しなかった場合は、そのHDAファイルが作成されます。
-l [--hda-output] [file|-]
コンテキスト関数用のデジタルアセットを、指定したHDAファイルに書き出します。そのHDAファイルが既に存在した場合は、そのHDAファイルが上書きされます。
-K [--hda-vex-section] name
生成されたVEXコードは、指定したVEXコンテキストの標準セクション名ではなく、HDAの指定したセクション名に格納されます。
-a [--hda-dialog-script] file
VEXソースから自動で生成されたパラメータ定義ではなく、指定したファイル内のパラメータ定義を使用します。 ダイアログスクリプトのオペレータ定義は、まだVEXソースから取り込まれます。
-U [--hda-dialog-script-only]
ダイアログスクリプトをOTLに埋め込むだけです。VEXコードは追加されません。
-n [--op-name] name
指定した名前をオペレータの名前として使用します。これは、コード内の#pragma opname
ステートメントを上書きします。
-S [--op-script-name] name
指定した名前をオペレータのスクリプト名として使用します。これは、コード内の#pragma opscript
ステートメントを上書きします。
-N [--op-label] name
指定した名前をオペレータのUIラベルとして使用します。これは、コード内の#pragma oplabel
ステートメントを上書きします。
-C [--op-icon] name
指定した名前をオペレータで使用するアイコンとして使用します。これは、コード内の#pragma opicon
ステートメントを上書きします。
-t [--op-min-inputs] N
オペレータの最小入力数を設定します。これは、コード内の#pragma opmininputs
ステートメントを上書きします。
最小入力の値は、生成するオペレータタイプに合うように調整されます。
-T [--op-max-inputs] N
オペレータの最大入力数を設定します。これは、コード内の#pragma opmaxinputs
ステートメントを上書きします。
最大入力の値は、生成するオペレータタイプに合うように調整されます。
ダイアログスクリプトオプション ¶
-u [--ds-output] [file|-]
ダイアログスクリプトを指定したファイル名に書き出します。
--vex-output
と--hda-output
と同様に、複数の入力ファイルを指定すると、指定したファイル名が無視されて、出力ファイル名が自動的にコンテキスト関数名から、
またはコンテキスト関数が定義されていなければ、入力ファイル名から構築されます。
プリプロセッサ ¶
コンパイラには、コメントの除去、インクルードファイルの読み込み、マクロの展開をするプリプロセッサがあります。
プリプロセッサは通常のC言語のプリプロセッサ命令の多くをサポートしています:
#define name token-string
これ以降で使われているnameをtoken-stringに置換します。
#define name(arg,...,arg) token-string
これ以降のnameのインスタンスをtoken-stringに置換します。 nameへの各引数は、展開中にtoken-stringに置換されます。
#undef name
マクロを“未定義”にするので、これ以降で使われているnameは展開されません。
#include "filename"
ファイルの内容をソースコードのこの場所に挿入します。
引用符("
)を使うと、標準の場所(そのパスを含む)を検索する前に、現行ファイルを含むディレクトリでfilenameを検索します。
#sinclude "filename"
include
と同様ですが、静かです(ファイルが見つからなくても警告もエラーも出しません)。
#includeall "filename"
include
と同様ですが、include検索パスを走査して、見つかったすべてのファイルをincludeします。
#ifdef name
nameがマクロで定義されていれば、この行から次の#endif
またはelse
の命令までをコンパイルします。
#ifndef name
nameがマクロで定義されて いなければ 、この行から次の#endif
またはelse
の命令までをコンパイルします。
#if constant-expr
constant-exprがゼロ以外に評価されれば、この行から次の#endif
またはelse
の命令までをコンパイルします。
エクスプレッションは以下の演算子を使用することができます:
-
比較 (
==
,!=
,<=
,>=
,<
,>
) -
論理 AND (
&&
), OR (||
), NOT (!
) -
ビット演算 AND (
&
), OR (|
), XOR (^
), NOT (~
) -
算術 (
+
,-
,*
,/
,%
) -
括弧
エクスプレッションは以下の関数も使用することができます:
defined(name)
nameが定義済みマクロであれば1、そうでないなら0を返します。
#if defined(foo) && defined(fum)
environment(name)
nameが定義済み環境変数なら1を返します。
access(filename)
filenameがアプリケーションで読み込むことができれば1、そうでないなら0を返します。
#if access("/etc/passwd") #include </etc/passwd> #endif
strcmp(str1, str2)
C/C++と同じ名前の関数で、2つの文字列が同じ内容なら0を返します。各引数は、引用符で閉じた文字列またはその文字列に展開するマクロです。
#define VALUE "foo" #if strcmp(VALUE, "bar") != 0 このステートメントは、"foo" != "bar"なのでfalseです。 #endif #if !strcmp(VALUE, "foo") このステートメントは、strcmp("foo", "bar") == 0なのでtrueです。 #endif
エクスプレッションは左から右へ評価されます( 右から左へ評価するANSI C言語の規格とは異なります )。 ANSIプリプロセッサと同様に、すべての数値が整数でなければなりません。
#else
#if
命令がゼロと評価されれば、これ以降の行から#endif
の命令までの行がコンパイルされます。
#endif
条件文のセクションの終わりを示します。#if
を定義すれば必ず#endif
で終わらなければなりません。
#pragma ...
拡張する言語の機能を指定します。プラグマのリストを参照してください。
事前定義されたマクロ ¶
以下のマクロは事前に定義されています:
__vex
このシンボルは常に定義されています。if
プリプロセッサ命令の中でこれを使うことで、そのプログラムがvccでコンパイルされているかチェックすることができます。
__vex_major
コンパイラ(Houdiniバージョン番号)のメジャーバージョンの番号。
__vex_minor
コンパイラ(Houdiniバージョン番号)のマイナーバージョンの番号。
__vex_build
コンパイラ(Houdiniバージョン番号)のビルドバージョンの番号。
__vex_patch
コンパイラ(Houdiniバージョン番号)のパッチバージョンの番号。
__LINE__
ソースファイルの現在の行番号。
__FILE__
コンパイルされているファイル。
__DATE__
現在の日付(引用符付きの文字列)。例えば、"Dec 31 1999"
。
__TIME__
現在の時間(引用符付きの文字列)。例えば、"23:59:59"
。
printf("Starting shader %s at %s", __FILE__, __DATE__);