ビルド、リンク、ターゲットの指定
emit出力、入力タイプ、リンク、target/CPU/ABIとプレスタンディングビルドプランについて説明します。
Wave Foundation
emit 出力
wavec build main.wave --emit=check
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
artifact emit の種類は ast、ir、bc、asm、obj、bin です。 checkは出力の種類ではなく検査制御モードであり、他のアーティファクト emitと一緒に使用しません。
wavec print supported-emit-kinds
入力種類とlink-only
コンパイラは、Waveソースに加えて、IR、bitcode、assembly、objectとarchive入力を区別します。サポートリストは次のコマンドで問い合わせます。
wavec print supported-input-types
すでに作成されているobjectまたはarchiveのみリンクするには、--input-typeと--link-onlyを使用できます。
wavec build module.o --input-type=obj --link-only --emit=bin -o app
ネイティブリンク
wavec --link=m -L ./lib build main.wave
--linkはライブラリを追加し、-Lは検索パスを追加します。 FFIでシンボルを宣言しても、そのシンボルを提供するライブラリが自動的にリンクされるわけではありません。
ターゲットを選択
実行するOSとCPUを選択するオプションです。
--target <triple>--cpu <name>--features <csv>--abi <name>--sysroot <path>
ホストのデフォルトとサポート対象は、次のコマンドで確認します。
wavec print host-target
wavec print supported-targets
wavec print target-spec --target <triple>
wavec print cpu-list --target <triple>
wavec print target-features --target <triple>
サポート対象
現在のコンピュータに合ったプログラムは、targetを指定せずにビルドします。別の環境を選択するには、以下のターゲット名を--targetに渡します。
| OS・環境 | アーキテクチャ | ターゲット名 |
|---|---|---|
| Linux | amd64 | x86_64-unknown-linux-gnu |
| Linux | ARM64 | aarch64-unknown-linux-gnu |
| Linux | RISC-V64 | riscv64-unknown-linux-gnu |
| Linux | LoongArch64 | loongarch64-unknown-linux-gnu |
| macOS | amd64 | x86_64-apple-darwin |
| macOS | ARM64 | aarch64-apple-darwin |
| Windows | amd64 | x86_64-pc-windows-msvc |
| Windows | ARM64 | aarch64-pc-windows-msvc |
| FreeBSD | amd64 | x86_64-unknown-freebsd |
| WebAssembly | 64ビット | wasm64-unknown-unknown |
OSなしで実行するプログラムにはx86_64-unknown-none-elf、aarch64-unknown-none-elf、riscv64-unknown-none-elfを使用します。インストールされているバージョンの完全なターゲットのリストは、wavec print supported-targetsで確認できます。
RISC-V64契約
Hosted RISC-V 対象のデフォルト値はgeneric-rv64、RV64GC、lp64dABIです。 Freestandingターゲットのデフォルト値はgeneric-rv64、RV64IMAC、lp64です。
wavec print target-spec --target riscv64-unknown-linux-gnu --format=json
wavec print target-spec --target riscv64-unknown-none-elf --format=json
サポートRISC-V CPUは、「generic」、「generic-rv64」、「rocket-rv64」、「sifive-u74」です。 Feature override は、m、a、f、d、c、zicsr、zifencei という名前の前に符号を付けてカンマで区切ります。
wavec build main.wave \
--target riscv64-unknown-linux-gnu \
--features=+m,+a,+f,-d,+c,+zicsr \
--abi=lp64f
RISC-V検証は一貫性のない組み合わせを拒否します。 dにはfが必要、fにはzicsrが必要です。 lp64、lp64f、lp64dはアクティブな浮動小数点featureと一致する必要があります。 ABIを直接指定しないと、コンパイラはfeatureからABIを派生します。
フリースタンディングリンク
wavec build kernel.wave \
--target riscv64-unknown-none-elf \
--freestanding \
--entry=_start \
--linker-script=linker.ld \
--no-start-files \
-o kernel.elf
--freestandingは、デフォルトライブラリを使用しない側にビルド設定を調整します。 --entryはリンカエントリを、--linker-scriptはスクリプトを指定し、--no-start-filesはホスト起動ファイルの除外を指定します。
実際の実行前にリンク計画を確認するときは、--dry-runを使用できます。
Hosted クロスリンク
他のOS・CPUで実行するプログラムを作成する場合は、対象環境のライブラリパスをsysrootに指定します。別のリンカーを使用する場合は、-C linkerでパスを指定します。
wavec build main.wave \
--target riscv64-unknown-linux-gnu \
--sysroot /path/to/riscv64-sysroot \
-C linker=/path/to/target-linker \
-o app-riscv64
sysrootとリンクするライブラリは、選択したOS・CPU・ABIに合わせます。
クロスビルドで確認する
- target tripleがコンパイラのサポートリストにあるか
- sysrootとリンカーが対象ABIに合うか
- リンクライブラリがターゲットアーキテクチャ用かどうか
- CPU featureが対象CPUで有効か
- プリスタンディングの場合、エントリシンボルとメモリ配置がリンカスクリプトと一致するかどうか
WebAssembly実行
wasm64結果はmemory64をサポートする実行環境で使用されます。ファイル・時間・入力などの外部機能を使用するモジュールは、その機能に対応するhostimportを接続する必要があります。
ターゲットコードを作成して接続するプロセスは、--dry-runで確認できます。実際の実行は、選択したOSまたはWebAssembly実行環境で行われます。