【问题标题】:How to specify output artifact from a cc_library in bazel?如何从 bazel 中的 cc_library 指定输出工件?
【发布时间】:2019-12-23 11:29:14
【问题描述】:

我想将“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,这不是我需要的。

有没有办法指定 ":foo" 的哪个输出传递给 genrule?

【问题讨论】:

    标签: bazel


    【解决方案1】:

    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) > $@",
    )
    

    【讨论】:

    • 谢谢,比我定义过滤函数并将其目标用作 genrule 的 src 的替代解决方案要好得多。把它放在这里以防有人会发现它有用。 python def _filter_so_impl(ctx): return DefaultInfo(files=depset([f for f in ctx.files.srcs if f.basename.endswith(".so")])) filter_so = rule( implementation = _filter_so_impl, attrs = { "srcs": attr.label_list(allow_files=True, mandatory=True), }, )
    猜你喜欢
    • 2019-12-19
    • 2020-10-08
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多