# - Try to find Enchant
# Once done, this will define
#
#  ENCHANT_INCLUDE_DIRS - the Enchant include drectories
#  ENCHANT_LIBRARIES - link these to use Enchant
#
# Copyright (C) 2012 Samsung Electronics
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

find_package(PkgConfig)

# TODO Remove the check for Enchant 1.x once all major LTS GNU/Linux
#      distributions ship the 2.x series (probably around mid-2020).

foreach (ENCHANT_NAME enchant-2 enchant)
    pkg_check_modules(PC_ENCHANT ${ENCHANT_NAME})

    find_path(ENCHANT_INCLUDE_DIRS
        NAMES enchant.h
        HINTS ${PC_ENCHANT_INCLUDEDIR}
              ${PC_ENCHANT_INCLUDE_DIRS}
    )

    find_library(ENCHANT_LIBRARIES
        NAMES ${ENCHANT_NAME}
        HINTS ${PC_ENCHANT_LIBDIR}
              ${PC_ENCHANT_LIBRARY_DIRS}
    )

    # Only stop searching if the three have been found. This covers for corner
    # cases in which e.g. both versions of the library are installed, but the
    # headers are usable/present for one of them.
    if (PC_ENCHANT_FOUND AND ENCHANT_INCLUDE_DIRS AND ENCHANT_LIBRARIES)
        break ()
    endif ()
endforeach (ENCHANT_NAME)

mark_as_advanced(
    ENCHANT_INCLUDE_DIRS
    ENCHANT_LIBRARIES
)
