| function(DIFF) | |
| # ~~~ | |
| # DIFF( | |
| # NAME | |
| # GOLDEN | |
| # ACTUAL | |
| # ) | |
| # | |
| # This function provides targets to check the differences between a generated file (ACTUAL) and its golden XML reference (GOLDEN). | |
| # If the diff is empty (meaning that the GOLDEN and ACTUAL are consistent) the build is successful, otherwise it ends in a failure. | |
| # | |
| # NAME name of the target that will be generated. | |
| # GOLDEN golden reference file. | |
| # ACTUAL generated file that has to be checked with the GOLDEN one. | |
| # | |
| # Usage: diff(NAME <target_name> GOLDEN <file_name.golden.xml> ACTUAL <file_name.actual.xml>) | |
| set(options) | |
| set(oneValueArgs NAME GOLDEN ACTUAL) | |
| set(multiValueArgs) | |
| cmake_parse_arguments( | |
| DIFF | |
| "${options}" | |
| "${oneValueArgs}" | |
| "${multiValueArgs}" | |
| ${ARGN} | |
| ) | |
| set(DIFF_FILE_A ${DIFF_GOLDEN}) | |
| set(DIFF_FILE_B ${DIFF_ACTUAL}) | |
| append_file_dependency(DIFF_FILE_A_DEP ${DIFF_FILE_A}) | |
| append_file_dependency(DIFF_FILE_B_DEP ${DIFF_FILE_B}) | |
| get_file_location(DIFF_FILE_A_LOCATION ${DIFF_FILE_A}) | |
| get_file_location(DIFF_FILE_B_LOCATION ${DIFF_FILE_B}) | |
| set(DIFF_OUTPUT ${DIFF_NAME}.diff) | |
| add_custom_command( | |
| OUTPUT ${DIFF_OUTPUT} | |
| DEPENDS | |
| ${DIFF_FILE_A_LOCATION} | |
| ${DIFF_FILE_A_DEP} | |
| ${DIFF_FILE_B_LOCATION} | |
| ${DIFF_FILE_B_DEP} | |
| COMMAND | |
| diff -u ${DIFF_FILE_A_LOCATION} ${DIFF_FILE_B_LOCATION} > ${DIFF_OUTPUT} || true | |
| COMMAND | |
| diff -u ${DIFF_FILE_A_LOCATION} ${DIFF_FILE_B_LOCATION} | |
| WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} | |
| ) | |
| add_file_target(FILE ${DIFF_OUTPUT} GENERATED) | |
| add_custom_target( | |
| ${DIFF_NAME} | |
| DEPENDS ${DIFF_OUTPUT} | |
| ) | |
| endfunction(DIFF) |