CMake拷贝多级目录下的文件
1.背景
C++应用需要测试一批视频文件,视频文件目录如下
—video
——a
———a_1.mp4
———a_2.mp4
——b
———b_1.mp4
———b_2.mp4
——
——x
———x_1.mp4
———x_2.mp4
2.解决方案
CMakeLists通过add_custom_command自定义命令,在构建过程中添加一些定制化的操作。例如复制文件、执行脚本、进行文件处理等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 拷贝视频文件
file(GLOB_RECURSE VIDEO_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "video/*/*.mp4")
# 创建目标路径
set(TARGET_VIDEO_DIR ${CMAKE_CURRENT_BINARY_DIR}/video)
file(MAKE_DIRECTORY ${TARGET_VIDEO_DIR})
# 复制视频文件到构建目录
foreach(VIDEO_FILE ${VIDEO_FILES})
add_custom_command(
OUTPUT ${TARGET_VIDEO_DIR}/${VIDEO_FILE}
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/${VIDEO_FILE} ${TARGET_VIDEO_DIR}/${VIDEO_FILE}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${VIDEO_FILE}
COMMENT "Copying video file ${VIDEO_FILE}"
)
endforeach()
# 声明一个自定义目标,将视频文件添加到依赖中
add_custom_target(copy_videos DEPENDS ${TARGET_VIDEO_DIR}/${VIDEO_FILES})
# 将 copy_videos 目标添加到构建目标的依赖中
add_dependencies(${PROJECT_NAME} copy_videos)
|
3.关于自定义命令
一般情况下,add_custom_command通常与add_custom_target结合使用,用来创建自定义的构建规则。
1
2
3
4
5
6
|
add_custom_command(
OUTPUT output_file
COMMAND command1
COMMAND command2
DEPENDS input_file
)
|
- 参数
- OUTPUT 指定了这个自定义命令的输出文件
- COMMAND 指定了要执行的命令或脚本
- DEPENDS 指定了这个自定义命令所依赖的输入文件
4.示例
构建时复制一个文件并生成一个输出文件,你可以使用add_custom_command和add_custom_target来实现这个功能。
1
2
3
4
5
6
7
|
add_custom_command(
OUTPUT file.txt
COMMAND ${CMAKE_COMMAND} -E copy file.txt file.txt
DEPENDS file.txt
)
add_custom_target(${PROJECT_NAME} DEPENDS file.txt)
|
文章作者
梵梵爸
上次更新
2024-01-24
许可协议
原创文章,如需转载请注明文章作者和出处。谢谢