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

5

我有一个项目,其中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)以便能够在本地处理错误并防止它们使整个配置失败?

1
你也可以检查 CMAKE_HOST_SYSTEM 这个全局变量。我觉得你实际上不需要读取 redhat-release 文件。 - Florian
好主意。我会改成那样做 - 但我仍然想知道如何明确忽略命令上的错误(而不仅仅是 file(...))。 - marack
2个回答

3
你可以先检查文件是否存在(注意,如果它存在但无法读取,你仍然会遇到问题):
if (EXISTS /etc/redhat-release)

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脚本的用法:


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