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)
