簡體   English   中英

在Bazel中移動文件

[英]Moving files in Bazel

我在ubuntu 18.04上使用bazel(0.22版本)來構建C ++代碼。

main.cpp具有讀取ui文件的api。

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"],
)

以下是目錄結構。

資料夾目錄

更新資料

要將數據文件與二進制文件復制到相同的目錄,可以使用genrule:

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

由於只有一個srcs和一個outs條目,因此可以分別使用$<$@

(否則,您將不得不使用$(location ...)表達式。Bazel會用文件的實際路徑替換這些表達式,無論構建時路徑可能是什么。)


您需要使用C ++ runfiles庫 文檔在源文件中。

一旦初始化了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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM