如何为自定义Bazel工具链全局禁用PIC编译?
在Bazel工具链级别全局禁用PIC编译
你在cc_toolchain中添加features = ["-pic"]无效的原因是:cc_toolchain的features参数仅用于声明工具链支持的特性集合,而非设置默认启用/禁用的特性。要在工具链级别全局禁用PIC,需要修改cc_toolchain_config的配置,以下是具体实现方法:
方法1:通过工具链默认特性禁用PIC
在cc_toolchain_config中,使用default_features参数直接默认禁用pic特性,所有使用该工具链的目标都会自动继承这个设置:
load("@rules_cc//cc:defs.bzl", "cc_toolchain") load("@bazel_tools//tools/cpp:unix_cc_toolchain_config.bzl", "cc_toolchain_config") cc_toolchain_config( name = "config-gba", # 保留你已有的其他配置... default_features = ["-pic"], # 默认禁用PIC特性 ) cc_toolchain( name = "cc-compiler-gba", toolchain_config = ":config-gba", # 保留你已有的其他配置... )
方法2:精细控制特性启用状态
如果需要更精细地管理工具链特性,可以在cc_toolchain_config的features参数中显式设置pic特性默认禁用:
cc_toolchain_config( name = "config-gba", # 保留你已有的其他配置... features = [ # 保留你已有的其他特性配置... {"name": "pic", "enabled": False}, # 显式设置PIC默认禁用 ], )
补充:强制覆盖编译器Flags
部分工具链可能会默认注入-fPIC类的编译Flag,此时需要在工具链配置中显式添加禁用Flag来覆盖:
cc_toolchain_config( name = "config-gba", # 保留你已有的其他配置... compiler_flags = [ # 保留你已有的编译Flags... "-fno-PIC", # 强制禁用PIC(根据目标平台可能需要调整为-fno-pic) ], cxx_flags = [ # 保留你已有的C++编译Flags... "-fno-PIC", ], )
验证配置
完成上述修改后,重新构建项目时,所有使用该自定义工具链的目标都会默认禁用PIC编译,无需再通过命令行--features=-pic或目标级features = ["-pic"]来单独设置。
内容的提问来源于stack exchange,提问作者Dietrich Epp
相关产品推荐
相关产品推荐

