|  | function(XML_LINT) | 
|  | # ~~~ | 
|  | # XML_LINT( | 
|  | # NAME | 
|  | # FILE | 
|  | # LINT_OUTPUT | 
|  | # SCHEMA | 
|  | # ) | 
|  | set(options) | 
|  | set(oneValueArgs NAME FILE LINT_OUTPUT SCHEMA) | 
|  | set(multiValueArgs) | 
|  | cmake_parse_arguments( | 
|  | XML_LINT | 
|  | "${options}" | 
|  | "${oneValueArgs}" | 
|  | "${multiValueArgs}" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | get_target_property_required(XMLLINT env XMLLINT) | 
|  |  | 
|  | # For xmllint we use head to shortcircuit failure as it can take a | 
|  | # very long time to output all of the errors | 
|  | add_custom_command( | 
|  | OUTPUT ${XML_LINT_LINT_OUTPUT} | 
|  | DEPENDS ${XML_LINT_FILE} ${XML_LINT_SCHEMA} ${XMLLINT} | 
|  | COMMAND bash -c | 
|  | '${XMLLINT} | 
|  | --output ${XML_LINT_LINT_OUTPUT} | 
|  | --schema ${XML_LINT_SCHEMA} | 
|  | ${XML_LINT_FILE} 2>&1 |  head -n10 && exit "$$\{PIPESTATUS[0]\}" ' | 
|  | ) | 
|  |  | 
|  | get_rel_target(REL_XML_LINT_NAME lint ${XML_LINT_NAME}) | 
|  | add_custom_target( | 
|  | ${REL_XML_LINT_NAME} | 
|  | DEPENDS ${XML_LINT_LINT_OUTPUT} | 
|  | ) | 
|  | add_dependencies(all_xml_lint ${REL_XML_LINT_NAME}) | 
|  |  | 
|  | endfunction(XML_LINT) | 
|  |  | 
|  | function(XML_CANONICALIZE_MERGE) | 
|  | # ~~~ | 
|  | # XML_CANONICALIZE_MERGE( | 
|  | # NAME | 
|  | # FILE | 
|  | # OUTPUT | 
|  | # {EXTRA_ARGUMENTS} | 
|  | # ) | 
|  | # | 
|  | # This function provides targets to sort the XML file in input according to the `convert_and_merge_composable_fpga_architecture.xsl` script. | 
|  | # It appends all the dependencies necessary to produce the desired OUTPUT (e.g. verilog to XML translation through the tools). | 
|  | # | 
|  | # NAME is used to give a name to the target. | 
|  | # FILE is the input file that needs to be processed by xsl script. | 
|  | # OUTPUT is the name of the output file | 
|  | # EXTRA_ARGUMENTS is the extra arguments to give to xsltproc when running the xsl script. | 
|  |  | 
|  | set(options) | 
|  | set(oneValueArgs NAME FILE OUTPUT) | 
|  | set(multiValueArgs EXTRA_ARGUMENTS) | 
|  | cmake_parse_arguments( | 
|  | XML_CANONICALIZE_MERGE | 
|  | "${options}" | 
|  | "${oneValueArgs}" | 
|  | "${multiValueArgs}" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | set(DEPS "") | 
|  | append_file_dependency(DEPS ${XML_CANONICALIZE_MERGE_FILE}) | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT ${XML_CANONICALIZE_MERGE_OUTPUT} | 
|  | DEPENDS | 
|  | ${DEPS} | 
|  | ${PYTHON3} | 
|  | COMMAND | 
|  | PYTHONPATH=${f4pga-arch-defs_SOURCE_DIR}/third_party/vtr-xml-utils/:${PYTHONPATH} | 
|  | ${PYTHON3} -m vtr_xml_utils | 
|  | ${XML_CANONICALIZE_MERGE_FILE} | 
|  | -o ${CMAKE_CURRENT_BINARY_DIR}/${XML_CANONICALIZE_MERGE_OUTPUT} | 
|  | ) | 
|  |  | 
|  | add_file_target(FILE ${XML_CANONICALIZE_MERGE_OUTPUT} GENERATED) | 
|  |  | 
|  | get_rel_target(REL_XML_CANONICALIZE_MERGE_FILE merge ${XML_CANONICALIZE_MERGE_FILE}) | 
|  | add_custom_target( | 
|  | ${REL_XML_CANONICALIZE_MERGE_FILE} | 
|  | DEPENDS ${XML_CANONICALIZE_MERGE_OUTPUT} | 
|  | ) | 
|  | endfunction(XML_CANONICALIZE_MERGE) |