如何在Bazel中避免cc_binary目标重复定义,实现32/64位版本命名?
解决方案:使用Bazel宏封装重复的cc_binary定义
你可以通过定义Bazel宏来封装重复的cc_binary配置,只需要编写一次模板代码,就能生成两个不同名称的目标,同时解决pdb文件匹配的问题。
步骤1:定义宏
在BUILD文件中添加一个宏函数,将重复的cc_binary参数封装进去:
def myapp_cc_binary(name, **kwargs): cc_binary( name = name, srcs = MYAPP_SRCS, copts = MYAPP_COPTS, deps = MYAPP_DEPS, **kwargs # 允许传入额外参数,应对32/64位的差异化配置 )
步骤2:调用宏生成目标
直接调用宏生成32位和64位的目标即可,无需重复编写完整的cc_binary配置:
myapp_cc_binary(name = "myapp32") myapp_cc_binary(name = "myapp64")
扩展:处理32/64位的差异化配置
如果32位和64位需要不同的编译选项(比如-m32/-m64),可以在宏中添加参数支持:
def myapp_cc_binary(name, extra_copts = [], **kwargs): cc_binary( name = name, srcs = MYAPP_SRCS, copts = MYAPP_COPTS + extra_copts, deps = MYAPP_DEPS, **kwargs ) # 针对不同架构传入额外编译选项 myapp_cc_binary(name = "myapp32", extra_copts = ["-m32"]) myapp_cc_binary(name = "myapp64", extra_copts = ["-m64"])
为什么这个方案可行?
- 宏会在BUILD文件加载时展开为两个独立的
cc_binary目标,每个目标生成的二进制文件和pdb文件(如myapp32.pdb、myapp64.pdb)名称完全匹配,调试器可以正常识别,交付时放在同一目录也不会冲突。 - 彻底避免了代码重复,后续修改配置只需要更新宏的定义即可,无需修改两个目标。
内容的提问来源于stack exchange,提问作者Calmarius
相关产品推荐
相关产品推荐

