簡體   English   中英

Bazel Package:如何將構建工件導出到具有外部依賴關系的另一個目錄?

[英]Bazel Package: How to export build artifacts to another directory with external dependency?

我是巴澤爾的新手。 我有一個用 Bazel 構建的項目。 它還使用了一些第三方庫,這些庫也是從 bazel 構建的(來自源代碼)。

我現在正在嘗試將我的項目作為獨立庫導出給其他人。 我可以將我的項目編譯為 so 並將相關的 hpp 文件復制到目錄中。

但我不知道如何處理第三方庫。 有沒有一種奇特的方法可以做到這一點? 或者我可以參考的任何例子?

我的目標是:

  1. 將項目編譯為 so 文件。 復制到特定目錄。 (完畢)
  2. 復制所有具有樹結構的 header 文件。 (完畢)。
  3. 將所有外部庫也復制到特定目錄中(需要幫助)
  4. 將外部庫的 header 文件復制到相同的 header 目錄中(需要幫助)

output:

  • 包括/

    • my_library_name/
    • 第三方名稱1/
    • 第三方名稱2/
  • 圖書館/

    • libmy_library.so
    • libthird_party_name1.so
    • libthird_party_name2.so

如果您對第三方庫的BUILD文件有控制權,您可以單獨暴露header文件,然后使用pkg_tar規則收集主項目中的目標文件。

例如,假設一個文件夾結構如下:

.
|-- project
|   |-- BUILD
|   |-- mylib
|   |   |-- BUILD
|   |   |-- mylib.cpp
|   |   `-- mylib.h
|   `-- WORKSPACE
`-- thirdparty
    |-- lib1
    |   |-- BUILD
    |   |-- lib1.cpp
    |   `-- lib1.h
    |-- lib2
    |   |-- BUILD
    |   |-- lib2.cpp
    |   `-- lib2.h
    `-- WORKSPACE

您的第三方庫 BUILD 文件可能會公開filegroupcc_library

# thirdparty/lib1/BUILD

filegroup(
    name = "headers",
    srcs = ["lib1.h"],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "lib1",
    hdrs = [":headers"],
    srcs=["lib1.cpp"],
    visibility = ["//visibility:public"],
)

相同的模式將適用於thirdparty/lib2/BUILDproject/mylib/BUILD

現在在主項目中,您可以有一個主要的BUILD腳本,它將所有文件收集到一個tar存檔中:

# project/BUILD

load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")

pkg_tar(
    name = "release_headers",
    srcs = [
        "//mylib:headers",
        "@thirdparty//lib1:headers",
        "@thirdparty//lib2:headers",
    ],
    package_dir = "include",
)

pkg_tar(
    name = "release_libs",
    srcs = [
        "//mylib",
        "@thirdparty//lib1",
        "@thirdparty//lib2",
    ],
    package_dir = "lib",
)

pkg_tar(
    name = "release",
    deps = [
        ":release_headers",
        ":release_libs",
    ],
)

Building :release應該創建一個具有所需結構的tar文件:

$> bazel build :release
...
Target //:release up-to-date:
  bazel-bin/release.tar
...
$> tar -tf bazel-bin/release.tar
./
./include/
./include/mylib.h
./include/lib1.h
./include/lib2.h
./lib/
./lib/libmylib.a
./lib/libmylib.so
./lib/liblib1.a
./lib/liblib1.so
./lib/liblib2.a
./lib/liblib2.so

您還可以在第三方工作區中為第三方庫設置pkg_tar規則,以實現更好的模塊化。

暫無
暫無

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

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