在巴泽尔移动文件

Moving files in Bazel

本文关键字:移动 文件      更新时间:2023-10-16

我在ubuntu 18.04上使用bazel(0.22版本)来构建C++代码。

main.cpp有一个用于读取ui文件的api,该api读取ui文件。

Api看起来像低于

auto ui_data = readUIData("Front_end.ui");

我能够构建代码。但是,由于"Front_end.ui"文件始终位于bin文件夹中的ui/Front_end.ui路径中,并且exe位于上面的"ui"文件夹之外,因此给定的c++代码片段失败。

以下是BUILD文件片段

cc_binary(
name = "UI_exe",
srcs = ["bin/main.cpp"],
data = ["ui/Front_end.ui"],
)

以下是目录结构。

文件夹目录

更新

要将数据文件复制到与二进制文件相同的目录,可以使用genrule:

genrule(
name = "copy",
srcs = ["ui/Front_end.ui"],
outs = ["Front_end.ui"],
output_to_bindir = 1,
cmd = "cp $< $@",
)

由于只有一个srcs和一个outs条目,因此可以分别使用$<$@

(否则,您将不得不使用$(location ...)表达式。Bazel将这些表达式替换为文件的实际路径,无论该路径在构建时是什么。)


您需要使用C++运行文件库。文档在源文件中。

一旦初始化了std::unique_ptr<Runfiles> runfiles,就可以查找文件的运行时路径,如下所示:

std::string path = runfiles->Rlocation("my_workspace/my_package_path/ui/Front_end.ui");

您必须将my_workspace替换为工作区的名称,将my_package_path替换为二进制文件的包路径。

工作区名称

例如,如果WORKSPACE文件包含workspace(name = "foo"),则my_workspace应该是foo。如果WORKSPACE文件中没有这样的规则,则使用默认的工作区名称:__main__

程序包路径

这是BUILD文件的工作区根相对路径,您在该文件中定义了cc_binary,例如示例中的"app/BILD"。所以my_package_path应该只是app