如何在BUILD.bazel文件中获取当前日期用于编译定义
解决方法
要实现每次bazel build时自动获取当前日期并传入local_defines,可以通过volatile repository rule实现,它会在每次构建时重新执行命令获取最新日期,避免缓存影响。
步骤1:定义日期仓库规则
在项目的WORKSPACE文件(或单独的.bzl文件中再导入)添加以下代码:
load("@bazel_skylib//lib:shell.bzl", "shell") def _current_date_repo_impl(ctx): # 执行shell命令获取dd-mm-yyyy格式的当前日期 date_result = ctx.execute(["date", "+%d-%m-%Y"]) if date_result.return_code != 0: fail(f"获取日期失败: {date_result.stderr}") current_date = date_result.stdout.strip() # 生成导出日期变量的bzl文件 ctx.file("date.bzl", content = f"""CURRENT_DATE = "{shell.quote(current_date)}" """) ctx.file("BUILD.bazel", content = 'exports_files(["date.bzl"])') current_date_repository = repository_rule( implementation = _current_date_repo_impl, local = True, volatile = True, # 强制每次构建重新执行,不缓存结果 )
步骤2:调用仓库规则
在WORKSPACE中调用定义好的规则,创建日期仓库:
current_date_repository(name = "current_date")
步骤3:在BUILD文件中使用日期变量
在你的CPP库的BUILD文件里,加载日期变量并传入local_defines:
load("@current_date//:date.bzl", "CURRENT_DATE") cc_library( name = "your_cc_lib", srcs = ["your_source.cc"], # 其他配置项... local_defines = [f"xyz={CURRENT_DATE}"], )
这样每次执行bazel build时,Bazel都会重新获取当前日期,自动更新xyz宏的值。
替代方案:通过头文件定义宏
如果你更倾向于通过头文件注入日期宏(而非local_defines),可以用genrule实现:
genrule( name = "gen_date_header", outs = ["date_macros.h"], cmd = 'echo "#define xyz \\"$$(date +%d-%m-%Y)\\"" > $@', ) cc_library( name = "your_cc_lib", srcs = ["your_source.cc"], hdrs = [":gen_date_header"], includes = ["."], # 确保编译器能找到生成的头文件 )
然后在CPP代码中直接包含#include "date_macros.h"即可使用xyz宏。
内容的提问来源于stack exchange,提问作者richa agrawal
相关产品推荐
相关产品推荐

