我可以停止CMake处理而不出错吗
我需要能够从CMake函数或宏中停止CMake处理。我不想只停止处理当前文件,但停止所有CMake处理。现在,我正在使用我可以停止CMake处理而不出错吗,cmake,Cmake,我需要能够从CMake函数或宏中停止CMake处理。我不想只停止处理当前文件,但停止所有CMake处理。现在,我正在使用消息(致命错误“Foo”)。for消息说明它完全满足我的需要: CMake错误,停止处理和生成 但是,我希望能够做到这一点而不产生错误。我也不需要留言。我只想完全退出。有没有办法做到这一点 如果您的CMakeLists.txt层次结构相当浅,则可以调用一次或两次(取决于您是否调用了add_subdirectory(),或者您是否在宏/函数中),以返回调用文件或函数并退出CMak
消息(致命错误“Foo”)
。for消息
说明它完全满足我的需要:
CMake错误,停止处理和生成
但是,我希望能够做到这一点而不产生错误。我也不需要留言。我只想完全退出。有没有办法做到这一点 如果您的CMakeLists.txt层次结构相当浅,则可以调用一次或两次(取决于您是否调用了
add_subdirectory()
,或者您是否在宏/函数中),以返回调用文件或函数并退出CMake处理
如果项目层次结构更复杂,并且希望从任意位置退出CMake,则没有本机CMake命令支持该操作。但是,您可以推出自己的(无可否认,有点可怕)解决方案来终止cmake
:
function(exit_cmake)
if(UNIX)
set(KILL_COMMAND "killall")
execute_process(COMMAND ${KILL_COMMAND} -9 cmake
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)
else()
set(KILL_COMMAND "taskkill")
execute_process(COMMAND ${KILL_COMMAND} /IM cmake.exe /F
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)
endif()
endfunction()
如果将其包含在顶级CMake文件中,则可以从CMakes中的任何位置调用该文件以静默退出
警告:这将终止所有当前运行的CMake进程,而不仅仅是您当前的进程。由于您正在强制终止进程,您的CMake文件/缓存可能会处于一种奇怪的状态。如果您的CMakeLists.txt层次结构相当浅,您可以调用一次或两次(取决于您是否调用了
add_subdirectory()
或您是否在宏/函数中)返回调用文件或函数并退出CMake处理
如果项目层次结构更复杂,并且希望从任意位置退出CMake,则没有本机CMake命令支持该操作。但是,您可以推出自己的(无可否认,有点可怕)解决方案来终止cmake
:
function(exit_cmake)
if(UNIX)
set(KILL_COMMAND "killall")
execute_process(COMMAND ${KILL_COMMAND} -9 cmake
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)
else()
set(KILL_COMMAND "taskkill")
execute_process(COMMAND ${KILL_COMMAND} /IM cmake.exe /F
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
)
endif()
endfunction()
如果将其包含在顶级CMake文件中,则可以从CMakes中的任何位置调用该文件以静默退出
警告:这将终止所有当前运行的CMake进程,而不仅仅是您当前的进程。由于您正在强制终止进程,您的CMake文件/缓存可能会处于一种奇怪的状态。“从任意位置退出”是我想要的。引用的答案似乎仍在生成输出(至少是堆栈跟踪)。我要寻找的是一种完全无声的终止CMake处理的方法。你是对的,我测试了
message()
override,但它没有像我希望的那样工作。我将根据我的答案对其进行修订。@DiB我用一个似乎可以在我的机器(Windows 10)上运行的解决方案编辑了我的答案,并且应该也可以在Linux上运行。虽然这不是最好的解决方案,但你可以尝试一下,看看它是否适合你的情况。这是一种创造性的方法。我担心在可能同时运行多个CMake副本的生产环境中,这会产生意外的后果。就像你说的:“有点吓人”,“从任意位置退出”是我想要的。引用的答案似乎仍在生成输出(至少是堆栈跟踪)。我要寻找的是一种完全无声的终止CMake处理的方法。你是对的,我测试了message()
override,但它没有像我希望的那样工作。我将根据我的答案对其进行修订。@DiB我用一个似乎可以在我的机器(Windows 10)上运行的解决方案编辑了我的答案,并且应该也可以在Linux上运行。虽然这不是最好的解决方案,但你可以尝试一下,看看它是否适合你的情况。这是一种创造性的方法。我担心在可能同时运行多个CMake副本的生产环境中,这会产生意外的后果。就像你说的:“有点吓人”。