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

时间:2018-03-02 07:12:10

标签: c++ cmake clion

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

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

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

这是第一次构建项目时的工作原理,只要我在CMAKE生成makefile的目录中调用make,它就可以工作。

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

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

有没有办法在调用每个时间构建后强制执行构建后脚本?

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

这是针对CLion特有的,但更普遍地关注cmake。

我正在使用CMAKE 3.9.1

由于

1 个答案:

答案 0 :(得分:0)

文件(COPY文件路径)在配置时执行,CMake流配置的三个主要阶段之一 - >构建 - >安装

如果要在构建后执行命令,有两种方法可以执行此操作。

首先(可能是更好的)

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

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

  

copy_directory ...       将目录复制到目录。如果目录不存在,则会创建。

参考是: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的目标,该目标在构建/生成目标或其所依赖的文件之后构建时执行。

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

参考是:add_custom_target (3.9.6)

有关信息,我的环境是CLION 2017.3和CMake 3.10