编译命令参考

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

输出emit类型为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::module import。 --dep <name>=<path> 将包名固定到一个目录。这是编译器集成点,项目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不检查运行时操作,因此练习也会检查执行结果。