Opciones de compilación, enlace y destino

Describe emit entregables, tipos de entrada, enlaces, target/CPU/ABI y el plan de construcción independiente.

Wave Foundation

emit Salida

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 Los tipos son ast, ir, bc, asm, obj, bin. check es un modo de control de inspección, no un tipo entregable, y no debe usarse con el otro artifact emit.

wavec print supported-emit-kinds

Además de la fuente Wave, el compilador distingue entre las entradas IR, bitcode, assembly, object y archive. La lista de soporte se consulta con el siguiente comando:

wavec print supported-input-types

Para vincular solo los object o archive ya creados, puede usar --input-type y --link-only.

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

enlace nativo

wavec --link=m -L ./lib build main.wave

--link agrega una biblioteca y -L agrega una ruta de búsqueda. Incluso si se declara un símbolo en FFI, la biblioteca que proporciona ese símbolo no se vincula automáticamente.

Seleccionar objetivo

Opción para seleccionar OS y CPU para ejecutar.

  • --target <triple>
  • --cpu <name>
  • --features <csv>
  • --abi <name>
  • --sysroot <path>

Verifique los valores predeterminados del host y los destinos admitidos con el siguiente comando:

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>

Apoyado por

El programa para su computadora actual se creará sin especificar target. Para seleccionar un entorno diferente, pase el nombre de destino a continuación a --target.

OS·Medio ambiente arquitectura nombre del objetivo
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 bits wasm64-unknown-unknown

Para programas que se ejecutan sin OS, utilice x86_64-unknown-none-elf, aarch64-unknown-none-elf y riscv64-unknown-none-elf. Puede encontrar una lista completa de destinos para las versiones instaladas en wavec print supported-targets.

RISC-V 64 contrato

Los valores predeterminados para los objetivos Hosted RISC-V son generic-rv64, RV64GC, lp64d ABI. Los valores predeterminados para el objetivo Freestanding son generic-rv64, RV64IMAC y lp64.

wavec print target-spec --target riscv64-unknown-linux-gnu --format=json
wavec print target-spec --target riscv64-unknown-none-elf --format=json

Admite RISC-V CPU para generic, generic-rv64, rocket-rv64, sifive-u74. Feature override es m, a, f, d, c, zicsr, zifencei Coloque un cartel delante del nombre y sepárelo con una coma.

wavec build main.wave \
  --target riscv64-unknown-linux-gnu \
  --features=+m,+a,+f,-d,+c,+zicsr \
  --abi=lp64f

RISC-V La verificación rechaza combinaciones inconsistentes. d requiere f y f requiere zicsr. lp64, lp64f, lp64d deben coincidir con el punto flotante feature que ha habilitado. Si no especifica ABI directamente, el compilador derivará ABI de feature.

Enlace independiente

wavec build kernel.wave \
  --target riscv64-unknown-none-elf \
  --freestanding \
  --entry=_start \
  --linker-script=linker.ld \
  --no-start-files \
  -o kernel.elf

--freestanding ajusta la configuración de compilación para evitar el uso de bibliotecas predeterminadas. --entry especifica entradas del vinculador, --linker-script especifica scripts y --no-start-files especifica exclusiones de archivos de inicio del host.

Puede utilizar --dry-run para comprobar el plan de enlace antes de la ejecución real.

Hosted Enlace cruzado

Al crear un programa para ejecutar en otro OS·CPU, especifique la ruta de la biblioteca del entorno de destino como sysroot. Si utiliza un vinculador independiente, especifique la ruta como -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

Las bibliotecas que se vincularán con sysroot están alineadas con el OS·CPU·ABI.

Qué comprobar en la construcción cruzada

  • target triple está en la lista de soporte de su compilador
  • sysroot y el vinculador coinciden con el objetivo ABI
  • ¿La biblioteca de enlaces es para la arquitectura de destino?
  • CPU feature es válido para el objetivo CPU
  • Si es independiente, verifique si el símbolo de entrada y la ubicación de la memoria coinciden con el script del vinculador.

Ejecute WebAssembly

Los resultados de wasm64 se utilizan en un entorno de ejecución que admite memory64. Los módulos que utilizan funciones externas como archivo, hora y entrada deben conectarse al host import correspondiente a esa función.

El proceso de creación y conexión del código de destino se puede encontrar en --dry-run. La ejecución real tiene lugar en el entorno de ejecución OS o WebAssembly seleccionado.