如何在CMake的execute_process中使用find -exec命令?

4

我使用CMake的install(DIRECTORIES...)形式来在安装时复制头文件:

install(DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}
  DESTINATION include
  FILES_MATCHING PATTERN "*.h")

然而,这个命令会创建空目录(即没有头文件的目录)。因此,在安装过程中,我想查找并删除那些空目录:

install(CODE "execute_process(
  COMMAND find -type d -empty -exec rmdir '{}' ';'
  WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}
  ERROR_FILE ${CMAKE_CURRENT_BINARY_DIR}/prune_empty_dirs.err)")

通过上述命令,文件prune_empty_dirs.err将包含以下内容:

find: missing argument to `-exec'

我试图避开括号,但结果仍然出现了相同的行为。我做错了什么?谢谢。

你的 WORKING_DIRECOTIR 中有个拼写错误。 - ixSci
谢谢@ixSci,我已经修复了;不过错别字在问题中而不是我的脚本里! - piwi
1
你尝试过使用没有''或双重''的命令吗?-exec rmdir {} ; 或者是 -exec rmdir ''{}'' '';'' 或者是 -exec \"rmdir {} ;\" - ixSci
@ixSci 我尝试了你建议的所有引用方式,但它们都失败了 :-/ 然而,通过将find命令作为-c参数执行bash,我成功实现了我的目标;感谢你的帮助。 - piwi
我建议您不要先创建文件夹,而是在后面删除它们。您可以使用FILE(GLOB)来获取所需的所有文件,然后测试输出是否包含任何内容,如果没有,则不执行INSTALL(DIRECTORIES)。 - ixSci
我知道,但是我对file(GLOB)命令不太自信;文档中指出:我们不建议使用GLOB从源树中收集源文件列表。如果没有CMakeLists.txt文件在添加或删除源文件时发生更改,则生成的构建系统无法知道何时要求CMake重新生成。 - piwi
1个回答

2
我找到了解决方法。问题不在于“{}”,而是分隔符“;”。以下语法对我有用(CMake 2.8.9):
--exec rm {} "\;"

在审核队列中遇到了这个,看起来很危险,但我需要更多地了解cmake。你能再解释一下吗? - Russia Must Remove Putin
似乎解决方案是在install()代码中调用find命令时转义;但不要将其用引号括起来(否则字符串会被截断)。 - piwi

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