CMake:若目标运行报错则取消安装的实现方法
实现安装前运行Myexe测试并根据结果决定是否安装
你当前的POST_BUILD命令会在编译完成后立即执行Myexe,但这个流程和安装步骤完全独立,没法根据测试结果控制是否执行安装。要实现“测试通过才安装”的逻辑,需要把测试环节和install目标绑定,具体修改如下:
修改后的CMake代码
add_executable(Myexe ${SOURCES}) add_dependencies(Myexe MyexeLib) # 确保编译Myexe前先构建依赖库 # 定义自定义测试目标,专门用于运行Myexe并验证结果 add_custom_target(run_myexe_test COMMAND Myexe RESULT_VARIABLE TEST_RESULT OUTPUT_VARIABLE TEST_OUTPUT ERROR_VARIABLE TEST_ERROR WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Running Myexe pre-install test..." ) # 测试失败时终止流程,阻止安装 add_custom_command(TARGET run_myexe_test POST_BUILD COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red "Myexe测试失败!输出内容:${TEST_OUTPUT},错误信息:${TEST_ERROR}" COMMAND ${CMAKE_COMMAND} -E abort DEPENDS Myexe CONDITION NOT TEST_RESULT EQUAL 0 ) # 让install目标依赖测试目标,确保安装前必须先完成测试 add_dependencies(install run_myexe_test) install(TARGETS Myexe DESTINATION "${CMAKE_BINARY_DIR}/install/")
关键逻辑说明
- 用
add_custom_target创建独立的测试目标run_myexe_test,替代原来的POST_BUILD命令,这样能和install目标建立依赖关系,保证安装前先跑测试。 - 通过
CONDITION NOT TEST_RESULT EQUAL 0判断测试是否失败:如果Myexe的返回值不为0(一般代表程序执行出错),就打印错误信息并终止CMake流程,install动作也会被取消。 WORKING_DIRECTORY指定测试的运行目录,确保Myexe能找到依赖的库文件或配置文件,避免因路径问题导致测试误判。
进阶:根据输出内容判断是否安装
如果需要更灵活的判断(比如检查Myexe的输出内容是否符合预期,而非仅看返回值),可以把验证逻辑写到单独的CMake脚本里:
主CMake代码
add_executable(Myexe ${SOURCES}) add_dependencies(Myexe MyexeLib) add_custom_target(run_myexe_test COMMAND Myexe > myexe_test_output.txt 2> myexe_test_error.txt COMMAND ${CMAKE_COMMAND} -P check_test_result.cmake DEPENDS Myexe COMMENT "Running Myexe test and validating output..." ) add_dependencies(install run_myexe_test) install(TARGETS Myexe DESTINATION "${CMAKE_BINARY_DIR}/install/")
新建check_test_result.cmake脚本
file(READ myexe_test_output.txt TEST_OUTPUT) file(READ myexe_test_error.txt TEST_ERROR) # 检查输出中是否包含预期关键词,可根据需求修改判断逻辑 if(NOT TEST_OUTPUT MATCHES "test_passed") message(FATAL_ERROR "Myexe测试不通过!输出未包含预期内容。输出:${TEST_OUTPUT},错误:${TEST_ERROR}") endif()
内容的提问来源于stack exchange,提问作者rahman
相关产品推荐
相关产品推荐

