如何在Bazel的cc_library中为每个源文件设置不同预处理器定义?
为单个源文件设置专属预处理器定义的Bazel最优方案
针对每个源文件需要独立预处理器定义的场景,比逐个创建私有cc_library更高效的方案是使用**cc_object规则**:
cc_object是Bazel专门用于编译单个源文件为目标文件的轻量规则,每个cc_object可以单独指定copts(包含专属的预处理器定义),最后将所有cc_object合并到主cc_library中。这种方式避免了创建多个小型库的额外开销,直接生成目标文件后合并,构建效率更高。
示例配置如下:
# 为每个源文件创建独立的cc_object,指定专属预编译定义 cc_object( name = "file1_obj", srcs = ["file1.cpp"], copts = ["-DVALUE=file1.cpp"], ) cc_object( name = "file2_obj", srcs = ["file2.cpp"], copts = ["-DVALUE=file2.cpp"], ) cc_object( name = "file3_obj", srcs = ["file3.cpp"], copts = ["-DVALUE=file3.cpp"], ) # 合并所有目标文件为最终库 cc_library( name = "my_target_lib", srcs = [":file1_obj", ":file2_obj", ":file3_obj"], )
如果你的Bazel版本不支持cc_object(注:cc_object在Bazel 5.0+版本可用),可以退而求其次使用私有微型cc_library,同时通过宏简化重复代码:
def per_file_cc_library(name, src, defines): native.cc_library( name = name, srcs = [src], copts = defines, visibility = ["//visibility:private"], ) # 批量生成私有库 per_file_cc_library("file1_lib", "file1.cpp", ["-DVALUE=file1.cpp"]) per_file_cc_library("file2_lib", "file2.cpp", ["-DVALUE=file2.cpp"]) per_file_cc_library("file3_lib", "file3.cpp", ["-DVALUE=file3.cpp"]) # 合并私有库 cc_library( name = "my_target_lib", deps = [":file1_lib", ":file2_lib", ":file3_lib"], )
使用宏可以大幅减少重复代码,同时保持构建逻辑清晰,相比手动逐个编写私有库更高效。
内容的提问来源于stack exchange,提问作者Tareq A. Siraj
相关产品推荐
相关产品推荐

