1# run-and-redirect.cmake -- Runs a command and validates exit code 2 3# Copyright (C) 2021 Nathan Moinvaziri 4# Licensed under the Zlib license, see LICENSE.md for details 5 6# Normally ctest will always fail with non-zero exit code, but we have tests 7# that need to check specific exit codes. 8 9# Required Variables 10# COMMAND - Command to run 11 12# Optional Variables 13# INPUT - Standard input 14# OUTPUT - Standard output (default: /dev/null) 15# SUCCESS_EXIT - List of successful exit codes (default: 0, ie: 0;1) 16 17# If no output is specified, discard output 18if(NOT DEFINED OUTPUT) 19 if(WIN32) 20 set(OUTPUT NUL) 21 else() 22 set(OUTPUT /dev/null) 23 endif() 24endif() 25 26if(INPUT) 27 # Check to see that input file exists 28 if(NOT EXISTS ${INPUT}) 29 message(FATAL_ERROR "Cannot find input: ${INPUT}") 30 endif() 31 # Execute with both stdin and stdout file 32 execute_process(COMMAND ${COMMAND} 33 RESULT_VARIABLE CMD_RESULT 34 INPUT_FILE ${INPUT} 35 OUTPUT_FILE ${OUTPUT}) 36else() 37 # Execute with only stdout file 38 execute_process(COMMAND ${COMMAND} 39 RESULT_VARIABLE CMD_RESULT 40 OUTPUT_FILE ${OUTPUT}) 41endif() 42 43# Check if exit code is in list of successful exit codes 44if(SUCCESS_EXIT) 45 list(FIND SUCCESS_EXIT ${CMD_RESULT} _INDEX) 46 if (${_INDEX} GREATER -1) 47 set(CMD_RESULT 0) 48 endif() 49endif() 50 51# Check to see if successful 52if(CMD_RESULT) 53 message(FATAL_ERROR "${COMMAND} failed: ${CMD_RESULT}") 54endif() 55