如何在CMakeLists.txt中忽略单个CMake命令的错误?

时间:2016-05-02 01:11:49

标签: cmake

我有一个项目CMakeLists.txt尝试读取可能存在或不存在的文件。文件丢失并且脚本处理这两种情况都不是问题。如果我们可以检测到已知的Linux发行版,则用于稍微调整编译环境:

file (READ /etc/redhat-release RHREL)
if (RHREL MATCHES "Red Hat Enterprise Linux Server release 6*")
   # tweak for RHEL6
elseif (RHREL MATCHES "Red Hat Enterprise Linux Server release 7*")
   # tweak for RHEL7
else()
   # either read failed, or we didn't match a known RHEL release
   # fallback to reasonable defaults
endif()

问题是当file(READ...)失败时,似乎是使用SEND_ERROR参数输出消息。这意味着我的配置会像我预期的那样继续进入全景else(),但在配置结束时CMake拒绝生成Makefile

如何运行file(READ)以便我可以在本地处理错误并防止它们在整个配置中失败?

2 个答案:

答案 0 :(得分:2)

你可以先检查文件是否存在(n.b.如果它存在但是不可读,你仍然会有问题):

if (EXISTS /etc/redhat-release)

答案 1 :(得分:1)

将我的评论转化为答案

在这种特殊情况下,您还可以查看CMAKE_HOST_SYSTEM

更一般的答案是您必须将代码移动到外部CMake脚本中并使用强大的execute_process()命令调用它:

<强> FileDumpRedHatRelease.cmake

file(READ /etc/redhat-release RHREL)
execute_process(COMMAND ${CMAKE_COMMAND} -E echo "${RHREL}")

# or if you don't mind the '-- ' leading dashes with STATUS messages
# (because normal CMake messages go to stderr)
#message(STATUS "${RHREL}")

<强>的CMakeLists.txt

execute_process( 
    COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_LIST_DIR}/FileDumpRedHatRelease.cmake"
    OUTPUT_VARIABLE RHREL
    ERROR_QUIET
)

<强>参考

即使这些引用都在讨论可能失败的add_custom_command()命令,在这种情况下你可以看到execute_process()和外部CMake脚本的用法: