# Try to find the libxml2 library
#
# If successful, the following variables will be defined:
# LIBXML2_INCLUDE_DIR
# LIBXML2_LIBRARY
# LIBXML2_STATIC_LIBRARY
# LibXml2_FOUND
#
# Additionally, the following import targets will be defined:
# LibXml2::LibXml2
# LibXml2::LibXml2Static (if the static library is found)

find_package(PkgConfig QUIET)
if(PkgConfig_FOUND)
  pkg_check_modules(PC_LIBXML QUIET libxml-2.0)
endif()

find_path(LIBXML2_INCLUDE_DIR NAMES libxml/xpath.h
  HINTS
  ${PC_LIBXML_INCLUDEDIR}
  ${PC_LIBXML_INCLUDE_DIRS}
  PATH_SUFFIXES libxml2
)

if(DEFINED LIBXML2_LIBRARIES AND NOT DEFINED LIBXML2_LIBRARY)
  set(LIBXML2_LIBRARY "${LIBXML2_LIBRARIES}" CACHE FILEPATH "Path to libxml2 library")
endif()

find_library(LIBXML2_LIBRARY NAMES xml2 libxml2 libxml2s libxml2_a
  HINTS
  ${PC_LIBXML_LIBDIR}
  ${PC_LIBXML_LIBRARY_DIRS}
)

find_library(LIBXML2_STATIC_LIBRARY NAMES
  "${CMAKE_STATIC_LIBRARY_PREFIX}libxml2s${CMAKE_STATIC_LIBRARY_SUFFIX}"
  "${CMAKE_STATIC_LIBRARY_PREFIX}xml2${CMAKE_STATIC_LIBRARY_SUFFIX}"
  "${CMAKE_STATIC_LIBRARY_PREFIX}libxml2${CMAKE_STATIC_LIBRARY_SUFFIX}"
  HINTS
  ${PC_LIBXML_LIBDIR}
  ${PC_LIBXML_LIBRARY_DIRS}
)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LibXml2
  REQUIRED_VARS LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR
  VERSION_VAR PC_LIBXML_VERSION
)

if(LibXml2_FOUND)
  if(NOT TARGET LibXml2::LibXml2)
    add_library(LibXml2::LibXml2 UNKNOWN IMPORTED)
    set_target_properties(LibXml2::LibXml2 PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${LIBXML2_INCLUDE_DIR}"
        INTERFACE_COMPILE_OPTIONS "${PC_LIBXML_CFLAGS_OTHER}"
        IMPORTED_LOCATION "${LIBXML2_LIBRARY}")
  endif()
  if(LIBXML2_STATIC_LIBRARY AND NOT TARGET LibXml2::LibXml2Static)
    add_library(LibXml2::LibXml2Static STATIC IMPORTED)
    set_target_properties(LibXml2::LibXml2Static PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES "${LIBXML2_INCLUDE_DIR}"
        INTERFACE_COMPILE_OPTIONS "${PC_LIBXML_CFLAGS_OTHER}"
        IMPORTED_LOCATION "${LIBXML2_STATIC_LIBRARY}")
    # Static libraries need their transitive dependencies for linking.
    set(LIBXML2_STATIC_DEPS)
    foreach(lib IN LISTS PC_LIBXML_STATIC_LIBRARIES)
      if(NOT lib STREQUAL "xml2")
        list(APPEND LIBXML2_STATIC_DEPS ${lib})
      endif()
    endforeach()
    if(LIBXML2_STATIC_DEPS)
      set_target_properties(LibXml2::LibXml2Static PROPERTIES
          INTERFACE_LINK_LIBRARIES "${LIBXML2_STATIC_DEPS}")
    endif()
  endif()
endif()

set(LIBXML2_INCLUDE_DIRS ${LIBXML2_INCLUDE_DIR})
set(LIBXML2_LIBRARIES ${LIBXML2_LIBRARY})
set(LIBXML2_DEFINITIONS ${PC_LIBXML_CFLAGS_OTHER})

mark_as_advanced(LIBXML2_INCLUDE_DIR LIBXML2_LIBRARY LIBXML2_STATIC_LIBRARY)
