CMake复制文件时替换字符串:将job.sh的占位符替换为项目名
解决方案
你可以通过以下两种常用方式实现复制文件+替换内容的需求,第一种configure_file是CMake为这类场景原生设计的命令,更推荐使用:
方案1:使用configure_file(推荐)
- 先修改项目根目录下的
job.sh,将待替换标记$(REPLACEME)改成CMake默认识别的@PROJECT_NAME@格式(用@包裹可以避免和shell本身的${}格式变量冲突),修改后内容如下:
#!/bin/bash #SBATCH --job-name=@PROJECT_NAME@ #SBATCH --tasks=4 #SBATCH --computers=1 run ./myApp
- 在
CMakeLists.txt中添加如下配置:
# 第一个参数为源文件路径,第二个参数为build目录下的输出路径 # @ONLY参数表示仅替换@VAR@格式的标记,不会改动shell脚本中原有${}格式的内容 configure_file(${PROJECT_SOURCE_DIR}/job.sh ${PROJECT_BINARY_DIR}/job.sh @ONLY)
CMake执行时会自动将@PROJECT_NAME@替换为你通过project()命令指定的项目名称,同时完成文件复制。
方案2:无需修改原job.sh的实现
如果你不想改动原始job.sh的内容,保留$(REPLACEME)标记,可以通过「读取文件-字符串替换-写入目标路径」的流程实现:
在CMakeLists.txt中添加如下配置:
# 读取原始job.sh内容存入变量 file(READ ${PROJECT_SOURCE_DIR}/job.sh JOB_SH_CONTENT) # 替换目标标记为项目名称 string(REPLACE "$(REPLACEME)" "${PROJECT_NAME}" JOB_SH_CONTENT "${JOB_SH_CONTENT}") # 将替换后的内容写入build目录 file(WRITE ${PROJECT_BINARY_DIR}/job.sh "${JOB_SH_CONTENT}") # 可选:给生成的脚本添加执行权限 file(CHMOD ${PROJECT_BINARY_DIR}/job.sh PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
内容的提问来源于stack exchange,提问作者Hojzerice
相关产品推荐
相关产品推荐

