如何将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的本地依赖:
- 用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
- 在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"], ) """, )
- 项目中依赖
@sdbus_cpp_prebuilt//:sdbus_cpp
内容的提问来源于stack exchange,提问作者Mateusz Krajewski
相关产品推荐
相关产品推荐

