在Bazel中使用绝对路径是否安全?

在Bazel中使用绝对路径是否安全?,bazel,Bazel,我正在尝试将Bazel与一个旧的、基于make/shell的构建系统一起添加。我可以很容易地使用shell命令,作为早期的先决条件,返回旧构建系统构建的某个工具或库的绝对路径。我可以在genrule()中使用这些命令,它将所需的文件(如头文件和lib)复制到Bazel中,以cc_库()的形式公开 我发现,如果命令使用具有绝对路径的文件,则genrule()不会检测到依赖关系—沙箱不会捕获它。在某种程度上,我(ab)使用了这种行为 安全吗?Bazel的某些未来更新是否会在genrule中的命令中以

我正在尝试将Bazel与一个旧的、基于make/shell的构建系统一起添加。我可以很容易地使用shell命令,作为早期的先决条件,返回旧构建系统构建的某个工具或库的绝对路径。我可以在genrule()中使用这些命令,它将所需的文件(如头文件和lib)复制到Bazel中,以cc_库()的形式公开

我发现,如果命令使用具有绝对路径的文件,则genrule()不会检测到依赖关系—沙箱不会捕获它。在某种程度上,我(ab)使用了这种行为


安全吗?Bazel的某些未来更新是否会在genrule中的命令中以这种方式拒绝访问基于绝对路径的文件?

默认情况下,Bazel的大多数沙盒允许访问源树之外的大多数路径。详细信息取决于您使用的沙箱实现。例如,docker沙箱允许访问docker映像内部的所有路径。很难对未来的Bazel版本做出承诺,但我认为沙箱不太可能阻止访问
/bin/bash
(例如),这意味着其他绝对路径也可能继续工作

如果需要,可用于显式阻止路径

如果您在构建的每台计算机上都有可用的文件,那么您的设置应该可以正常工作。请记住,Bazel无法识别这些文件的内容何时发生更改,因此您很容易在各种缓存中获得过时的结果。您可以通过确保外部路径在其内容发生更改时进行更改来避免这种情况

如果您提前知道路径,可能更适合避免这些问题

如果您事先不知道路径,可以编写一个脚本,通过该脚本运行任意命令来检索路径,并使用符号链接路径

Tensorflow有一个做类似事情的例子(除了查看环境变量之外,您还可以做其他事情,比如
find\u computecpp\u root
does,您可以将整个目录而不是其中的所有文件进行符号链接):

def\u symlink\u dir(存储库\u ctx、src\u dir、dest\u dir):
“”“符号链接目录中的所有文件。
Args:
repository_ctx:存储库上下文。
src_dir:源目录。
dest_dir:在其中创建符号链接的目标目录。
"""
files=repository\u ctx.path(src\u dir).readdir()
对于文件中的src_文件:
repository_ctx.symlink(src_文件,dest_dir+“/”+src_文件.basename)
def find_computecpp_根目录(存储库\u ctx):
“”“查找ComputeCpp编译器。”“”
sycl_name=“”
如果存储库中的路径为ctx.os.environ:
sycl\u name=repository\u ctx.os.environ[\u COMPUTECPP\u TOOLKIT\u PATH].strip()
如果sycl_name.startswith(“/”):
返回sycl_名称
失败(“找不到SYCL编译器,请更正路径”)
定义同步自动确认imp(存储库ctx):
computecpp\u root=查找\u computecpp\u root(存储库\u ctx)
_symlink_dir(存储库_ctx、计算cpp_root+“/lib”、“sycl/lib”)
_符号链接\u目录(存储库\u ctx,计算CPP\u根+“/include”,“sycl/include”)
_符号链接\u目录(存储库\u ctx,计算CPP\u根+“/bin”,“sycl/bin”)

您是否打算使用远程执行?除非您的远程执行节点与本地节点相同,否则这些规则将失败。我将签出放在一个容器中,这样所有路径都相同。我之前发现,我必须确保每个容器都有一个Bazel服务器。