为C++测试构建库时如何添加特定copt宏定义?
解决办法
方法1:创建测试专用的库变体
直接定义一个仅用于测试的cc_library目标,给它加上需要的宏定义,让测试用例依赖这个变体,主库保持原有配置即可。这种方式简单直接,完全隔离主代码和测试代码的编译参数。
示例代码:
# 主库,无额外宏定义 cc_library( name = "my_lib", srcs = ["my_lib.cc"], hdrs = ["my_lib.h"], ) # 测试专用库变体,添加所需宏 cc_library( name = "my_lib_test", srcs = ["my_lib.cc"], hdrs = ["my_lib.h"], copts = ["-DMY_TEST_MACRO"], testonly = True, # 标记为仅测试可用,避免被主代码误依赖 ) # 测试用例依赖测试变体 cc_test( name = "my_lib_test_case", srcs = ["my_lib_test.cc"], deps = [":my_lib_test"], )
方法2:用config_setting+select动态注入宏
通过配置条件判断当前是否处于测试编译环境,动态给主库添加宏定义,不需要额外维护库变体。
首先定义测试环境的配置标识:
config_setting( name = "is_test", values = {"test": "true"}, )
然后在主库的copts中通过select动态添加宏:
cc_library( name = "my_lib", srcs = ["my_lib.cc"], hdrs = ["my_lib.h"], copts = select({ ":is_test": ["-DMY_TEST_MACRO"], "//conditions:default": [], }), ) cc_test( name = "my_lib_test_case", srcs = ["my_lib_test.cc"], deps = [":my_lib"], )
Bazel会自动识别测试编译场景,给主库加上指定宏。注意这种方式会让所有测试环境下的该库都带上宏,如果不同测试需要不同宏,这种方法灵活性不足。
方法3:自定义测试规则(进阶场景)
如果需要完全无缝的注入(不修改原有库和测试结构),可以封装一个自定义规则,在内部修改测试的编译上下文添加宏。
自定义规则示例:
def _my_cc_test_impl(ctx): # 获取原始cc_test的编译信息 test_cc_info = ctx.attr.test[CcInfo] # 给编译上下文追加宏定义 modified_compilation_ctx = test_cc_info.compilation_context.add_copts(["-DMY_TEST_MACRO"]) # 返回修改后的编译信息和可执行文件 return [ CcInfo(compilation_context = modified_compilation_ctx), DefaultInfo(executable = ctx.attr.test[DefaultInfo].executable), ] my_cc_test = rule( implementation = _my_cc_test_impl, attrs = { "test": attr.label(providers = [CcInfo, DefaultInfo]), }, test = True, )
使用时只需把原cc_test设为私有,再用自定义规则包装:
cc_test( name = "_my_lib_test_case", srcs = ["my_lib_test.cc"], deps = [":my_lib"], visibility = ["//visibility:private"], ) my_cc_test( name = "my_lib_test_case", test = ":_my_lib_test_case", )
内容的提问来源于stack exchange,提问作者itsSwey
相关产品推荐
相关产品推荐

