如何在bazelrc中获取工作区目录以指定ASAN抑制文件
解决Bazel中指定ASAN抑制文件路径的问题
问题原因
.bazelrc中直接使用${workspace}或%workspace%不会被Bazel解析替换为工作区路径——--action_env的内容会直接传递给执行动作,Bazel不会处理其中的变量占位符,导致ASAN无法找到正确的抑制文件路径。
可行解决方案
方案1:使用Bazel内置环境变量BUILD_WORKSPACE_DIRECTORY
Bazel在执行构建动作时会自动设置BUILD_WORKSPACE_DIRECTORY环境变量,其值为工作区的绝对路径(即包含WORKSPACE文件的目录)。只需在.bazelrc中引用该变量即可:
build:debug --action_env='LSAN_OPTIONS=suppressions=${BUILD_WORKSPACE_DIRECTORY}/asan_leaks.supp'
用单引号包裹值,避免Bazel提前解析变量,确保变量在执行动作时由shell替换。
方案2:启动Bazel时手动传递工作区路径
如果偏好显式传递路径,可在执行bazel build/bazel run时,通过命令行直接注入工作区路径:
bazel build --config=debug --action_env="LSAN_OPTIONS=suppressions=$(bazel info workspace)/asan_leaks.supp" //your/target:name
$(bazel info workspace)会直接输出当前工作区的绝对路径,替换后传递给LSAN_OPTIONS。
方案3:将抑制文件作为构建依赖(需修改BUILD文件)
把asan_leaks.supp添加为目标的data依赖,构建时文件会被复制到execroot目录,此时可使用相对路径引用:
- 在目标的BUILD文件中添加依赖:
cc_binary( name = "mytest", srcs = ["mytest.cc"], data = ["//:asan_leaks.supp"], # 将抑制文件加入构建依赖 # 其他配置项... )
- 在
.bazelrc中使用相对路径:
build:debug --action_env=LSAN_OPTIONS=suppressions=asan_leaks.supp
这种方式无需依赖环境变量,适合需要将抑制文件随构建产物分发的场景。
内容的提问来源于stack exchange,提问作者garry
相关产品推荐
相关产品推荐

