【问题标题】:Build Bazel package from multiple repos从多个 repos 构建 Bazel 包
【发布时间】:2021-08-19 07:14:29
【问题描述】:

我正在尝试使用外部模块构建 OpenCV,但无法提出一个干净的解决方案。

我已经使用 CMake (rules_foreign_cc) 成功构建了 OpenCV。但是为了能够使用外部模块进行构建,我需要下载一个单独的 repo (opencv_contrib),然后使用第二个 repo 的路径作为构建参数进行构建。

有没有一种方法可以做到这一点,而不必创建自己的 git 存储库来组合这两个 git 存储库?

【问题讨论】:

    标签: opencv bazel bazel-rules


    【解决方案1】:
    # WORKSPACE file
    
    http_archive(
       name = "rules_foreign_cc",
       strip_prefix = "rules_foreign_cc-4010620160e0df4d894b61496d3d3b6fc8323212",
        sha256 = "07e3414cc841b1f4d16e5231eb818e5c5e03e2045827f5306a55709e5045c7fd",
       url = "https://github.com/bazelbuild/rules_foreign_cc/archive/4010620160e0df4d894b61496d3d3b6fc8323212.zip",
    )
    
    load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies")
    rules_foreign_cc_dependencies()
    
    
    http_archive(
        name = "opencv_contrib",
        build_file="//:opencv_contrib.BUILD",
        sha256 = "9f52fd3114ac464cb4c9a2a6a485c729a223afb57b9c24848484e55cef0b5c2a",
        urls = ["https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.2.tar.gz"],
        strip_prefix = "opencv_contrib-4.5.2",
    )
    
    http_archive(
        name = "opencv",
        sha256="ae258ed50aa039279c3d36afdea5c6ecf762515836b27871a8957c610d0424f8",
        build_file="//:opencv.BUILD",
        urls = ["https://github.com/opencv/opencv/archive/refs/tags/4.5.2.tar.gz"],
        strip_prefix = "opencv-4.5.2",
    )
    
    
    # opencv_contrib.BUILD file
    
    filegroup(
        name = "modules",
        srcs = glob(["modules/**"]),
        visibility = ["//visibility:public"],
    )
    
    # opencv.BUILD file
    
    load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake")
    
    filegroup(
        name = "srcs",
        srcs = glob(["**"]),
        visibility = ["//visibility:public"],
    )
    cmake(
        name = "opencv",
        generate_args = ["-GNinja"],
        additional_inputs=["@opencv_contrib//:modules"],
        cache_entries = {
            "BUILD_SHARED_LIBS": "OFF",
            "BUILD_opencv_world": "ON",
            "OPENCV_EXTRA_MODULES_PATH": "$$EXT_BUILD_ROOT$$/external/opencv_contrib/modules",
        },
        lib_source = ":srcs",
        out_static_libs = ["libopencv_world.a"],
    )
    

    【讨论】:

    • 你在什么环境下运行它?当我在 Ubuntu 18.04 上使用 Bazel 4.0 时,我收到此错误“OpenCV 需要从 'opencv_contrib' 启用 'cudev' 模块”。感谢您的回复!
    • 这里的关键是OPENCV_EXTRA_MODULES_PATH,要明确。 opencv 有关于该 cmake 变量的文档。
    • 嗨@Slay,当我这样做时,opencv 的头文件最终位于 bazel-out/k8-dastbuild/bin/external/... 我怎样才能让 cmake 将头文件放入外部的/ ?谢谢...
    • 为什么要把它们放在那里?通常它没有任何意义,在bazel的情况下更是如此。
    【解决方案2】:

    您可以在WORKSPACE 文件中使用git_repository 规则让bazel 在构建之前自动克隆一个git repo。

    将其添加到WORKSPACE 文件后,您就可以在自己的仓库中引用远程仓库的构建目标。

    查看this repo 以获取示例。

    【讨论】:

    • 我知道 git_repository 规则。我的问题不是克隆存储库,而是指定另一个存储库的路径。例如,要构建第一个 repo,我需要传入一个构建标志,如“-DEXTRA_MODULES=../opencv_contrib”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多