在 CMAKE 和 CLION 中每次构建后如何 运行 复制脚本?

How to run a copy script after every build in CMAKE and CLION?

我正在尝试在构建项目后复制文件目录,每次 构建项目时。

在我项目的 CMakeLists.txt 文件中,我有以下内容:

# Copy resources
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/assets DESTINATION ${PROJECT_BUILD_DIR}/)

这在第一次构建项目时有效,并且在我在 CMAKE 生成 makefile 的目录中调用 make 时它有效。

但是,在我的 IDE (CLion) 中,我认为有某种缓存/检查项目是否已经构建。

因此,如果我只更改资产文件,而不更改底层代码,则文件永远不会复制到二进制文件的位置。

有没有办法强制post-构建脚本在次构建被调用后执行?

或者,换句话说,有没有办法强制 CMakeLists.txt 文件在我每次 构建我的项目时都是

这是 CLion 特有的,但更普遍地涉及 cmake。

我正在使用 CMAKE 3.9.1

谢谢

File(COPY file path) 在配置时执行,CMake 流程的三个主要阶段之一 Configure -> build -> install

如果你想在构建后执行一个命令,有两种方法可以做到。

第一个(可能更好)

add_custom_command(TARGET MyTarget POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/assets $<TARGET_FILE_DIR:MyTarget>/assets)

将资产目录复制到artifactDirectory/assets。 您需要精确定位目标中的资产目录。 CMake 文档在这一点上不是很清楚

copy_directory ... Copy directories to directory. If directory does not exist it will be created.

有参考资料:add_custom_command (3.9.6)

其次是在每个目标构建结束时执行的自定义目标,因此取决于所有目标。

语法为

add_custom_target( MyTarget ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/assets $<TARGET_FILE_DIR:MyTarget>/assets DEPENDS MyOtherTargets)`

将创建一个名为 MyTarget 的目标来执行,在目标或它依赖的文件之后构建时的命令是 builded/generated。

(此命令在构建多核项目时有一些意外行为。)

有参考文献:add_custom_target (3.9.6)

供参考,我的环境是 CLION 2017.3 和 CMake 3.10