bazel - 如何从 bazel 中的 cc_library 指定输出工件?

标签 bazel

我想将“foo.c”构建为一个库,然后在生成的 .so 而不是“.a”上执行“readelf”,我如何在 bazel 中编写它?

以下 BUILD.bazel 文件不起作用:

cc_library(
    name = "foo",
    srcs = ["foo.c"],
)

genrule(
    name = "readelf_foo",
    srcs = ["libfoo.so"],
    outs = ["readelf_foo.txt"],
    cmd = "readelf -a $(SRCS) > $@",
)

错误是“缺少输入文件‘//:libfoo.so’”。

将 genrule 的 srcs 属性更改为“:foo”会将“.a”和“.so”文件都传递给 readelf,这不是我需要的。

有什么方法可以指定传递给 genrule 的“:foo”的输出吗?

最佳答案

cc_library 产生多个输出,它们由输出组分隔。如果只想获得 .so 输出,可以将 filegroupdynamic_library 输出组一起使用。

所以,这应该可行:

cc_library(
    name = "foo",
    srcs = ["foo.c"],
)


filegroup(
    name='libfoo',
    srcs=[':foo'],
    output_group = 'dynamic_library'
)

genrule(
    name = "readelf_foo",
    srcs = [":libfoo"],
    outs = ["readelf_foo.txt"],
    cmd = "readelf -a $(SRCS) > $@",
)

关于bazel - 如何从 bazel 中的 cc_library 指定输出工件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59454576/

相关文章:

c++ - 如何在 Bazel 构建命令期间传递标志,例如 -DVERBOSE?

windows - 构建规则中的 Bazel 环境变量

rust - 在 Bazel 中编译 Rocket

java - 为什么我通过 Bazel 构建的应用程序在添加 Firebase 依赖项后一打开就会崩溃?

c++ - 从源代码构建 gRPC C++

Bazel 一次构建多个目标

bazel - 如何 `bazel build`所有使用特定规则的目标?

c# - 使用 Bazel 将二进制文件编译为多个版本的 .NET Framework

bazel -//(双正斜杠)和 : (colon) in bazel build//my_folder/my_subfolder:node_modules? 的含义是什么

c++ - Bazel:如何将标题放入一个包含路径