# run-and-compare.cmake -- Runs a command and compares its output to an expected value # Copyright (C) 2021 Nathan Moinvaziri # Licensed under the Zlib license, see LICENSE.md for details # Required Variables # COMMAND - Command to run # OUTPUT - Standard output # COMPARE - String to compare output against # Optional Variables # INPUT - Standard input # IGNORE_LINE_ENDINGS - Ignore line endings when comparing output if(NOT DEFINED OUTPUT OR NOT DEFINED COMPARE OR NOT DEFINED COMMAND) message(FATAL_ERROR "Run and compare arguments missing") endif() # Ensure directory exists for output files get_filename_component(OUTPUT_DIR "${OUTPUT}" DIRECTORY) file(MAKE_DIRECTORY "${OUTPUT_DIR}") if(INPUT) # Run command with stdin input and redirect stdout to output execute_process(COMMAND ${CMAKE_COMMAND} "-DCOMMAND=${COMMAND}" -DINPUT=${INPUT} -DOUTPUT=${OUTPUT} "-DSUCCESS_EXIT=${SUCCESS_EXIT}" -P ${CMAKE_CURRENT_LIST_DIR}/run-and-redirect.cmake RESULT_VARIABLE CMD_RESULT) else() # Run command and redirect stdout to output execute_process(COMMAND ${CMAKE_COMMAND} "-DCOMMAND=${COMMAND}" -DOUTPUT=${OUTPUT} "-DSUCCESS_EXIT=${SUCCESS_EXIT}" -P ${CMAKE_CURRENT_LIST_DIR}/run-and-redirect.cmake RESULT_VARIABLE CMD_RESULT) endif() if(CMD_RESULT) message(FATAL_ERROR "Run before compare failed: ${CMD_RESULT}") endif() # Use configure_file to normalize line-endings if(IGNORE_LINE_ENDINGS) # Rewrite files with normalized line endings to temporary directory get_filename_component(COMPARE_NAME ${COMPARE} NAME) set(COMPARE_TEMP ${CMAKE_CURRENT_BINARY_DIR}/Testing/Temporary/${COMPARE_NAME}.cmp) configure_file(${COMPARE} ${COMPARE_TEMP} NEWLINE_STYLE LF) set(COMPARE ${COMPARE_TEMP}) get_filename_component(OUTPUT_NAME ${OUTPUT} NAME) set(OUTPUT_TEMP ${CMAKE_CURRENT_BINARY_DIR}/Testing/Temporary/${OUTPUT_NAME}.cmp) configure_file(${OUTPUT} ${OUTPUT_TEMP} NEWLINE_STYLE LF) set(OUTPUT ${OUTPUT_TEMP}) endif() # Compare that output is equal to specified file execute_process(COMMAND ${CMAKE_COMMAND} -E compare_files ${COMPARE} ${OUTPUT} RESULT_VARIABLE CMD_RESULT) # Delete temporary files used to normalize line-endings if(IGNORE_LINE_ENDINGS) file(REMOVE ${COMPARE} ${OUTPUT}) endif() if(CMD_RESULT) message(FATAL_ERROR "Run compare failed: ${CMD_RESULT}") endif()