4

因为我在我的机器上没有 root 访问权限,所以我在非标准目录 ( /scratch/swig/build) 中从源代码构建并安装了 swig,我希望 bazel 使用它。所以当我尝试构建 tensorflow 时,我得到了 swig 找不到的错误:

INFO: Found 1 target...
INFO: From SWIGing tensorflow/python/tensorflow.i:
bazel-out/host/bin/tensorflow/swig: line 17: swig: command not found

检查swig错误中提到的脚本,它只是一个脚本:

#!/bin/bash
swig "$@"

$PATH从这个脚本打印显示它是:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:.

我无法在 swig 脚本中附加 $PATH 变量,因为它会在构建时重新制作。那么我如何告诉 bazel 使用我的非标准 swig 位置呢?

4

2 回答 2

2

这个问题看起来是由于Bazel Sandboxing造成的。

如果是这样,那么使用以下 Bazel 选项应该可以解决该问题,因为它会关闭沙盒:

--spawn_strategy=standalone --genrule_strategy=standalone

不过,我还没有测试过。

这篇博文解释说:

沙盒是一种限制进程访问权限的技术。在 Bazel 的上下文中,我们主要关心的是限制文件系统访问。更具体地说,Bazel 的文件系统沙箱仅包含已知输入,因此编译器和其他工具甚至无法看到它们不应该访问的文件。

它在 Linux 上的工作原理:

在 Linux 上,我们使用的是 Linux 3.8 及更高版本中可用的用户命名空间。具体来说,我们创建一个新的挂载命名空间。我们创建一个临时目录,我们将允许子进程查看的所有文件挂载到其中。然后我们使用 pivot_root 使临时目录显示为所有子进程的根目录。

我们还在 /tmp 上挂载 /proc、/dev/null、/dev/zero 和一个临时文件系统 (tmpfs)。我们挂载 /dev/random 和 /dev/urandom,但建议不要使用它们,因为它可能导致不可重现的构建。

我们目前还挂载/bin、/etc、/usr(/usr/local 除外)以及每个以/lib 开头的目录,以允许运行本地工具。将来,我们计划提供一个带有一组 Linux 实用程序的 shell,并要求将所有其他工具指定为输入。

Bazel 的路线图说,MacOSX 上的沙盒计划于 2016 年 4 月进行。

沙盒应该是一件好事,因为它保证了构建规则是一致的(因为任何没有明确表示的依赖都会爆炸)。所以也许不是关闭沙盒,更好的解决方案是:

  • 修复 TensorFlow 的构建规则,使依赖项变得明确。
  • 或在上述目录之一中提供 swig(例如。/bin)。
  • 或显式配置 Bazel 以挂载 swig 所在的目录(如果可能的话-M-m我还没有测试过)。

希望这可以帮助。

于 2015-12-18T09:50:37.217 回答
2

这不是 Bazel 特定的,它是 tensorflow 代码的一部分:

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/swig/swig.sh

您可以在构建之前修改该文件。

使用该文件的特定构建规则也由 tensorflow 定义,因为它不是核心 Bazel 发行版中包含的规则:

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tensorflow.bzl#L275

于 2015-11-24T04:46:55.813 回答