【问题标题】:Bazel: Use swig from non-standard locationBazel:在非标准位置使用 swig
【发布时间】:2015-11-24 04:07:41
【问题描述】:

因为我在我的机器上没有 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 位置呢?

【问题讨论】:

    标签: build swig tensorflow bazel


    【解决方案1】:

    这不是 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

    【讨论】:

    • 我修改了swig.sh,现在我得到了bazel-out/host/bin/tensorflow/swig: line 3: /scratch/package/install/bin/swig: No such file or directory。我通过运行which swig 获得了 swig 目录。如果我用 swig 二进制文件替换 swig.sh,我会收到一个错误,它找不到 swig.swg 和 python.swg
    • 你是怎么修改swig.sh的?
    • 我把它改成了:/scratch/package/install/bin/swig "$@"。之后,我在脚本中添加了一些ls 语句,看来 bazel 无法真正看到这个目录(它只能看到其中极少数有限数量的目录和文件)。
    【解决方案2】:

    这个问题看起来是由Bazel Sandboxing引起的。

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

    --spawn_strategy=standalone --genrule_strategy=standalone
    

    不过,我还没有测试过。

    blog post 解释说:

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

    它在 Linux 上的工作原理:

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

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

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

    Bazel's roadmap 表示 MacOSX 上的沙盒计划于 2016 年 4 月进行。

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

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

    希望这会有所帮助。

    【讨论】:

    • 感谢您的洞察力。我通过让系统管理员在我的机器上安装 swig 来修复它。
    • @Jonno_FTW 好的,听起来不错。我很想知道我的答案是否有效。我们只需要等待其他人遇到同样的问题。干杯!
    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多