Windows下Bazel调用MSYS2时无法找到g++的求助
我通过Chocolatey在Windows系统上安装了Bazel,同时安装MSYS2以获取bash.exe环境。已通过MSYS2的pacman工具安装g并将其添加至系统PATH,在MSYS2 shell及原生Powershell中执行g++ --version均正常,但通过Bazel执行构建命令时,却出现g未找到的错误,具体报错如下:
C:/
> bazel build //kernels:rasterize_triangles_kernel
INFO: Analyzed target //kernels:rasterize_triangles_kernel (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
ERROR: C://kernels/BUILD:20:8: Executing genrule //kernels:rasterize_triangles_kernel failed: (Exit 127): bash.exe failed: error executing command (from target //kernels:rasterize_triangles_kernel) C:\msys64\usr\bin\bash.exe -c ... (remaining 1 argument skipped)
/usr/bin/bash: line 1: g++: command not found
Target //kernels:rasterize_triangles_kernel failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 4.883s, Critical Path: 4.80s
INFO: 2 processes: 2 internal.
FAILED: Build did NOT complete successfully
可行的解决方法
在genrule中显式指定PATH或g++绝对路径
如果是自定义genrule,要么直接把命令里的g++替换为MSYS2中g++的绝对路径(比如C:/msys64/usr/bin/g++.exe),要么在cmd开头先添加MSYS2的bin目录到PATH:genrule( name = "rasterize_triangles_kernel", srcs = [...], outs = [...], cmd = "export PATH=/usr/bin:$PATH && g++ [你的编译参数]", tools = [...], )让Bazel继承当前环境的完整PATH
Bazel默认会隔离构建环境,可能不会完全读取系统PATH。执行构建时可以用参数强制继承当前环境的PATH:bazel build //kernels:rasterize_triangles_kernel --action_env=PATH="$env:PATH"也可以在执行Bazel命令前,手动把MSYS2的bin目录放到PATH最前端,避免路径优先级问题:
$env:PATH = "C:\msys64\usr\bin;" + $env:PATH bazel build //kernels:rasterize_triangles_kernel配置Bazel自定义C++工具链
创建工具链配置文件指定MSYS2的编译器路径,比如新建toolchain.bzl:def _msys2_cc_toolchain_impl(ctx): toolchain = cc_common.create_cc_toolchain_config_info( ctx = ctx, toolchain_identifier = "msys2-gcc", host_system_name = "x64_windows", target_system_name = "x64_windows", target_cpu = "x86_64", compiler = "gcc", tool_paths = { "gcc": "C:/msys64/usr/bin/g++.exe", "g++": "C:/msys64/usr/bin/g++.exe", "ld": "C:/msys64/usr/bin/ld.exe", "ar": "C:/msys64/usr/bin/ar.exe", }, ) return [toolchain] msys2_cc_toolchain = rule( implementation = _msys2_cc_toolchain_impl, provides = [CcToolchainConfigInfo], )之后在WORKSPACE中注册该工具链,或构建时用
--crosstool_top参数指定使用这个工具链。
内容的提问来源于stack exchange,提问作者Zoom

