Bazel新手求助:如何用pkg_tar打包头文件与共享库发布自定义库
Bazel新手求助:如何用pkg_tar打包头文件与共享库发布自定义库
嘿,刚接触Bazel就想着打包发布自己的库,这点必须给你点个赞!我来一步步帮你把这个打包流程捋顺,解决你卡壳的地方~
首先得先把基础配置补对:你每个feature目录里的BUILD文件得用cc_library规则,不然根目录的目标没法正确依赖它们。比如feature1/BUILD应该写成这样:
cc_library( name = "feature1", srcs = ["feature1.cpp"], hdrs = ["feature1.hpp"], visibility = ["//visibility:public"], # 确保根目录的BUILD能引用这个库 )
feature2和feature3的BUILD照这个格式改,替换对应的文件名就行。
接下来处理头文件的打包:你根目录里的filegroup需要用glob匹配所有子目录的头文件,这样后续新增子目录也不用手动改规则。补全后的代码如下:
filegroup( name = "headers", srcs = glob([ "feature1/*.hpp", "feature2/*.hpp", "feature3/*.hpp", # 以后加新子目录的话,直接加类似行,或者用**/*.hpp匹配所有子目录的.hpp文件 ]), # 小提示:如果想让头文件在include目录下保留feature1/feature2的层级结构,就不用加strip_prefix; # 如果想把所有.hpp直接放到include根目录,就加上strip_prefix = "." )
然后补全你写了一半的头文件tar包规则:
pkg_tar( name = "headers_pkg", srcs = [":headers"], package_dir = "include", )
接下来处理共享库的打包:你已经用linkshared = True生成了共享库,现在要把它放到tar包的lib目录里,新增一个pkg_tar规则:
pkg_tar( name = "lib_pkg", srcs = [":feature"], package_dir = "lib", preserve_symlinks = True, # 保留Bazel生成的符号链接(比如libfeature.so指向实际的版本化so文件) )
最后把两个tar包合并成一个最终的tar.gz,这样用户拿到手就是标准的lib/+include/结构:
pkg_tar( name = "library_package", srcs = [":headers_pkg", ":lib_pkg"], extension = "tar.gz", )
现在只要运行这条命令就能生成你要的包了:
bazel build //:library_package
生成的library_package.tar.gz会放在bazel-bin/目录下,解压后就能直接用啦~
备注:内容来源于stack exchange,提问作者Darren Sun
相关产品推荐
相关产品推荐

