# Attempts to discover terminfo library with a linkable setupterm function.
#
# Example usage:
#
# find_package(Terminfo)
#
# If successful, the following variables will be defined:
# Terminfo_FOUND
# Terminfo_LIBRARIES
#
# Additionally, the following import target will be defined:
# Terminfo::terminfo

find_library(Terminfo_LIBRARIES NAMES terminfo tinfo curses ncurses ncursesw)

if(Terminfo_LIBRARIES)
  include(CMakePushCheckState)
  include(CheckCSourceCompiles)
  cmake_push_check_state()
  list(APPEND CMAKE_REQUIRED_LIBRARIES ${Terminfo_LIBRARIES})
  check_c_source_compiles("
    int setupterm(char *term, int filedes, int *errret);
    int main() { return setupterm(0, 0, 0); }"
    Terminfo_LINKABLE)
  cmake_pop_check_state()
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Terminfo
                                  FOUND_VAR
                                    Terminfo_FOUND
                                  REQUIRED_VARS
                                    Terminfo_LIBRARIES
                                    Terminfo_LINKABLE)
mark_as_advanced(Terminfo_LIBRARIES
                 Terminfo_LINKABLE)

if(Terminfo_FOUND)
  if(NOT TARGET Terminfo::terminfo)
    add_library(Terminfo::terminfo UNKNOWN IMPORTED)
    set_target_properties(Terminfo::terminfo PROPERTIES IMPORTED_LOCATION "${Terminfo_LIBRARIES}")
  endif()
endif()
