【问题标题】:cmake: check if file exists at build time rather than during cmake configurationcmake:在构建时而不是在 cmake 配置期间检查文件是否存在
【发布时间】:2013-09-18 01:46:05
【问题描述】:

我有一个自定义构建命令需要检查某个文件是否存在。我尝试使用

IF(EXISTS "/the/file")
...
ELSE()
...
ENDIF()

但该测试仅评估一次;当 cmake 首次运行时。每次制作完成时,我都需要它来执行测试。制作时检查的方法是什么?谢谢。

【问题讨论】:

  • 显示自定义构建命令的其余部分。

标签: file cmake exists


【解决方案1】:

您可以使用add_custom_command 通过使用-P 命令行选项以脚本模式调用CMake 本身。

所以你的命令应该是这样的:

set(FileToCheck "/the/file")
add_custom_command(TARGET MyExe
                   POST_BUILD
                   COMMAND ${CMAKE_COMMAND}
                       -DFileToCheck=${FileToCheck}
                       -P ${CMAKE_CURRENT_SOURCE_DIR}/check.cmake
                   COMMENT "Checking if ${FileToCheck} exists...")

您的脚本文件“check.cmake”将类似于:

if(EXISTS ${FileToCheck})
  message("${FileToCheck} exists.")
else()
  message("${FileToCheck} doesn't exist.")
endif()

【讨论】:

  • 谢谢,虽然检查文件似乎需要做很多工作:)
  • 我理解这是可行的,但我同意@gimmeamilk 的观点,对于这么简单的事情来说这很乏味。不过,我会投票赞成解决方案。
  • 可能是,值得强调的是,您的答案提供了一个可移植的解决方案。 (我们明确选择 CMake 来开发可以在 Windows 和 Linux 上编译的应用程序,甚至可能在 MacOS X 上编译。这就是为什么我可能对此有点敏感。)
【解决方案2】:

类似的想法

您将需要add_custom_command,但如果您愿意稍微了解一下 Unix,您可以随时使用test

set(FileToCheck "/the/file")
add_custom_command( OUTPUT output.txt
    COMMAND test -e output.txt || echo "Do something meaningful"
    COMMENT "Checking if ${FileToCheck} exists...")

【讨论】:

  • COMMAND test -e output.txt || echo "Do something if file does not exist"
    COMMAND test ! -e output.txt || echo "Do something if file exist"
  • @idailylife 也许更详细一点? cmets 部分忽略 HTML
【解决方案3】:
如果您需要在 if(EXISTS) 中添加自定义逻辑,

[@Frazers] 答案非常好。 但是,如果您只需要在缺少单个文件的情况下使构建失败,您可以使用cmake -E 命令行模式将文件与自身进行比较。

如果提供的文件不存在,这将确保构建始终停止,它是跨平台安全的,并且适用于自 3.0 以来的每个版本的 cmake。

set(_fileToCheck "foo.txt")
add_custom_command(TARGET YourTarget
  PRE_BUILD
  COMMAND ${CMAKE_COMMAND} -E compare_files ${_fileToCheck} ${_fileToCheck}
  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  COMMENT "Checking if ${_fileToCheck} exists, build will fail if it doesn't"
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2015-04-16
    相关资源
    最近更新 更多