在bazel BUILD
文件中,有一行:
srcs = glob([<pattern1>, <pattern2>, ...])
我试图将自己的模式之一设为"../dir/*.cc"
,但是我收到一个错误消息,不允许在这里使用..
序列。
检查documentation后,我发现不允许这样做,但是我不确定预期的替代品是什么。
类似地,禁止使用上级引用(..)和当前目录引用(./)。
给定当前文件结构,如何在我的srcs
列表中包括这些其他源文件?如果我无法引用上一级目录,是否可以使用其他目录的软件包名称代替?
答案 0 :(得分:1)
从BUILD
文件中“向上”移动将违反程序包边界。如果您确实需要该结构并且不能或不想更改它,则必须通过声明相应的目标或至少导出文件并使它们可见来使一个包中的文件可用于另一包。例如,假设具有以下结构:
.
├── BUILD
├── WORKSPACE
├── hello.c
└── tgt
└── BUILD
我可以说//
(顶级)软件包BUILD
:
filegroup(
name = "hello",
srcs = ["hello.c"],
visibility = ["//tgt:__pkg__"],
)
(也可以是:exports_files(["hello.c"], ["//tgt:__pkg__"])
,在这种情况下,我将使用//:hello.c
中名称为tgt
的文件。)
然后在//tgt
(tgt/BUILD
)内可以读取:
cc_binary(
name="tgt",
srcs=["//:hello"],
)
哪个会给我的?
$ bazel run //tgt
WARNING: /tmp/bzl1/tgt/BUILD:3:10: in srcs attribute of cc_binary rule //tgt:tgt: please do not import '//:hello.c' directly. You should either move the file to this package or depend on an appropriate rule there
INFO: Analyzed target //tgt:tgt (11 packages loaded, 68 targets configured).
INFO: Found 1 target...
Target //tgt:tgt up-to-date:
bazel-bin/tgt/tgt
INFO: Elapsed time: 0.247s, Critical Path: 0.09s
INFO: 2 processes: 2 linux-sandbox.
INFO: Build completed successfully, 6 total actions
INFO: Build completed successfully, 6 total actions
Hello World!
注意:bazel仍将其标记为奇怪且值得注意的事情。我必须说我不同意。树形结构似乎与内容不太吻合。
在此示例中,tgt
包边界可能是人为的,实际上没有用吗?或hello.c
放在错误的位置。