You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将CMake构建的sdbus-cpp库接入Bazel项目?

将CMake构建的sdbus-cpp接入Bazel项目的三种可行方案

方案1:使用rules_foreign_cc直接复用CMake配置

这是最省心的方案,Bazel官方维护的rules_foreign_cc专门用于处理非Bazel构建的依赖,直接调用原项目的CMake流程完成编译。

步骤1:在WORKSPACE中引入依赖

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

# 引入rules_foreign_cc
http_archive(
    name = "rules_foreign_cc",
    sha256 = "a1d4f74a4c5f7f6d138423e199525f867f0a297a17a7f4a4b9f3e8e3b8e4999c",
    url = "https://github.com/bazelbuild/rules_foreign_cc/releases/download/0.9.0/rules_foreign_cc-0.9.0.tar.gz",
)

load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies")
rules_foreign_cc_dependencies()

# 引入sdbus-cpp源码
git_repository(
    name = "sdbus_cpp",
    remote = "https://github.com/Kistler-Group/sdbus-cpp",
    commit = "d4a2b3c",  # 替换为你需要的版本commit哈希
)

# 定义系统DBus依赖
new_local_repository(
    name = "system_dbus",
    path = "/usr",
    build_file_content = """
cc_library(
    name = "dbus",
    srcs = [],
    hdrs = glob(["include/dbus-1.0/**/*.h"]),
    includes = ["include/dbus-1.0", "lib/x86_64-linux-gnu/include/dbus-1.0"],
    linkopts = ["-ldbus-1"],
    visibility = ["//visibility:public"],
)
""",
)

步骤2:编写BUILD规则构建sdbus-cpp

在项目根目录或sdbus_cpp子目录下创建BUILD文件:

load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake_external")

cmake_external(
    name = "sdbus_cpp_lib",
    source = "@sdbus_cpp//:all",
    # 传递CMake配置参数,关闭示例和测试,指定静态/动态库构建
    cmake_options = [
        "-DBUILD_SHARED_LIBS=OFF",
        "-DCMAKE_INSTALL_PREFIX=.",
        "-DSDBUSCPP_BUILD_EXAMPLES=OFF",
        "-DSDBUSCPP_BUILD_TESTS=OFF",
    ],
    # 指定输出的头文件和库路径
    out_include_dir = "include",
    static_libraries = ["lib/libsdbus-c++.a"],
    deps = ["@system_dbus//:dbus"],
    visibility = ["//visibility:public"],
)

步骤3:在你的项目中依赖该库

在自己的BUILD目标中添加:

cc_binary(
    name = "my_app",
    srcs = ["main.cpp"],
    deps = ["@sdbus_cpp//:sdbus_cpp_lib"],
)

方案2:手动编写Bazel BUILD规则

如果不想引入额外规则,可以直接将sdbus-cpp的CMake配置转译为Bazel规则,需要仔细对应原CMakeLists.txt的所有配置项。

在sdbus-cpp源码目录下创建BUILD文件

cc_library(
    name = "sdbus_cpp",
    # 对应CMake中的源文件列表
    srcs = glob([
        "src/*.cpp",
        "src/connection/*.cpp",
        "src/interface/*.cpp",
        "src/message/*.cpp",
        "src/types/*.cpp",
    ]),
    # 暴露头文件
    hdrs = glob(["include/**/*.hpp", "include/**/*.h"]),
    includes = ["include"],
    # 对应CMake中的编译宏和标准
    copts = [
        "-std=c++17",
        "-DSDBUSCPP_STATIC_BUILD",
        "-Wall",
        "-Wextra",
    ],
    # 依赖系统DBus
    deps = ["@system_dbus//:dbus"],
    visibility = ["//visibility:public"],
)

在WORKSPACE中引入sdbus-cpp

git_repository(
    name = "sdbus_cpp",
    remote = "https://github.com/Kistler-Group/sdbus-cpp",
    commit = "d4a2b3c",
)

# 同方案1的system_dbus定义

之后直接在项目中依赖@sdbus_cpp//:sdbus_cpp即可。

方案3:预编译sdbus-cpp后作为本地依赖

如果上述方案都有问题,可以先手动用CMake编译sdbus-cpp,再将编译产物作为Bazel的本地依赖:

  1. 用CMake编译sdbus-cpp:
git clone https://github.com/Kistler-Group/sdbus-cpp.git
cd sdbus-cpp && mkdir build && cd build
cmake .. -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=../install
make install
  1. 在WORKSPACE中定义本地仓库:
new_local_repository(
    name = "sdbus_cpp_prebuilt",
    path = "/path/to/sdbus-cpp/install",
    build_file_content = """
cc_library(
    name = "sdbus_cpp",
    srcs = ["lib/libsdbus-c++.a"],
    hdrs = glob(["include/**/*.hpp"]),
    includes = ["include"],
    deps = ["@system_dbus//:dbus"],
    visibility = ["//visibility:public"],
)
""",
)
  1. 项目中依赖@sdbus_cpp_prebuilt//:sdbus_cpp

内容的提问来源于stack exchange,提问作者Mateusz Krajewski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:32:41