如何让Bazel将Python脚本构建的OpenUSD适配为cc_library可用
在Bazel中构建OpenUSD并转为cc_library可用形式
我正在Bazel项目里构建OpenUSD,官方仓库提供的build.py脚本能自动处理所有依赖并生成CMake项目。目前我通过genrule把构建产物打包成了包含约75000个文件的usd.zip,但genrule要求显式指定所有输出文件,现在需要把这些产物转换成cc_library规则能用的形式。
现有genrule代码如下:
genrule( name = "openusd_genrule", srcs = [ "@openusd//:all_srcs", ], outs = [ "usd.zip" ], tags = [ "requires-network", ], local = True, cmd = "&&".join([ "$(execpath @openusd//:build_usd) temp_usd", "zip -r $@ temp_usd" ]), tools = [ "@openusd//:build_usd", ], )
解决办法
要让OpenUSD的构建产物适配cc_library,核心是不用手动枚举数千个文件,同时让Bazel识别出头文件和库文件,具体步骤如下:
1. 用genrule直接输出构建目录,再用filegroup捕获产物
先修改genrule,直接输出解压后的构建目录而非zip包,然后通过filegroup用通配符匹配所有头文件和库文件:
genrule( name = "openusd_build", srcs = [ "@openusd//:all_srcs", ], outs = [ "temp_usd", # 声明输出目录 ], tags = [ "requires-network", ], local = True, cmd = "$(execpath @openusd//:build_usd) $(@D)/temp_usd", tools = [ "@openusd//:build_usd", ], ) filegroup( name = "openusd_headers", srcs = glob([ "temp_usd/include/**/*.h", "temp_usd/include/**/*.hpp", ]), visibility = ["//visibility:public"], ) filegroup( name = "openusd_libraries", srcs = glob([ "temp_usd/lib/**/*.a", "temp_usd/lib/**/*.so", # Linux平台 "temp_usd/lib/**/*.dylib", # macOS平台 "temp_usd/lib/**/*.lib", # Windows平台 ]), visibility = ["//visibility:public"], )
2. 封装成cc_library规则
基于上面的filegroup,创建cc_library规则,指定头文件路径和要链接的库:
cc_library( name = "openusd", hdrs = [":openusd_headers"], srcs = [":openusd_libraries"], includes = [ "temp_usd/include", ], linkstatic = True, # 如果构建的是静态库,启用这个选项 visibility = ["//visibility:public"], )
注意事项
- 用
glob通配符匹配所有头文件和库文件,省去手动枚举75000个文件的麻烦 includes字段会告诉Bazel头文件的搜索路径,这样代码里写#include <pxr/...>就能正确找到头文件linkstatic根据实际构建的库类型选择,OpenUSD默认一般是构建静态库,所以设为True- 如果构建的是动态库,调整
srcs里的匹配规则,按需设置linkshared参数
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

