如何在CMake安装中使用通配符

6

我可以安装一个具体的文件。当在相同命令中使用通配符时,它会抱怨该文件不存在。

这是可以正常工作的那一个

install(FILES  ${CMAKE_CURRENT_BINARY_DIR}/libproduction_rdict.pcm DESTINATION ${LIBRARY_OUTPUT_PATH})

这是不起作用的一个

install(FILES  ${CMAKE_CURRENT_BINARY_DIR}/*_rdict.pcm DESTINATION ${LIBRARY_OUTPUT_PATH})

错误信息是:
-- Install configuration: ""
CMake Error at Source/cmake_install.cmake:49 (file):
  file INSTALL cannot find
  "/home/wxie/AI/CUDA/cuda_exmaple/example_2/Build/Source/*_rdict.pcm".
Call Stack (most recent call first):
  cmake_install.cmake:42 (include)
2个回答

11

命令流程install(FILES)要求所有文件都必须明确列出。

如果要按模式安装多个文件,请使用install(DIRECTORY)及其PATTERN选项:

install(DIRECTORY  ${CMAKE_CURRENT_BINARY_DIR} DESTINATION ${LIBRARY_OUTPUT_PATH}
    FILES_MATCHING PATTERN "*_rdict.pcm")

可以在文档中找到有关 install(DIRECTORY) 和模式的更多信息。


install(DIRECTORY)将*.pcm文件放置在“lib/Build/”目录中,而实际的库文件位于“lib”目录中。为了我的目的,我需要将库文件和pcm文件放置在同一个目录中。是否有选项可以实现这个功能?一种解决方案是循环遍历文件列表,并逐个安装。希望有更简单的解决方案。 - David
1
通过正确的 DIRECTORYDESTINATION 选项,您可以调整文件的适当安装路径。或者您是指在这种情况下,安装目录会擦除其他方式(例如使用 install(TARGET))安装的文件吗?“一种解决方案是循环遍历文件列表并逐个安装。” - 您可以使用 GLOB 收集文件,并将结果列表传递到 install(FILES) 命令中。 - Tsyvarev
几乎工作但仍不完美。症状如下:“cmake ../; make; make install”然后我收到消息: “安装项目...; -- 安装配置:“” 但文件未安装。然后我需要再次执行:“cmake ../; make install ”这次它可以正常工作。为什么需要两次执行“cmake ../”才能完成呢? - David
"file(GLOB_RECURSE PCM_FILES ${CMAKE_CURRENT_BINARY_DIR}/Source/*.pcm); "install(FILES ${PCM_FILES} DESTINATION ${LIBRARY_OUTPUT_PATH})" 我认为原因是在“make”之前,cmake找不到pcm文件,因为它直到“make”完成后才存在。第二次执行时,pcm文件已经存在,这次就可以正常工作了。 - David
将DESTINATION属性设置为'./'后,DLL文件将与可执行文件一起放置在顶层目录中:install(DIRECTORY ${COMPILER_PROGRAM_DIRECTORY} DESTINATION . FILES_MATCHING PATTERN "libgcc*.dll" PATTERN "libstdc++.dll" PATTERN "libwinpthread.dll" ) - undefined
显示剩余5条评论

1

好的,这是我最终做的:

最初的回答:

add_custom_target(move_pcmfile
COMMAND mv ${BUILD_DIR}/Source/*.pcm  ${LIBRARY_OUTPUT_PATH})

在执行"make"命令后,我只需要执行"make move_pcmfile"命令即可解决我的问题,这似乎是最方便的方法。

原始答案翻译成中文为"最初的回答"。

2
mv?!这听起来像是你要摧毁你的构建树... - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接