巴泽尔 |如何复制资源到构建目录?
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",
],
)
我正在制作一些 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
.
文件应存在于 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",
],
)