You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:40:54