# pcre2-config.cmake
# ----------------
#
# Finds the PCRE2 library, specify the starting search path in PCRE2_ROOT.
#
# Static vs. shared
# -----------------
# To make use of the static library instead of the shared one, one needs
# to set the variable PCRE2_USE_STATIC_LIBS to ON before calling find_package.
# Example:
#   set(PCRE2_USE_STATIC_LIBS ON)
#   find_package(PCRE2 CONFIG COMPONENTS 8BIT)
#
# This will define the following variables:
#
#   PCRE2_FOUND   - True if the system has the PCRE2 library.
#   PCRE2_VERSION - The version of the PCRE2 library which was found.
#
# and the following imported targets:
#
#   PCRE2::8BIT  - The 8 bit PCRE2 library.
#   PCRE2::16BIT - The 16 bit PCRE2 library.
#   PCRE2::32BIT - The 32 bit PCRE2 library.
#   PCRE2::POSIX - The POSIX PCRE2 library.

set(PCRE2_NON_STANDARD_LIB_PREFIX @NON_STANDARD_LIB_PREFIX@)
set(PCRE2_NON_STANDARD_LIB_SUFFIX @NON_STANDARD_LIB_SUFFIX@)
set(PCRE2_8BIT_NAME pcre2-8)
set(PCRE2_16BIT_NAME pcre2-16)
set(PCRE2_32BIT_NAME pcre2-32)
set(PCRE2_POSIX_NAME pcre2-posix)
find_path(PCRE2_INCLUDE_DIR NAMES pcre2.h DOC "PCRE2 include directory")
if (PCRE2_USE_STATIC_LIBS)
  if (MSVC)
    set(PCRE2_8BIT_NAME pcre2-8-static)
    set(PCRE2_16BIT_NAME pcre2-16-static)
    set(PCRE2_32BIT_NAME pcre2-32-static)
    set(PCRE2_POSIX_NAME pcre2-posix-static)
  endif ()

  set(PCRE2_PREFIX ${CMAKE_STATIC_LIBRARY_PREFIX})
  set(PCRE2_SUFFIX ${CMAKE_STATIC_LIBRARY_SUFFIX})
else ()
  set(PCRE2_PREFIX ${CMAKE_SHARED_LIBRARY_PREFIX})
  if (MINGW AND PCRE2_NON_STANDARD_LIB_PREFIX)
    set(PCRE2_PREFIX "")
  endif ()

  set(PCRE2_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX})
  if (MINGW AND PCRE2_NON_STANDARD_LIB_SUFFIX)
    set(PCRE2_SUFFIX "-0.dll")
  endif ()
endif ()
find_library(PCRE2_8BIT_LIBRARY NAMES ${PCRE2_PREFIX}${PCRE2_8BIT_NAME}${PCRE2_SUFFIX} ${PCRE2_PREFIX}${PCRE2_8BIT_NAME}d${PCRE2_SUFFIX} DOC "8 bit PCRE2 library")
find_library(PCRE2_16BIT_LIBRARY NAMES ${PCRE2_PREFIX}${PCRE2_16BIT_NAME}${PCRE2_SUFFIX} ${PCRE2_PREFIX}${PCRE2_8BIT_NAME}d${PCRE2_SUFFIX} DOC "16 bit PCRE2 library")
find_library(PCRE2_32BIT_LIBRARY NAMES ${PCRE2_PREFIX}${PCRE2_32BIT_NAME}${PCRE2_SUFFIX} ${PCRE2_PREFIX}${PCRE2_8BIT_NAME}d${PCRE2_SUFFIX} DOC "32 bit PCRE2 library")
find_library(PCRE2_POSIX_LIBRARY NAMES ${PCRE2_PREFIX}${PCRE2_POSIX_NAME}${PCRE2_SUFFIX} ${PCRE2_PREFIX}${PCRE2_8BIT_NAME}d${PCRE2_SUFFIX} DOC "8 bit POSIX PCRE2 library")
unset(PCRE2_NON_STANDARD_LIB_PREFIX)
unset(PCRE2_NON_STANDARD_LIB_SUFFIX)
unset(PCRE2_8BIT_NAME)
unset(PCRE2_16BIT_NAME)
unset(PCRE2_32BIT_NAME)
unset(PCRE2_POSIX_NAME)

