Bazel Package如何导出构建产物及第三方外部依赖到指定目录
Bazel导出包含第三方依赖的交付包实现方案
Bazel原生支持导出构建产物和关联依赖资源,你可以通过以下两种方案实现需求,优先推荐第一种原生规则方案,维护成本更低。
方案1:使用pkg_files + pkg_tar规则打包输出
你需要先加载Bazel官方的rules_pkg模块,在WORKSPACE中完成依赖引入后,在顶层BUILD文件中定义如下规则:
第一步:定义头文件导出规则
load("@rules_pkg//pkg:pkg.bzl", "pkg_files", "pkg_tar") # 收集第三方库1的头文件,指定导出到include/third_party_name1路径下 pkg_files( name = "third_party1_headers", srcs = ["@third_party_name1//:public_headers"], # 替换为第三方库实际公开头文件的target名 prefix = "include/third_party_name1", ) # 收集第三方库2的头文件 pkg_files( name = "third_party2_headers", srcs = ["@third_party_name2//:public_headers"], prefix = "include/third_party_name2", ) # 收集你自己项目的头文件 pkg_files( name = "my_lib_headers", srcs = glob(["include/**/*.hpp"]), # 替换为你自己的头文件路径 prefix = "include/my_library_name", )
第二步:定义库文件导出规则
# 收集所有.so动态库文件 pkg_files( name = "all_libs", srcs = [ ":libmy_library.so", # 你自己的动态库target "@third_party_name1//:libthird_party_name1.so", # 第三方库1的动态库target "@third_party_name2//:libthird_party_name2.so", # 第三方库2的动态库target ], prefix = "library", )
第三步:合并生成最终交付包
pkg_tar( name = "my_lib_release", srcs = [ ":my_lib_headers", ":third_party1_headers", ":third_party2_headers", ":all_libs", ], extension = "tar.gz", )
执行bazel build //:my_lib_release后,解压生成的tar包就会完全符合你要求的目录结构。
方案2:自定义genrule实现拷贝
如果不想引入额外的rules_pkg依赖,也可以直接用原生genrule实现拷贝逻辑:
genrule( name = "export_release", srcs = [ # 头文件列表 "@third_party_name1//:public_headers", "@third_party_name2//:public_headers", "//include:all_headers", # 动态库列表 ":libmy_library.so", "@third_party_name1//:libthird_party_name1.so", "@third_party_name2//:libthird_party_name2.so", ], outs = ["release_pkg.tar.gz"], cmd = """ # 创建目标目录结构 mkdir -p include/my_library_name include/third_party_name1 include/third_party_name2 library # 拷贝头文件 cp $(locations //include:all_headers) include/my_library_name/ cp $(locations @third_party_name1//:public_headers) include/third_party_name1/ cp $(locations @third_party_name2//:public_headers) include/third_party_name2/ # 拷贝动态库 cp $(locations :libmy_library.so) library/ cp $(locations @third_party_name1//:libthird_party_name1.so) library/ cp $(locations @third_party_name2//:libthird_party_name2.so) library/ # 打包生成最终产物 tar czf $@ include/ library/ """, )
执行bazel build //:export_release即可得到符合要求的交付压缩包。
注意事项
- 如果第三方依赖的头文件本身带有嵌套目录层级,拷贝时需要保留相对路径,避免下游使用者出现头文件引用错误
- 确保所有第三方库的so都编译为动态库,如果第三方库默认输出静态库,需要修改对应BUILD配置,将
cc_library的linkshared参数设为1
内容的提问来源于stack exchange,提问作者ReneSun
相关产品推荐
相关产品推荐

