CMake构建阶段从文件读取变量:为第三方脚本传递随机种子
解决方案
要实现在构建阶段读取种子并传递给gen_source.py,同时避免重复生成种子,可以通过构建阶段生成并读取种子文件的方式实现,无需修改第三方脚本,也能简化配置阶段逻辑:
核心思路
- 用一个本地文件(如
seed.txt)存储随机种子,第一次构建时生成,后续构建直接读取 - 将种子文件作为自定义命令的依赖,确保只有种子变化或脚本更新时才重新生成目标文件
- 所有种子生成、读取操作都放在构建阶段的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
相关产品推荐
相关产品推荐

