You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:05:16