如何让Bazel run_shell规则可调用系统工具cc1?
问题解答
你的推测完全正确:Bazel的run_shell沙箱环境默认不会将runfiles目录下的依赖工具路径自动加入$PATH——即使你已经把cc1作为隐式依赖添加到规则中,它只会被放置在runfiles目录内,但Java程序调用cc1时,系统无法在默认PATH中找到它。
以下是将cc1所在路径添加到沙箱$PATH的具体方法:
确保cc1被正确声明为依赖
在run_shell规则的deps字段中加入cc1的目标(比如//tools:cc1),保证它被包含在runfiles中。在脚本中获取runfiles路径并修改$PATH
Bazel会在沙箱中设置RUNFILES_DIR环境变量(旧版本可能用TEST_SRCDIR),指向runfiles根目录。你可以在执行jar脚本前,先定位cc1的路径并将其所在目录加入$PATH:# 定位cc1在runfiles中的完整路径(假设目标是//tools:cc1,工作区名为my_workspace) CC1_RUNFILE_PATH="$RUNFILES_DIR/my_workspace/tools/cc1" # 将cc1所在目录添加到PATH export PATH="$PATH:$(dirname "$CC1_RUNFILE_PATH")" # 再执行你的jar脚本 java -jar your_script.jar ...或者更通用的写法(无需硬编码工作区名称):
# 利用Bazel的location宏获取cc1的路径(在run_shell的args中传递) # 假设run_shell的args包含 "$(location //tools:cc1)",在脚本中用$1接收 export PATH="$PATH:$(dirname "$1")" # 执行jar脚本 java -jar your_script.jar ...注意事项
- 确保cc1的目标是可执行规则(比如
cc_binary或sh_binary),否则无法在runfiles中生成可执行文件。 - 若使用旧版Bazel,
RUNFILES_DIR可能不存在,可替换为TEST_SRCDIR尝试。 - 如果无法修改bash脚本,也可以在
run_shell的env字段中直接设置PATH,但需要提前确定cc1的runfiles路径格式。
- 确保cc1的目标是可执行规则(比如
内容的提问来源于stack exchange,提问作者dieortin
相关产品推荐
相关产品推荐

