【发布时间】:2021-11-08 21:15:08
【问题描述】:
我有一组资源文件,它们与 GCC 的构建步骤或其他一些编译器的输出无关。我需要将它们从我项目中的文件夹复制到 cmake 构建输出文件夹。目标是可执行文件,当从构建输出文件夹运行时,可以看到资源。
人们通常如何在 cmake 构建中复制和安装资源?此外,无论构建中的更改如何,我都希望它们被复制,并且我希望每次运行某些 cmake 命令时都执行它,例如 build.请参阅下文了解我尝试解决此问题的方法。
例如:
我有一堆要复制的着色器文件。所有 shaders/* 文件都应该复制到构建输出中名为“shaders”的目录中,因为这是程序的可执行文件所在的位置。
file(GLOB out shaders/*)
foreach (o ${out})
message("${o} was copied to shaders")
file(COPY ${o} DESTINATION shaders)
endforeach ()
这仅在某些时候有效,例如当我重新加载 CMake 项目时,例如:
/opt/clion-2021.2.3/bin/cmake/linux/bin/cmake \
-DCMAKE_BUILD_TYPE=Debug -DCMAKE_DEPENDS_USE_COMPILER=FALSE \
-G "CodeBlocks - Unix Makefiles" \
/home/hack/glad
此外,它不执行“POST_BUILD”,因此shaders/a.vert 文件的最新版本不会被复制到输出中的 shaders/ 目录。
我也尝试过使用它,但它让我有些头疼:
add_custom_command(TARGET my-executable POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy shaders/* shaders)
我认为上面有一些不正确的地方,因为如果构建的代码没有改变,它就不会在每个 POST_BUILD 中运行。我不在乎构建的代码是否不会更改,因为 shaders/* 中的文件可能已经更改并且应该被复制,而不管 cmake 确定 my-executable 中是否有更改。
【问题讨论】:
-
“我不在乎构建的代码是否不会改变,因为 shaders/ 中的文件可能已经改变了”* sharder 文件是在构建过程中生成的吗?在这种情况下,听起来您没有将自定义命令添加到正确的目标。那些只是完全独立于 CMake 项目编辑的文件吗?如果是这种情况,
add_custom_target(... ALL ...)可能就是您正在寻找的,因为这允许您添加一个在默认目标 (all) 构建期间始终构建的目标。
标签: cmake