[英]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.