我有以下目录结构:
my_dir
|
--> src
| |
| --> foo.cc
| --> BUILD
|
--> WORKSPACE
|
--> bazel-out/ (symlink)
|
| ...
src/BUILD
包含以下代码:
cc_binary(
name = "foo",
srcs = ["foo.cc"]
)
文件foo.cc
使用bar.txt
实用程序的常规方式创建名为<fstream>
的文件。
但是,当我使用bazel run //src:foo
调用Bazel时,文件bar.txt
已创建并放置在bazel-out/darwin-fastbuild/bin/src/foo.runfiles/foo/bar.txt
而不是my_dir/src/bar.txt
,原始来源位于outs
。
我尝试在foo
规则中添加outs
字段,但Bazel抱怨cc_binary
不是filegroup
的公认属性。
我还想过创建一个deps
规则,但是没有foo
字段,我可以将cc_binary
声明为这些文件的依赖项。
如何确保通过运行my_dir/src/bar.txt
规则生成的文件放在bazel-out/...
而不是do
?
答案 0 :(得分:4)
Bazel不允许您按设计修改工作空间的状态。
简短的回答是,您不希望过去构建的结果修改工作区的状态,因此可能会修改未来构建的结果。如果在同一工作区上多次运行Bazel会导致不同的输出,则会违反再现性。
举个例子:想象一下调用插入
的bazel run //src:foo
#define true false
#define false true
位于src/foo.cc
的顶部。如果再次致电bazel run //src:foo
会怎样?
以下是有关输出目录的更多信息:https://docs.bazel.build/versions/master/output_directories.html#documentation-of-the-current-bazel-output-directory-layout
答案 1 :(得分:0)
可能存在使用genrule的解决方法。下面是我使用genrule将文件复制到.git文件夹的示例。
genrule(
name = "precommit",
srcs = glob(["git/**"]),
outs = ["precommit.txt"],
# folder contain this BUILD.bazel file is tool which will be symbol linked, we use cd -P to get to the physical path
cmd = "echo 'setup pre-commit.sh' > $(OUTS) && cd -P tools && ./path/to/your-script.sh",
local = 1, # required
)
答案 2 :(得分:0)
如果在运行时传递输出文件的名称,则可以简单地使用绝对路径。为了使此操作更容易,如果您使用的是Linux,则可以使用realpath
实用程序。如果您使用的是Mac,则它将包含在brew install coreutils
中。然后运行它就像:
bazel run my_app_dir:binary_target -- --output_file=`realpath relative/path/to.output