我有一个项目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)
以便我可以在本地处理错误并防止它们在整个配置中失败?
答案 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脚本的用法: