【问题标题】:how do I move files in bazel when building a cc_library?构建 cc_library 时如何在 bazel 中移动文件?
【发布时间】:2019-12-19 06:56:46
【问题描述】:

在 bazel 中从源代码构建项目时,头文件并不总是以正确的相对路径结束。

例如,我想从源代码构建expat
其他软件将使用的主要标头是<expat.h>
但是,该项目在expat/lib/expat.h 中有源代码。

我可以通过以下方式成功构建项目:

cc_library(
    name = "expat",
    srcs = [
        "lib/xmlparse.c",
        "lib/xmlrole.c",
        "lib/xmltok.c",
    ],
    hdrs = [
        "expat_config.h",
        "lib/ascii.h",
        "lib/asciitab.h",
        "lib/expat.h",
        "lib/expat_external.h",
        "lib/iasciitab.h",
        "lib/internal.h",
        "lib/latin1tab.h",
        "lib/nametab.h",
        "lib/siphash.h",
        "lib/utf8tab.h",
        "lib/xmlrole.h",
        "lib/xmltok.h",
        "lib/xmltok_impl.c",
        "lib/xmltok_impl.h",
        "lib/xmltok_ns.c",
    ],
    includes = [
        ".",
        "lib",
    ],
    visibility = ["//visibility:public"],
)

但现在其他尝试与@expat//:expat 链接的项目将无法找到<expat.h>。正确的包含需要是<expat/lib/expat.h>,这在其他软件中是不可行的。

按原样构建项目的最佳方式是什么,但仍要确保头文件位于其他使用它们的项目的正确位置?我想知道在调用cc_library 之前是否需要先在云雀中以某种方式执行cp,或者我是否可以在之后移动标题。我不想更改项目的实际内容(因为我可能没有托管它或者我希望镜像保持一致)。我不确定如何编写规则来执行此操作。

【问题讨论】:

    标签: c build dependencies bazel


    【解决方案1】:

    我通过单独的规则单独移动每个文件来解决这个问题。

    首先,我对mv做了一个规则:

    def mv_file(name, file_from, file_to):
    
        native.genrule(
            name = name,
            srcs = [file_from],
            outs = [file_to],
            output_to_bindir = 1,
            cmd = "mv $< $@",
        )
    

    然后在依赖的BUILD文件中我使用它如下:

    mv_file("xmlparse_c","expat/lib/xmlparse.c","xmlparse.c")
    mv_file("xmlrole_c","expat/lib/xmlrole.c","xmlrole.c")
    mv_file("xmltok_c","expat/lib/xmltok.c","xmltok.c")
    mv_file("ascii_h","expat/lib/ascii.h","ascii.h")
    mv_file("asciitab_h","expat/lib/asciitab.h","asciitab.h")
    mv_file("expat_h","expat/lib/expat.h","expat.h")
    mv_file("expat_external_h","expat/lib/expat_external.h","expat_external.h")
    mv_file("iasciitab_h","expat/lib/iasciitab.h","iasciitab.h")
    mv_file("internal_h","expat/lib/internal.h","internal.h")
    mv_file("latin1tab_h","expat/lib/latin1tab.h","latin1tab.h")
    mv_file("nametab_h","expat/lib/nametab.h","nametab.h")
    mv_file("siphash_h","expat/lib/siphash.h","siphash.h")
    mv_file("utf8tab_h","expat/lib/utf8tab.h","utf8tab.h")
    mv_file("xmlrole_h","expat/lib/xmlrole.h","xmlrole.h")
    mv_file("xmltok_h","expat/lib/xmltok.h","xmltok.h")
    mv_file("xmltok_impl_c","expat/lib/xmltok_impl.c","xmltok_impl.c")
    mv_file("xmltok_impl_h","expat/lib/xmltok_impl.h","xmltok_impl.h")
    mv_file("xmltok_ns_c","expat/lib/xmltok_ns.c","xmltok_ns.c")
    
    cc_library(
        name = "expat",
        srcs = [
            "xmlparse.c",
            "xmlrole.c",
            "xmltok.c",
        ],
        hdrs = [
            "expat/expat_config.h",
            "ascii.h",
            "asciitab.h",
            "expat.h",
            "expat_external.h",
            "iasciitab.h",
            "internal.h",
            "latin1tab.h",
            "nametab.h",
            "siphash.h",
            "utf8tab.h",
            "xmlrole.h",
            "xmltok.h",
            "xmltok_impl.c",
            "xmltok_impl.h",
            "xmltok_ns.c",
        ],
        includes = [
            ".",
        ],
        deps = [
        ],
        visibility = ["//visibility:public"],
    )
    

    令人困惑的是,我不需要在 expat 的 cc_library 中指定移动的目标名称。我不确定 bazel 如何知道在构建 expat 目标之前首先运行所有 mv_file 目标,但它似乎有效。而且我无法将mv_file 目标名称设置为cc_library 的deps,但也许有一种方法可以确保根据它们的依赖关系正确指定操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多