如何在Bazel中忽略assimp子模块内指定的BUILD.bazel文件?
解决assimp工具目录BUILD.bazel触发Bazel构建错误的方案
核心原因
.bazelignore仅对主仓库生效,local_repository会将assimp目录视为独立的Bazel仓库,因此无法通过主仓库的.bazelignore屏蔽其内部的BUILD文件。以下是几种可行的解决方法:
方法1:自定义BUILD文件覆盖assimp自带规则
这是最直接的方案,通过local_repository指定自定义BUILD文件,完全绕过assimp自带的BUILD.bazel:
- 在项目的
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"], )
- 修改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
相关产品推荐
相关产品推荐

