ビルド、リンク、ターゲットの指定

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

コンパイラは、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実行環境で行われます。