CLI リファレンス
wirespec コンパイラはコマンドラインから実行します:
wirespec <command> [options]wirespec compile
.wspec ファイルをターゲット言語にコンパイルします。
使い方:
wirespec compile <file> [options]オプション:
| フラグ | 説明 |
|---|---|
-o, --output DIR | 出力ディレクトリ(デフォルト: build) |
-t, --target c|rust | ターゲット言語(デフォルト: c)。rust なら .rs を生成 |
-I, --include-path DIR | インポート解決用の検索パス(複数指定可) |
--recursive | 推移的依存もすべてコンパイル |
--fuzz | libFuzzer ハーネスも生成(C ターゲットのみ) |
例:
単一ファイル:
wirespec compile examples/quic/varint.wspec -o build/インポート付き:
wirespec compile examples/quic/frames.wspec -I examples/ --recursive -o build/Rust へのコンパイル:
wirespec compile examples/quic/varint.wspec -t rust -o build/libFuzzer ハーネス付き:
wirespec compile examples/quic/frames.wspec -t c --fuzz -o build/出力ファイル:
モジュール quic.frames を C にコンパイルした場合:
| ファイル | 内容 |
|---|---|
quic_frames.h | 構造体・enum 宣言、関数プロトタイプ |
quic_frames.c | パース・シリアライズ・serialized_len の実装 |
fuzz_quic_frames.c | libFuzzer ハーネス(--fuzz 時のみ) |
--recursive を指定すると、推移的依存ごとに .h/.c ペアが生成されます。
-t rust の場合は .rs ファイルを 1 つ生成:
| ファイル | 内容 |
|---|---|
quic_varint.rs | Rust 構造体、parse / serialize / serialized_len 実装 |
生成された Rust コードは wirespec-rt クレートの Cursor、Writer、Error 型を使います。
wirespec check
コードを生成せず、.wspec ファイルの型チェックだけ行います。CI やエディタ統合に便利です。
使い方:
wirespec check <file>check コマンドは入力ファイルのみを受け取ります。-I 等のフラグには対応していません。
例:
wirespec check examples/quic/frames.wspec成功時は ok: <path> を stderr に出力しコード 0 で終了します。失敗時は診断を stderr に出力し、非ゼロで終了します:
error: undefined type 'VarItn'
--> examples/quic/frames.wspec:34:42
|
34 | frame QuicFrame = match frame_type: VarItn {
| ^^^^^^
= in frame 'QuicFrame'
hint: did you mean 'VarInt'?ファズビルドの手順
libFuzzer ハーネスの生成からビルドまで:
# ステップ 1: --fuzz でコンパイル
wirespec compile examples/quic/frames.wspec -t c --fuzz -o build/
# ステップ 2: サニタイザー付きでビルド
cd build
clang -fsanitize=fuzzer,address,undefined \
-o fuzz_frames \
quic_frames.c fuzz_quic_frames.c \
-I../runtime
# ステップ 3: スモークテスト
./fuzz_frames -max_total_time=10
# ステップ 4: シードコーパスで実行
./fuzz_frames fuzz/corpus/quic_frames/ -max_total_time=60生成されたハーネスは任意の入力に対して _parse() を呼び出し、パースが成功した場合はシリアライズ → 再パースのラウンドトリップで結果が一致することを確認します。
インポートパスの解決
.wspec ファイルに import 文がある場合、コンパイラは以下の順序でモジュールを検索します:
- インポート元ファイルのあるディレクトリ
-I/--include-pathで指定されたディレクトリ(指定順)
モジュール quic.varint はドット区切りをパス区切りに変換し、quic/varint.wspec(または quic/varint.wspec)として解決されます。
例:
examples/
quic/
varint.wspec # module quic.varint
frames.wspec # import quic.varint.VarIntwirespec compile examples/quic/frames.wspec -I examples/ -o build/-I examples/ により、quic.varint は examples/quic/varint.wspec に解決されます。
終了コード
| コード | 意味 |
|---|---|
0 | 成功 |
1 | コンパイルエラー(パース、型チェック、コード生成のいずれかで失敗) |