独立CMake脚本,用于通过分隔符切断文件内容

4xrmg8kj  于 2023-02-04  发布在  其他
关注(0)|答案(2)|浏览(142)

我有一个项目,其中一个可重复的任务涉及到操作文件的内容。直到现在,我使用Python脚本来完成它,但最近我发现可以使用独立的CMake脚本(这里的“独立”意味着它们可以在configure/build/test等工作流之外调用)由于我的项目已经使用CMake进行项目管理,我得出结论,我可以保存其他人安装Python解释器的麻烦(欢迎Windows用户!)并在项目范围内使用CMake。
我的部分脚本需要读取一个文件,并将“[START-HERE]”行之前和“[END-HERE]”行之后出现的所有内容都剪掉,我被那部分卡住了,不知道怎么实现,怎么才能做到呢?

2w3kk1z5

2w3kk1z51#

您可以将file(READ)if(MATCHES)组合使用来accompile此文件。前者用于读取文件,后者用于检查是否出现正则表达式并提取捕获组:

    • foo. cmake**
#[===[
Params:
INPUT_FILE : the path to the file to read
#]===]

file(READ "${INPUT_FILE}" FILE_CONTENTS)

if (FILE_CONTENTS MATCHES "(^|[\r\n])\\[START-HERE\\][\r\n]+(.*)[\r\n]+\\[END-HERE\\]")
    # todo: use extracted match stored in CMAKE_MATCH_2 for your own logic
    message("Content: '${CMAKE_MATCH_2}'")
else()
    message(FATAL_ERROR "[START-HERE]...[END-HERE] doesn't occur in the input file '${INPUT_FILE}'")
endif()
    • 文件格式**
Definetly not
[START-HERE]
working
[END-HERE]
Try again!

输出:

> cmake -D INPUT_FILE=foo.txt -P foo.cmake
Content: 'working'
lzfw57am

lzfw57am2#

对于您遇到的问题,下面是使用stringfilemath命令的一种方法:

file(READ data.txt file_str)
string(FIND "${file_str}" "[START-HERE]" start_offset)
# message("${start_offset}")
math(EXPR start_offset "${start_offset}+12")
# message("${start_offset}")
string(FIND "${file_str}" "[END-HERE]" end_offset)
math(EXPR substr_len "${end_offset}-${start_offset}")
# message("${substr_len}")
string(SUBSTRING "${file_str}" "${start_offset}" "${substr_len}" trimmed_str)
# message("${trimmed_str}")

您也可以使用file(STRINGS)命令来完成此操作,该命令将文件的行读入数组,然后使用list(FIND)命令。如果分隔符不在自己的行上,则上述方法具有工作优势。
their answer post中的@fabian所示,您也可以使用if(MATCHES)的正则表达式来完成此操作,如下所示:

file(READ "${INPUT_FILE}" FILE_CONTENTS)

if (FILE_CONTENTS MATCHES "(^|[\r\n])\\[START-HERE\\][\r\n]+(.*)[\r\n]+\\[END-HERE\\]")
    # todo: use extracted match stored in CMAKE_MATCH_2 for your own logic
    message("Content: '${CMAKE_MATCH_2}'")
else()
    message(FATAL_ERROR "[START-HERE]...[END-HERE] doesn't occur in the input file '${INPUT_FILE}'")
endif()

相关问题