跳到主要内容

kmpkg_replace_string

替换文件中的指定字符串(支持普通字符串匹配或正则表达式匹配)。

用法

kmpkg_replace_string(<filename> <match> <replace> [REGEX] [IGNORE_UNCHANGED])

参数说明

<filename>

待修改文件的路径(支持绝对路径或相对路径,相对路径基于当前 CMake 工作目录)。

<match>

需要匹配的字符串:

  • 未指定 REGEX 时:按字面量匹配字符串;
  • 指定 REGEX 时:按 CMake 正则表达式语法匹配内容。

<replace>

用于替换匹配内容的字符串:

  • 普通替换时:直接替换为该字符串字面量;
  • 正则替换时:可使用 \1\2 等引用正则表达式中的捕获组(注意 CMake 中需转义为 \\1\\2)。

[REGEX]

可选参数。若指定该参数,<match> 会被视为CMake 风格的正则表达式(而非普通字符串),实现更灵活的匹配替换。

[IGNORE_UNCHANGED]

可选参数。默认情况下,若文件内容未因替换操作发生变化,函数会输出警告;指定该参数后,会禁用此警告。

示例

示例 1:普通字符串替换

替换文件中所有的 old_valuenew_value,未修改时不告警:

# 替换 ${SOURCE_PATH}/config.h 中的 "VERSION 1.0" 为 "VERSION 2.0"
kmpkg_replace_string(
"${SOURCE_PATH}/config.h"
"VERSION 1.0"
"VERSION 2.0"
IGNORE_UNCHANGED
)

示例 2:正则表达式替换

替换文件中所有以 DEBUG_ 开头的宏定义值为 0

# 正则匹配 "DEBUG_任意字符=1",替换为 "DEBUG_\\1=0"(\\1 引用捕获组)
kmpkg_replace_string(
"${SOURCE_PATH}/debug.h"
"(DEBUG_\\w+)=1"
"\\1=0"
REGEX
)

注意事项

  1. 正则语法遵循 CMake 正则表达式规则
  2. 替换操作会直接修改原文件,建议在替换前备份重要文件;
  3. 若文件编码为非 UTF-8(如 GBK),需确保 CMake 能正确识别文件内容(可先通过 file(READ) 验证)。

源码

scripts/cmake/kmpkg_replace_string.cmake