簡體   English   中英

構建cc_library時如何在bazel中移動文件?

[英]how do I move files in bazel when building a cc_library?

從bazel中的源代碼構建項目時,頭文件並不總是以正確的相對路徑結尾。

例如,我想從源代碼構建外國人
其他軟件將使用的主要標頭是<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,或者之后是否可以移動標題。 我不想更改項目的實際內容(因為我可能沒有托管它,或者我希望鏡像保持一致)。 我不確定如何編寫規則來執行此操作。

我通過使用單獨的規則分別移動每個文件來解決此問題。

首先,我對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為的DEP的目標名稱cc_library ,但也許有圍繞一個辦法,以確保行動在它們的依賴方面指定正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM