巴泽尔 |如何复制资源到构建目录?

Bazel | How to copy resources to build directory?

我正在制作一些 openGL 项目,并且只想将我的目录之一复制到构建目录(我将我的纹理存储在那里)。

基本上我的项目结构是这样的:

|-WORKSPACE
|-/src/
|  -BUILD
|  -main.cpp
|  -*some folders here*
|-/resources/
|  -BUILD
|  -*some folders here*

我只想在目录之间保持相同的关系

这是我试过的:

# src/BUILD file - I use it to build the whole program

cc_binary(
    name = "OpenGL_Project",
    srcs = ["main.cpp"],
    deps = ["//src/renderer:renderer", "//src/scene", "//src/input", "//src/gui"],
    data = ["//resources:resources"]
)

genrule(
    name = "copy_resources",
    srcs = ["//resources"],
    outs = ["resources"],
    cmd = "cp -r $(SRCS) $(OUTS)"
)

# resources/BUILD file

filegroup(
    name = "resources",
    srcs = glob(["shaders/**","textures/**"]),
    visibility = ["//visibility:public"],
)

我在构建过程中没有遇到任何错误,我尝试使用

清理它

bazel clean --expunge

并再次构建 - 但它似乎没有用。 重要的是要补充一点,在构建目录中根本没有资源文件夹,并不是它在错误的地方。

你们有什么想法吗?

虽然 copy_resources 目标不是必需的,但您的内容看起来是正确的。 data//resources:resources 的依赖足以让这些文件存在于 //src:OpenGL_Project.

的 运行files 目录中

文件应存在于 bazel-bin/src/OpenGL_Project.runfiles 下。当您 bazel run //src:OpenGL_Project 时,文件 resources/shaders/...resources/textures/... 相对于当前目录和相对于 RUNFILES_DIR 环境变量应该是可访问的。

您还可以使用 C++ 运行files 库 here 在更多情况下定位 运行 文件,例如,如果您 运行 直接使用 ./bazel-bin/src/OpenGL_Project 它还将尝试在 argv[0] + ".runfiles".

中查找 运行 文件

bzlws_copy 完成这项工作。参见 here

添加到您的 WORKSPACE 文件:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")

http_archive(
    name = "bzlws",
    strip_prefix = "bzlws-f929e5380f441f50a77776d34a7df8cacdbdf986",
    url = "https://github.com/zaucy/bzlws/archive/f929e5380f441f50a77776d34a7df8cacdbdf986.zip",
    sha256 = "5bebb821b158b11d81dd25cf031b5b26bae97dbb02025df7d0e41a262b3a030b",
)

添加到您的 BUILD 文件:

bzlws_copy(
    name = "copy_resources",
    out = "resources/{FILENAME}",
    force = True,
    tags = ["manual"],
    srcs = [
        "//resources",
    ],
)