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

CMake构建阶段从文件读取变量:为第三方脚本传递随机种子

解决方案

要实现在构建阶段读取种子并传递给gen_source.py,同时避免重复生成种子,可以通过构建阶段生成并读取种子文件的方式实现,无需修改第三方脚本,也能简化配置阶段逻辑:

核心思路

  1. 用一个本地文件(如seed.txt)存储随机种子,第一次构建时生成,后续构建直接读取
  2. 将种子文件作为自定义命令的依赖,确保只有种子变化或脚本更新时才重新生成目标文件
  3. 所有种子生成、读取操作都放在构建阶段的shell命令中完成

实现代码

# 定义种子存储文件的路径,放在构建目录下避免污染源码
set(SEED_FILE "${CMAKE_CURRENT_BINARY_DIR}/seed.txt")

add_custom_command(
  OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/my_header.h"
  # 构建阶段检查种子文件:不存在则生成16字节随机十六进制种子并写入文件
  COMMAND bash -c "if [ ! -f '${SEED_FILE}' ]; then hexdump -v -e '1/1 \"%02X\"' -n 16 /dev/urandom > '${SEED_FILE}'; fi"
  # 读取种子文件内容并传递给第三方脚本
  COMMAND bash -c "SEED=\$(cat '${SEED_FILE}'); python3 '${CMAKE_CURRENT_SOURCE_DIR}/gen_source.py' \"\${SEED}\""
  # 依赖脚本文件和种子文件,确保触发条件正确
  DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/gen_source.py" "${SEED_FILE}"
  VERBATIM  # 确保CMake正确转义特殊字符
)

关键说明

  • 避免重复生成种子:只有当seed.txt不存在时才会重新生成,后续构建直接复用已有种子
  • 按需重新生成目标文件:当gen_source.py脚本更新,或者seed.txt被删除/修改时,CMake会自动重新执行自定义命令生成my_header.h
  • 简化配置阶段:无需在配置阶段执行execute_process生成种子,所有逻辑延迟到构建阶段完成

内容的提问来源于stack exchange,提问作者jozols

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:35:16