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

如何在Bazel中忽略assimp子模块内指定的BUILD.bazel文件?

解决assimp工具目录BUILD.bazel触发Bazel构建错误的方案

核心原因

.bazelignore仅对主仓库生效,local_repository会将assimp目录视为独立的Bazel仓库,因此无法通过主仓库的.bazelignore屏蔽其内部的BUILD文件。以下是几种可行的解决方法:


方法1:自定义BUILD文件覆盖assimp自带规则

这是最直接的方案,通过local_repository指定自定义BUILD文件,完全绕过assimp自带的BUILD.bazel:

  1. 在项目的third_party目录下创建assimp.BUILD文件,写入rules_foreign_cc的cmake构建规则:
load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake")

cmake(
    name = "assimp",
    srcs = glob(["**/*"], exclude = ["tools/BUILD.bazel"]),
    lib_source = True,
    out_lib_dir = "lib",
    out_bin_dir = "bin",
    cmake_options = [
        "-DBUILD_SHARED_LIBS=OFF",
        "-DASSIMP_BUILD_ASSIMP_TOOLS=OFF",  # 直接禁用工具构建
        "-DASSIMP_BUILD_TESTS=OFF",
        "-DASSIMP_BUILD_ZLIB=ON",  # 根据你的依赖需求调整
    ],
)

cc_library(
    name = "assimp_lib",
    srcs = [":assimp"],
    hdrs = glob(["include/**/*.h"]),
    includes = ["include"],
    visibility = ["//visibility:public"],
)
  1. 修改WORKSPACE中的local_repository配置,添加build_file参数指向自定义文件:
local_repository(
    name = "assimp",
    path = "./third_party/assimp",
    build_file = "//third_party:assimp.BUILD",
    repo_mapping = {
        "@zlib": "@zlib",  # 如果assimp依赖zlib,需对应你的仓库映射
    },
)

方法2:在local_repository中直接删除冲突的BUILD文件

通过repo_ctx在仓库初始化时删除assimp/tools目录下的BUILD.bazel:

修改WORKSPACE中的local_repository配置:

local_repository(
    name = "assimp",
    path = "./third_party/assimp",
    repo_mapping = { ... },
    # 初始化时删除tools目录的BUILD.bazel
    build_file_content = """
        load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake")

        # 执行删除命令
        repository_ctx.execute(["rm", "-rf", repository_ctx.path("tools/BUILD.bazel")])

        cmake(
            name = "assimp",
            srcs = glob(["**/*"]),
            cmake_options = [
                "-DASSIMP_BUILD_ASSIMP_TOOLS=OFF",
                # 其他配置参数
            ],
            # 其他cmake规则配置
        )

        cc_library(
            name = "assimp_lib",
            srcs = [":assimp"],
            hdrs = glob(["include/**/*.h"]),
            includes = ["include"],
            visibility = ["//visibility:public"],
        )
    """,
)

方法3:使用new_local_repository替代local_repository

new_local_repository不会自动识别目标目录中的BUILD文件,必须手动指定构建规则,天然避免冲突:

在WORKSPACE中替换为:

new_local_repository(
    name = "assimp",
    path = "./third_party/assimp",
    build_file = "//third_party:assimp.BUILD",
)

然后使用方法1中创建的assimp.BUILD文件即可。


额外优化

无论使用哪种方法,都建议在cmake选项中添加-DASSIMP_BUILD_ASSIMP_TOOLS=OFF,从源头上禁用assimp工具的构建,减少不必要的编译开销。

内容的提问来源于stack exchange,提问作者Jark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:42:41