在Bazel中移动文件

时间:2019-02-26 10:20:01

标签: c++ ubuntu bazel

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

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

Api如下图

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

我能够构建代码。但是由于“ Front_end.ui”文件始终位于bin文件夹的ui / Front_end.ui路径中,而exe在给定的c ++代码段上方的“ ui”文件夹之外。

以下是BUILD文件片段

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

以下是目录结构。

Folder directory

1 个答案:

答案 0 :(得分:1)

更新

要将数据文件复制到与二进制文件相同的目录中,可以使用一种规则:

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

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

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


您需要使用C++ runfiles library。源文件中有文档。

初始化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__

打包路径

这是您在其中定义cc_binary的BUILD文件的工作区根相对路径,例如在您的示例中为“ app / BUILD”。因此my_package_path应该只是app