Перемещение файлов в Базеле - PullRequest
0 голосов
/ 26 февраля 2019

Я использую bazel (версия 0.22) в Ubuntu 18.04 для создания кода на C ++.

main.cpp имеет API для чтения файла пользовательского интерфейса, который читает файл пользовательского интерфейса.

API выглядит следующим образом

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

Я могу построить код.Но поскольку файл "Front_end.ui" всегда находится в пути ui / Front_end.ui в папке bin, а exe находится за пределами папки "ui", указанной выше, фрагменты кода c ++ не выполняются.

Ниже приведен фрагмент файла BUILD

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

Ниже приводится структура каталогов.

Каталог папок

1 Ответ

0 голосов
/ 27 февраля 2019

Обновление

Чтобы скопировать файл данных в тот же каталог, что и двоичный файл, вы можете использовать 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__.

Путь к пакету

Это относительный путь к рабочему пространству к файлу BUILDгде вы определили cc_binary, например, "app / BUILD" в вашем примере.Так что my_package_path должно быть просто app.

...