Bazel + C++项目:如何为“run”命令指定工作目录

3
我想尝试使用bazel run命令在工作区根目录下运行一个bazel目标,并希望将相对路径作为参数传递给该目标。但是目前它无法识别此参数,而从控制台手动运行却可以正常工作。
因此,我得出结论,bazel的工作目录与此时的工作区根目录不同。
我查看了bazel文档和Google,没有找到指定运行命令的工作目录的明确方法。有人知道正确的做法吗?谢谢!
P.S.: 我正在尝试运行mediapipe iris示例,我使用以下命令来构建该项目(从项目根目录)。
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/iris_tracking:iris_tracking_cpu

然后,如果我手动运行它(也是从项目根目录),它就可以正常工作:

GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/hand_tracking/hand_tracking_gpu   --calculator_graph_config_file=mediapipe/graphs/hand_tracking/hand_tracking_mobile.pbtxt

现在,如果我使用bazel run运行它,它会失败:
bazel run -c dbg --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/iris_tracking:iris_tracking_cpu -- --calculator_graph_config_file=mediapipe/graphs/iris_tracking/iris_tracking_cpu.pbtxt

请注意,在图像路径前使用$PWD并不能解决问题,因为Mediapipe引擎仍然依赖于相对路径和正确的CWD值。


我已经构建了一个简单的bazel应用程序,它打印当前目录。并且输出以下内容:"/private/var/tmp/_bazel_stepan/5fb8b1321583495e8a465a1758c5a8e4/execroot/main/bazel-out/darwin-fastbuild/bin/main/hello-world.runfiles/main"...哦...这就是我一直认为应该是工作目录的东西(讽刺)。 - Stepan Dyatkovskiy
过了一会儿,我发现了以下内容。Bazel 使用 "沙盒" 机制。因此...每当你运行 "bazel run" 时,它都会在半隔离的沙盒中运行文件(他们使用术语 "hermetic" 运行)。而且不知何故,通过向构建规则传递特殊标记,可以禁用沙盒。目前我正在尝试使用 "no-sandbox",但似乎必须清理它,否则它仍然使用沙盒。 - Stepan Dyatkovskiy
我在“cc_binary”规则中定义了以下内容:“tags = [“no-sandbox”,“no-cache”,“no-remote”]”,但没有起到作用。目前还没有任何想法。 - Stepan Dyatkovskiy
你可以将程序包装在一个 sh_binary 中,它以工作目录作为第一个参数(并将其更改为该目录),然后将其余部分传递给程序,该程序被定义为数据依赖项。 - Laurenz
2个回答

7

bazel run 执行二进制文件时会在其运行文件树中执行,官方没有改变这一点的方法。如果这是一个问题,可能的解决方案如下:

  • 不使用 bazel run;直接执行二进制文件。
  • bazel run 会将其被执行的工作目录放入 $BUILD_WORKING_DIRECTORY 环境变量中,因此二进制文件可以相对于该目录解析路径(如果需要)。
  • 在具有 POSIX shell 的平台上,有一个 hacky 解决方法:bazel run --run_under="cd $PWD &&" //some:target

0
如果您正在使用sh_binary,那么您可以通过以下脚本解决这个问题:
#!/bin/bash

set -e

LAUNCH_WORKING_DIRECTORY=$(pwd)

if test "${BUILD_WORKING_DIRECTORY+x}"; then
  cd $BUILD_WORKING_DIRECTORY
fi

$LAUNCH_WORKING_DIRECTORY/tool.sh "${@:1}"

sh_binary(
  name = "tool",
  srcs = [ "launcher.sh" ],
  data = [ "tool.sh" ],
)

Bazel 不得不说让这变得非常复杂。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接