コンパイラコマンドリファレンス
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 |
インストールしたバージョン情報を出力します。 |
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のようなビルドツールが使用する安定した統合インターフェースです。
emitと入力種類
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
出力エミットの種類は ast、ir、bc、asm、obj、binです。 checkは制御モードなので、単独で使用する必要があります。パイプラインで許可される出力の種類は、カンマで複数指定できます。
入力種類はwave、ir、bc、asm、obj、archiveです。 --input-type=<kind>はすべての入力の種類を強制的に指定します。 objectまたはarchive入力のみリンクするときは、バイナリemitと--link-onlyを使用します。
wavec build module.o --input-type=obj --link-only --emit=bin -o app
出力位置
| オプション | 効果 |
|---|---|
-o <file> |
メイン出力パスを指定します。 |
--out-dir <dir> |
emit 出力を指定したディレクトリに置きます。 |
--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 には tokens、ast、ir、mc、hex、all を使うことができ、いくつかのステップはコンマで結合できます。
ネイティブリンク
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
カーネルのようなプリスタンディング出力は、--freestandingとともに環境に合った--entry、--linker-script、--no-start-files設定を使用します。
外部パッケージの解釈
wavec --dep-root .vex/deps build main.wave
wavec --dep math=/opt/wave-deps/math build main.wave
--dep-root <dir>は、外部package::moduleimportを検索するルートを追加します。 --dep <name>=<path>はパッケージ名を1つのディレクトリに固定します。これはコンパイラ統合ポイントであり、プロジェクトmanifest、依存関係のダウンロードとlockfileはVexが担当します。
サポート機能の問い合わせ
ターゲットや成果物の種類を使用するツールは、wavec printでサポート情報を問い合わせることができます。
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
host、default-target、target-listなどの項目も問合せできます。構造化出力をサポートする項目は、--format=jsonを受け取ります。
コンパイラとツールチェーンの境界
wavecはソースチェック、コード生成、リンクを担当します。 Vexはパッケージmanifest、依存グラフ、lockfileと再現可能なパッケージビルドを担当します。 Whaleは、独立して実行する低レベルツールチェーンです。
std パス指定
wavec --std-root /absolute/path/to/std check main.wave
wavec --std-root /absolute/path/to/std run main.wave
指定されたstdパスはインストールパスより優先され、誤ったパスまたは互換性のないstdの場合は失敗します。他のインストールのstdに自動的に置き換えられません。コンパイラに対応するstdを選択してください。
出力 -oにはソース・入力ファイルと異なるパスを使用します。 checkはランタイム動作まで確認しないため、練習では実行結果も確認します。