【问题标题】:grep strings from a text file and copy them to a directory in CMakegrep 文本文件中的字符串并将它们复制到 CMake 中的目录
【发布时间】:2019-07-10 15:04:51
【问题描述】:

在 CMake 2.8.12 中,如何从文本文件中 grep 字符串(每个字符串代表一个文件名)并将其复制到目录中?

例如,我有一个文本文件 xx/yy/a.txt,其中包含:

xx xx xx abc="some_file_name1.txt" xx xx xx
xx xx xx abc="some_file_name2.txt" xx xx xx
xx xx xx abc="some_file_name3.txt" xx xx xx

其中 'xx' 可能是一些随机字符串。

我需要先提取some_file_name1.txt, some_file_name2.txt and some_file_name3.txt,通过将路径前缀xx/yy/附加到每个提取的字符串来为它们中的每一个形成正确的路径,然后将每个文件复制到目录mydir/

我知道如何在 bash 脚本中执行此操作,但不知道如何在 CMake 中执行此操作,特别是,我需要在 ADD_CUSTOM_COMMAND 中为后期构建目标执行此操作。

谢谢!

【问题讨论】:

  • “我需要在 ADD_CUSTOM_COMMAND 中为后期构建目标执行此操作” - 使用 add_custom_command 意味着您需要一个执行任务的命令行。命令行可能涉及 bash 脚本、CMake 脚本(与 CMakeLists.txt 分开创建)或仅使用 grep/sed/awk 与适当参数的组合。所以第一个任务是创建一个命令行或脚本来执行所需的任务。
  • @Tsyvarev 我想以 CMake 方式做的原因是支持多个平台。显然,bash 脚本不易移植。

标签: c++ cmake


【解决方案1】:

您可以拥有一个通过自定义命令调用的 CMake 脚本。像这样的:

# ProcessFile.cmake
file(READ "${ProcessFile_INPUT_PATH}" ProcessFile_CONTENT)
# Replace newlines with semicolon so that it is treated as a list by CMake
# Will need to escape existing semicolons beforehand if file contains any.
string(REPLACE "\n" ";" ProcessFile_LINES "${ProcessFile_CONTENT}")
foreach(_line ${ProcessFile_LINES})
  string(REGEX REPLACE "^.+abc=\"(.+)\".+$" "xx/yy/\\1" _file_path "${_line}")
  file(COPY "${_file_path}" DESTINATION "${ProcessFile_OUTPUT_DIR}")
endforeach()

# CMakeLists.txt
add_custom_command(OUTPUT "output-file"
  COMMAND "${CMAKE_ROOT}" -DProcessFile_INPUT_PATH="xx/yy/a.txt" -DProcessFile_OUTPUT_DIR="mydir" -P ProcessFile.cmake)

我没有测试脚本,但这是要点:

  • ProcessFile.cmake 解析文件,迭代每行提取文件名并复制文件。
  • CMakeLists.txt 中的 add_custom_command() 调用 ProcessFile.cmake 脚本,为其提供输入文件的位置和输出目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多