如何将文件写入当前目录而不是bazel-out

时间:2017-12-12 01:54:13

标签: c++ file-io output rules bazel

我有以下目录结构:

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

3 个答案:

答案 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/rule-challenges.html#assumption-aim-for-correctness-throughput-ease-of-use-latency

以下是有关输出目录的更多信息: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