如何通过Bazel的bzlmod集成无BUILD文件的GitHub外部依赖(仅需引入头文件与预编译.a文件)
如何通过Bazel的bzlmod集成无BUILD文件的GitHub外部依赖(仅需引入头文件与预编译.a文件)
我刚好之前也碰到过一模一样的需求——用bzlmod的时候不想折腾编译依赖,只想直接用现成的预编译.a库和头文件,还不想手动给依赖目录塞一堆BUILD文件,给你分享两个亲测好用的方案:
方案一:用http_archive内嵌BUILD规则(推荐,最省心)
如果你的依赖有打包好的预编译包(比如GitHub Release里的tar.gz/zip,里面直接包含include头文件目录和lib下的.a文件),直接在MODULE.bazel里配置http_archive,通过build_file_content直接内嵌所需的BUILD规则,完全不用碰依赖的文件结构:
具体配置示例
http_archive( name = "my_prebuilt_dep", # 替换成你依赖的预编译包下载地址 urls = ["https://github.com/example/my-dep/releases/download/v1.0.0/prebuilt-mydep-linux-x86_64.tar.gz"], # 替换成预编译包的sha256校验和(可以用bazel fetch --checksum=sha256 命令生成) sha256 = "abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890", # 直接在这里写好需要的BUILD规则,bazel会自动用这个生成依赖的BUILD文件 build_file_content = """ cc_library( name = "mydep", # 对应预编译包里.a文件的路径 srcs = ["lib/libmydep.a"], # 匹配所有头文件,根据实际目录结构调整glob规则 hdrs = glob(["include/**/*.h"]), # 让bazel自动识别头文件的根目录,这样你的代码里直接#include <xxx.h>就行 includes = ["include"], # 开放可见性,让你自己的项目能引用这个库 visibility = ["//visibility:public"], ) """, )
怎么用?
在你自己的cc_binary或者cc_library里直接依赖这个target就行:
cc_binary( name = "my_app", srcs = ["main.cpp"], deps = ["@my_prebuilt_dep//:mydep"], )
方案二:针对源码库+单独预编译.a的场景
如果你的依赖是GitHub源码库,但预编译的.a是单独发布的(比如在Release里),可以用两个http_archive分别拉取头文件(从源码库)和预编译.a,然后合并成一个cc_library:
配置示例
# 拉取源码库的头文件部分 git_repository( name = "mydep_headers", remote = "https://github.com/example/my-dep.git", tag = "v1.0.0", build_file_content = """ filegroup( name = "headers", srcs = glob(["include/**/*.h"]), visibility = ["//visibility:public"], ) """, ) # 拉取预编译的.a库 http_archive( name = "mydep_prebuilt_lib", urls = ["https://github.com/example/my-dep/releases/download/v1.0.0/libmydep.a"], sha256 = "这里填.a文件的sha256", build_file_content = """ filegroup( name = "prebuilt_lib", srcs = ["libmydep.a"], visibility = ["//visibility:public"], ) """, ) # 合并成一个可依赖的cc_library local_repository( name = "mydep", path = ".", build_file_content = """ cc_library( name = "mydep", srcs = ["@mydep_prebuilt_lib//:prebuilt_lib"], hdrs = ["@mydep_headers//:headers"], includes = ["@mydep_headers//include"], visibility = ["//visibility:public"], ) """, )
关键注意事项
- 一定要填对
sha256校验和:可以用bazel fetch --checksum=sha256 <archive-url>命令自动生成,避免下载文件损坏或者被篡改 - 调整
glob和路径:要和你下载的包/源码库的目录结构完全对应,比如如果头文件在include/mydep下,includes要改成include/mydep,这样代码里可以直接#include <mydep/xxx.h> - 可见性设置:
visibility = ["//visibility:public"]是必须的,不然你自己的项目没法引用这个外部依赖
内容来源于stack exchange
相关产品推荐
相关产品推荐