# Set version
if (PCRE2_INCLUDE_DIR)
  set(PCRE2_VERSION "@PCRE2_MAJOR@.@PCRE2_MINOR@.0")
endif ()

# Which components have been found.
if (PCRE2_8BIT_LIBRARY)
  set(PCRE2_8BIT_FOUND TRUE)
endif ()
if (PCRE2_16BIT_LIBRARY)
  set(PCRE2_16BIT_FOUND TRUE)
endif ()
if (PCRE2_32BIT_LIBRARY)
  set(PCRE2_32BIT_FOUND TRUE)
endif ()
if (PCRE2_POSIX_LIBRARY)
  set(PCRE2_POSIX_FOUND TRUE)
endif ()

# Check if at least one component has been specified.
list(LENGTH PCRE2_FIND_COMPONENTS PCRE2_NCOMPONENTS)
if (PCRE2_NCOMPONENTS LESS 1)
  message(FATAL_ERROR "No components have been specified. This is not allowed. Please, specify at least one component.")
endif ()
unset(PCRE2_NCOMPONENTS)

# When POSIX component has been specified make sure that also 8BIT component is specified.
set(PCRE2_8BIT_COMPONENT FALSE)
set(PCRE2_POSIX_COMPONENT FALSE)
foreach(component ${PCRE2_FIND_COMPONENTS})
  if (component STREQUAL "8BIT")
    set(PCRE2_8BIT_COMPONENT TRUE)
  elseif (component STREQUAL "POSIX")
    set(PCRE2_POSIX_COMPONENT TRUE)
  endif ()
endforeach()

if (PCRE2_POSIX_COMPONENT AND NOT PCRE2_8BIT_COMPONENT)
  message(FATAL_ERROR "The component POSIX is specified while the 8BIT one is not. This is not allowed. Please, also specify the 8BIT component.")
endif()
unset(PCRE2_8BIT_COMPONENT)
unset(PCRE2_POSIX_COMPONENT)

include(FindPackageHandleStandardArgs)
set(${CMAKE_FIND_PACKAGE_NAME}_CONFIG "${CMAKE_CURRENT_LIST_FILE}")
find_package_handle_standard_args(PCRE2
  FOUND_VAR PCRE2_FOUND
  REQUIRED_VARS PCRE2_INCLUDE_DIR
  HANDLE_COMPONENTS
  VERSION_VAR PCRE2_VERSION
  CONFIG_MODE
)

set(PCRE2_LIBRARIES)
if (PCRE2_FOUND)
  foreach(component ${PCRE2_FIND_COMPONENTS})
    if (PCRE2_USE_STATIC_LIBS)
      add_library(PCRE2::${component} STATIC IMPORTED)
      target_compile_definitions(PCRE2::${component} INTERFACE PCRE2_STATIC)
    else ()
      add_library(PCRE2::${component} SHARED IMPORTED)
    endif ()
    set_target_properties(PCRE2::${component} PROPERTIES
      IMPORTED_LOCATION "${PCRE2_${component}_LIBRARY}"
      INTERFACE_INCLUDE_DIRECTORIES "${PCRE2_INCLUDE_DIR}"
    )
    if (component STREQUAL "POSIX")
      set_target_properties(PCRE2::${component} PROPERTIES
        INTERFACE_LINK_LIBRARIES "PCRE2::8BIT"
        LINK_LIBRARIES "PCRE2::8BIT"
      )
    endif ()

    set(PCRE2_LIBRARIES ${PCRE2_LIBRARIES} ${PCRE2_${component}_LIBRARY})
    mark_as_advanced(PCRE2_${component}_LIBRARY)
  endforeach()
endif ()

mark_as_advanced(
  PCRE2_INCLUDE_DIR
)
