C++ grep字符串,并将其复制到CMake中的目录中

C++ grep字符串,并将其复制到CMake中的目录中,c++,cmake,C++,Cmake,在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”可以是一些随机字符串 我需要先提取一些文件\u name

在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”可以是一些随机字符串

我需要先提取
一些文件\u name1.txt、一些文件\u name2.txt和一些文件\u name3.txt
,通过将路径前缀
xx/yy/
添加到每个提取的字符串中,为它们中的每一个形成一个正确的路径,然后将每个文件复制到目录
mydir/


我知道如何在bash脚本中实现这一点,但不知道如何在CMake中实现这一点,特别是,我需要在构建后目标的ADD_CUSTOM_命令中实现这一点


谢谢

您可以拥有一个通过自定义命令调用的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_命令()调用ProcessFile.cmake脚本,为其提供输入文件和输出目录的位置

您可以拥有一个通过自定义命令调用的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_命令()调用ProcessFile.cmake脚本,为其提供输入文件和输出目录的位置

“我需要在生成后目标的ADD_CUSTOM_命令中执行此操作”-使用
ADD_CUSTOM_命令
意味着您需要一个执行此任务的命令行。命令行可能涉及bash脚本、CMake脚本(它是从
CMakeLists.txt
中单独创建的)或仅使用带有适当参数的
grep
/
sed
/
awk
的组合。因此,第一个任务是创建一个执行所需任务的命令行或脚本。@Tsyvarev我想以CMake方式执行此任务的原因是为了支持多个平台。显然,bash脚本不容易移植。“我需要在构建后目标的ADD_CUSTOM_命令中完成”——使用
ADD_CUSTOM_命令
意味着您需要一个执行任务的命令行。命令行可能涉及bash脚本、CMake脚本(它是从
CMakeLists.txt
中单独创建的)或仅使用带有适当参数的
grep
/
sed
/
awk
的组合。因此,第一个任务是创建一个执行所需任务的命令行或脚本。@Tsyvarev我想以CMake方式执行此任务的原因是为了支持多个平台。显然,bash脚本不容易移植。