コンパイラコマンドリファレンス

ビルド、検査、実行、リンク、ターゲット照会、ビルドツール連携に使う wavec コマンドを説明します。

Wave Foundation

コマンドモデル

wavec はコンパイラの CLI です。個別の入力を直接コンパイルし、ツールにコンパイラ機能を公開し、インストール済み標準ライブラリのソースを管理できます。

wavec [global-options] <command> [command-options]
コマンド 用途
wavec build <input...> フラグで選択された検査、コード生成、リンク、実行のパイプラインを処理します。
wavec check <file> build <file> --emit=check の別名です。
wavec run <file> [-- <args...>] build <file> --run の別名です。-- 以降の引数はプログラムへ渡されます。
wavec print <item> ターゲットとツールチェーンの機能を照会します。
wavec install std 標準ライブラリをインストールします。
wavec update std インストール済み標準ライブラリを更新します。
wavec --version コンパイラと LLVM バックエンドのバージョンを表示します。

インストール済みコンパイラが提供する完全なオプション一覧は wavec --help で確認できます。

ビルド、検査、実行

wavec build main.wave
wavec check main.wave
wavec run main.wave -- first-argument second-argument

build は既定で実行ファイルを生成します。check はフロントエンド検証後に停止します。run にはバイナリ出力が必要で、共有ライブラリのビルドとは併用できません。

コンパイル、リンク、実行を行わずに要求を検証し、予定されている段階を確認するには --dry-run を使います。

wavec build main.wave --target riscv64-unknown-linux-gnu --dry-run
wavec build main.wave --dry-run --error-format=json

JSON 形式は Vex などのビルドツールが使用する安定した連携インターフェースです。

出力形式と入力形式

wavec build main.wave --emit=ast
wavec build main.wave --emit=ir
wavec build main.wave --emit=bc
wavec build main.wave --emit=asm
wavec build main.wave --emit=obj -o main.o
wavec build main.wave --emit=bin -o app

アーティファクトの出力形式は astirbcasmobjbin です。check は制御モードであり、単独で使用します。パイプラインが許可する場合は、複数のアーティファクト形式をカンマ区切りで指定できます。

受け付ける入力形式は waveirbcasmobjarchive です。--input-type=<kind> はすべての入力形式をひとつに固定します。オブジェクトまたはアーカイブ入力をバイナリへリンクするときは --link-only を使います。

wavec build module.o --input-type=obj --link-only --emit=bin -o app

出力先

オプション 効果
-o <file> 主出力のパスを設定します。
--out-dir <dir> 生成されたアーティファクトを指定ディレクトリに配置します。
--target-dir <dir> 中間生成物と既定アーティファクトのルートを指定します。

最適化とコンパイラの調査

wavec -O2 build main.wave
wavec --debug-wave=tokens,ast build main.wave

最適化レベルは -O0-O1-O2-O3-Os-Oz-Ofast です。--debug-wave には tokensastirmchexall を指定でき、複数の段階はカンマで組み合わせられます。

ネイティブリンク

wavec --link=m -L ./lib build main.wave
wavec build main.wave --shared -o libexample.so
wavec build main.wave --static -o app
wavec build main.wave --pie -o app

--link=<lib> はネイティブライブラリを追加し、-L <path> は検索パスを追加します。リンクモードには、それぞれの互換性規則に従う --shared--static--pie--no-pie があります。

バックエンドとリンカーの主な制御オプションは次のとおりです。

  • --target--cpu--features--abi--sysroot
  • -C linker=<path>-C link-arg=<arg>
  • -C link-sysroot=<path>-C relocation-model=<model>
  • -C no-default-libs

カーネルなどのフリースタンディング出力では、適切な --entry--linker-script--no-start-files とともに --freestanding を使います。

外部パッケージの解決

wavec --dep-root .vex/deps build main.wave
wavec --dep math=/opt/wave-deps/math build main.wave

--dep-root <dir> は外部の package::module インポートを解決するためのルートを追加します。--dep <name>=<path> はパッケージ名をひとつのディレクトリに固定します。これらはコンパイラとの連携点であり、プロジェクトマニフェスト、依存関係の取得、ロックファイルは Vex が管理します。

機能の照会

ツール側にコンパイラ機能をハードコードしないでください。インストール済みコンパイラへ照会します。

wavec print host-target
wavec print target-spec --format=json
wavec print supported-targets
wavec print supported-input-types
wavec print supported-emit-kinds
wavec print supported-print-items
wavec print cpu-list --target riscv64-unknown-linux-gnu
wavec print target-features --target riscv64-unknown-linux-gnu
wavec print default-linker
wavec print sysroot
wavec print std-path
wavec print dep-search-paths

ほかに照会できる項目として hostdefault-targettarget-list があります。構造化出力に対応する項目では --format=json を指定できます。

コンパイラとツールチェーンの境界

wavec は Wave ソースをコンパイルし、生成アーティファクト、ターゲット、リンクを制御します。Vex はパッケージマニフェスト、依存グラフ、ロックファイル、再現可能なパッケージビルドを管理します。Whale は独自のコマンドを持つ別の低レベルツールチェーンです。