FindCurses: Overhaul Curses and NCurses search logic (#15011)
Produce a more consistent result by finding only a single include directory and reporting which headers may be included from it. The previous search for each header separately might find pieces from separate and incompatible packages. While at it, provide the CURSES_INCLUDE_DIRS result variable to be consistent with other modules.
This commit is contained in:
parent
c72642f927
commit
6c8364e6cb
|
@ -2,28 +2,43 @@
|
||||||
# FindCurses
|
# FindCurses
|
||||||
# ----------
|
# ----------
|
||||||
#
|
#
|
||||||
# Find the curses include file and library
|
# Find the curses or ncurses include file and library.
|
||||||
#
|
#
|
||||||
|
# Result Variables
|
||||||
|
# ^^^^^^^^^^^^^^^^
|
||||||
#
|
#
|
||||||
|
# This module defines the following variables:
|
||||||
#
|
#
|
||||||
# ::
|
# ``CURSES_FOUND``
|
||||||
|
# True if Curses is found.
|
||||||
|
# ``CURSES_INCLUDE_DIRS``
|
||||||
|
# The include directories needed to use Curses.
|
||||||
|
# ``CURSES_LIBRARIES``
|
||||||
|
# The libraries needed to use Curses.
|
||||||
|
# ``CURSES_HAVE_CURSES_H``
|
||||||
|
# True if curses.h is available.
|
||||||
|
# ``CURSES_HAVE_NCURSES_H``
|
||||||
|
# True if ncurses.h is available.
|
||||||
|
# ``CURSES_HAVE_NCURSES_NCURSES_H``
|
||||||
|
# True if ``ncurses/ncurses.h`` is available.
|
||||||
|
# ``CURSES_HAVE_NCURSES_CURSES_H``
|
||||||
|
# True if ``ncurses/curses.h`` is available.
|
||||||
#
|
#
|
||||||
# CURSES_FOUND - system has Curses
|
# Set ``CURSES_NEED_NCURSES`` to ``TRUE`` before the
|
||||||
# CURSES_INCLUDE_DIR - the Curses include directory
|
# ``find_package(Curses)`` call if NCurses functionality is required.
|
||||||
# CURSES_LIBRARIES - The libraries needed to use Curses
|
|
||||||
# CURSES_HAVE_CURSES_H - true if curses.h is available
|
|
||||||
# CURSES_HAVE_NCURSES_H - true if ncurses.h is available
|
|
||||||
# CURSES_HAVE_NCURSES_NCURSES_H - true if ncurses/ncurses.h is available
|
|
||||||
# CURSES_HAVE_NCURSES_CURSES_H - true if ncurses/curses.h is available
|
|
||||||
# CURSES_LIBRARY - set for backwards compatibility with 2.4 CMake
|
|
||||||
#
|
#
|
||||||
|
# Backward Compatibility
|
||||||
|
# ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
#
|
#
|
||||||
|
# The following variable are provided for backward compatibility:
|
||||||
#
|
#
|
||||||
# Set CURSES_NEED_NCURSES to TRUE before the find_package() command if
|
# ``CURSES_INCLUDE_DIR``
|
||||||
# NCurses functionality is required.
|
# Path to Curses include. Use ``CURSES_INCLUDE_DIRS`` instead.
|
||||||
|
# ``CURSES_LIBRARY``
|
||||||
|
# Path to Curses library. Use ``CURSES_LIBRARIES`` instead.
|
||||||
|
|
||||||
#=============================================================================
|
#=============================================================================
|
||||||
# Copyright 2001-2009 Kitware, Inc.
|
# Copyright 2001-2014 Kitware, Inc.
|
||||||
#
|
#
|
||||||
# Distributed under the OSI-approved BSD License (the "License");
|
# Distributed under the OSI-approved BSD License (the "License");
|
||||||
# see accompanying file Copyright.txt for details.
|
# see accompanying file Copyright.txt for details.
|
||||||
|
@ -84,59 +99,27 @@ if(CURSES_CURSES_LIBRARY AND CURSES_NEED_NCURSES)
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CURSES_USE_NCURSES)
|
||||||
if(NOT CURSES_USE_NCURSES)
|
|
||||||
find_file(CURSES_HAVE_CURSES_H curses.h )
|
|
||||||
find_path(CURSES_CURSES_H_PATH curses.h )
|
|
||||||
get_filename_component(_cursesLibDir "${CURSES_CURSES_LIBRARY}" PATH)
|
|
||||||
get_filename_component(_cursesParentDir "${_cursesLibDir}" PATH)
|
|
||||||
|
|
||||||
# for compatibility with older FindCurses.cmake this has to be in the cache
|
|
||||||
# FORCE must not be used since this would break builds which preload a cache wqith these variables set
|
|
||||||
set(CURSES_INCLUDE_PATH "${CURSES_CURSES_H_PATH}"
|
|
||||||
CACHE FILEPATH "The curses include path")
|
|
||||||
set(CURSES_LIBRARY "${CURSES_CURSES_LIBRARY}"
|
|
||||||
CACHE FILEPATH "The curses library")
|
|
||||||
else()
|
|
||||||
# we need to find ncurses
|
|
||||||
get_filename_component(_cursesLibDir "${CURSES_NCURSES_LIBRARY}" PATH)
|
get_filename_component(_cursesLibDir "${CURSES_NCURSES_LIBRARY}" PATH)
|
||||||
get_filename_component(_cursesParentDir "${_cursesLibDir}" PATH)
|
get_filename_component(_cursesParentDir "${_cursesLibDir}" PATH)
|
||||||
|
|
||||||
find_file(CURSES_HAVE_NCURSES_H ncurses.h)
|
# Use CURSES_NCURSES_INCLUDE_PATH if set, for compatibility.
|
||||||
find_file(CURSES_HAVE_NCURSES_NCURSES_H ncurses/ncurses.h)
|
if(CURSES_NCURSES_INCLUDE_PATH)
|
||||||
find_file(CURSES_HAVE_NCURSES_CURSES_H ncurses/curses.h)
|
find_path(CURSES_INCLUDE_PATH
|
||||||
find_file(CURSES_HAVE_CURSES_H curses.h
|
NAMES ncurses/ncurses.h ncurses/curses.h ncurses.h curses.h
|
||||||
HINTS "${_cursesParentDir}/include")
|
PATHS ${CURSES_NCURSES_INCLUDE_PATH}
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
find_path(CURSES_NCURSES_INCLUDE_PATH ncurses.h ncurses/ncurses.h
|
find_path(CURSES_INCLUDE_PATH
|
||||||
ncurses/curses.h)
|
NAMES ncurses/ncurses.h ncurses/curses.h ncurses.h curses.h
|
||||||
find_path(CURSES_NCURSES_INCLUDE_PATH curses.h
|
HINTS "${_cursesParentDir}/include"
|
||||||
HINTS "${_cursesParentDir}/include")
|
)
|
||||||
|
|
||||||
# for compatibility with older FindCurses.cmake this has to be in the cache
|
# Previous versions of FindCurses provided these values.
|
||||||
# FORCE must not be used since this would break builds which preload
|
if(NOT DEFINED CURSES_LIBRARY)
|
||||||
# however if the value of the variable has NOTFOUND in it, then
|
set(CURSES_LIBRARY "${CURSES_NCURSES_LIBRARY}")
|
||||||
# it is OK to force, and we need to force in order to have it work.
|
|
||||||
# a cache wqith these variables set
|
|
||||||
# only put ncurses include and library into
|
|
||||||
# variables if they are found
|
|
||||||
if(NOT CURSES_NCURSES_INCLUDE_PATH AND CURSES_HAVE_NCURSES_NCURSES_H)
|
|
||||||
get_filename_component(CURSES_NCURSES_INCLUDE_PATH
|
|
||||||
"${CURSES_HAVE_NCURSES_NCURSES_H}" PATH)
|
|
||||||
endif()
|
|
||||||
if(CURSES_NCURSES_INCLUDE_PATH AND CURSES_NCURSES_LIBRARY)
|
|
||||||
set( FORCE_IT )
|
|
||||||
if(CURSES_INCLUDE_PATH MATCHES NOTFOUND)
|
|
||||||
set(FORCE_IT FORCE)
|
|
||||||
endif()
|
|
||||||
set(CURSES_INCLUDE_PATH "${CURSES_NCURSES_INCLUDE_PATH}"
|
|
||||||
CACHE FILEPATH "The curses include path" ${FORCE_IT})
|
|
||||||
set( FORCE_IT)
|
|
||||||
if(CURSES_LIBRARY MATCHES NOTFOUND)
|
|
||||||
set(FORCE_IT FORCE)
|
|
||||||
endif()
|
|
||||||
set(CURSES_LIBRARY "${CURSES_NCURSES_LIBRARY}"
|
|
||||||
CACHE FILEPATH "The curses library" ${FORCE_IT})
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
CHECK_LIBRARY_EXISTS("${CURSES_NCURSES_LIBRARY}"
|
CHECK_LIBRARY_EXISTS("${CURSES_NCURSES_LIBRARY}"
|
||||||
|
@ -147,6 +130,52 @@ else()
|
||||||
CHECK_LIBRARY_EXISTS("${CURSES_EXTRA_LIBRARY}"
|
CHECK_LIBRARY_EXISTS("${CURSES_EXTRA_LIBRARY}"
|
||||||
cbreak "" CURSES_TINFO_HAS_CBREAK)
|
cbreak "" CURSES_TINFO_HAS_CBREAK)
|
||||||
endif()
|
endif()
|
||||||
|
else()
|
||||||
|
get_filename_component(_cursesLibDir "${CURSES_CURSES_LIBRARY}" PATH)
|
||||||
|
get_filename_component(_cursesParentDir "${_cursesLibDir}" PATH)
|
||||||
|
|
||||||
|
find_path(CURSES_INCLUDE_PATH
|
||||||
|
NAMES curses.h
|
||||||
|
HINTS "${_cursesParentDir}/include"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Previous versions of FindCurses provided these values.
|
||||||
|
if(NOT DEFINED CURSES_CURSES_H_PATH)
|
||||||
|
set(CURSES_CURSES_H_PATH "${CURSES_INCLUDE_PATH}")
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED CURSES_LIBRARY)
|
||||||
|
set(CURSES_LIBRARY "${CURSES_CURSES_LIBRARY}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Report whether each possible header name exists in the include directory.
|
||||||
|
if(NOT DEFINED CURSES_HAVE_NCURSES_NCURSES_H)
|
||||||
|
if(EXISTS "${CURSES_INCLUDE_PATH}/ncurses/ncurses.h")
|
||||||
|
set(CURSES_HAVE_NCURSES_NCURSES_H "${CURSES_INCLUDE_PATH}/ncurses/ncurses.h")
|
||||||
|
else()
|
||||||
|
set(CURSES_HAVE_NCURSES_NCURSES_H "CURSES_HAVE_NCURSES_NCURSES_H-NOTFOUND")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED CURSES_HAVE_NCURSES_CURSES_H)
|
||||||
|
if(EXISTS "${CURSES_INCLUDE_PATH}/ncurses/curses.h")
|
||||||
|
set(CURSES_HAVE_NCURSES_CURSES_H "${CURSES_INCLUDE_PATH}/ncurses/curses.h")
|
||||||
|
else()
|
||||||
|
set(CURSES_HAVE_NCURSES_CURSES_H "CURSES_HAVE_NCURSES_CURSES_H-NOTFOUND")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED CURSES_HAVE_NCURSES_H)
|
||||||
|
if(EXISTS "${CURSES_INCLUDE_PATH}/ncurses.h")
|
||||||
|
set(CURSES_HAVE_NCURSES_H "${CURSES_INCLUDE_PATH}/ncurses.h")
|
||||||
|
else()
|
||||||
|
set(CURSES_HAVE_NCURSES_H "CURSES_HAVE_NCURSES_H-NOTFOUND")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED CURSES_HAVE_CURSES_H)
|
||||||
|
if(EXISTS "${CURSES_INCLUDE_PATH}/curses.h")
|
||||||
|
set(CURSES_HAVE_CURSES_H "${CURSES_INCLUDE_PATH}/curses.h")
|
||||||
|
else()
|
||||||
|
set(CURSES_HAVE_CURSES_H "CURSES_HAVE_CURSES_H-NOTFOUND")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT CURSES_TINFO_HAS_CBREAK)
|
if (NOT CURSES_TINFO_HAS_CBREAK)
|
||||||
|
@ -157,11 +186,10 @@ endif()
|
||||||
find_library(CURSES_FORM_LIBRARY form HINTS "${_cursesLibDir}")
|
find_library(CURSES_FORM_LIBRARY form HINTS "${_cursesLibDir}")
|
||||||
find_library(CURSES_FORM_LIBRARY form )
|
find_library(CURSES_FORM_LIBRARY form )
|
||||||
|
|
||||||
# for compatibility with older FindCurses.cmake this has to be in the cache
|
# Previous versions of FindCurses provided these values.
|
||||||
# FORCE must not be used since this would break builds which preload a cache
|
if(NOT DEFINED FORM_LIBRARY)
|
||||||
# qith these variables set
|
set(FORM_LIBRARY "${CURSES_FORM_LIBRARY}")
|
||||||
set(FORM_LIBRARY "${CURSES_FORM_LIBRARY}"
|
endif()
|
||||||
CACHE FILEPATH "The curses form library")
|
|
||||||
|
|
||||||
# Need to provide the *_LIBRARIES
|
# Need to provide the *_LIBRARIES
|
||||||
set(CURSES_LIBRARIES ${CURSES_LIBRARY})
|
set(CURSES_LIBRARIES ${CURSES_LIBRARY})
|
||||||
|
@ -174,8 +202,9 @@ if(CURSES_FORM_LIBRARY)
|
||||||
set(CURSES_LIBRARIES ${CURSES_LIBRARIES} ${CURSES_FORM_LIBRARY})
|
set(CURSES_LIBRARIES ${CURSES_LIBRARIES} ${CURSES_FORM_LIBRARY})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Proper name is *_INCLUDE_DIR
|
# Provide the *_INCLUDE_DIRS result.
|
||||||
set(CURSES_INCLUDE_DIR ${CURSES_INCLUDE_PATH})
|
set(CURSES_INCLUDE_DIRS ${CURSES_INCLUDE_PATH})
|
||||||
|
set(CURSES_INCLUDE_DIR ${CURSES_INCLUDE_PATH}) # compatibility
|
||||||
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set CURSES_FOUND to TRUE if
|
# handle the QUIETLY and REQUIRED arguments and set CURSES_FOUND to TRUE if
|
||||||
# all listed variables are TRUE
|
# all listed variables are TRUE
|
||||||
|
@ -185,17 +214,7 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(Curses DEFAULT_MSG
|
||||||
|
|
||||||
mark_as_advanced(
|
mark_as_advanced(
|
||||||
CURSES_INCLUDE_PATH
|
CURSES_INCLUDE_PATH
|
||||||
CURSES_LIBRARY
|
|
||||||
CURSES_CURSES_INCLUDE_PATH
|
|
||||||
CURSES_CURSES_LIBRARY
|
CURSES_CURSES_LIBRARY
|
||||||
CURSES_NCURSES_INCLUDE_PATH
|
|
||||||
CURSES_NCURSES_LIBRARY
|
CURSES_NCURSES_LIBRARY
|
||||||
CURSES_EXTRA_LIBRARY
|
CURSES_EXTRA_LIBRARY
|
||||||
FORM_LIBRARY
|
|
||||||
CURSES_LIBRARIES
|
|
||||||
CURSES_INCLUDE_DIR
|
|
||||||
CURSES_CURSES_HAS_WSYNCUP
|
|
||||||
CURSES_NCURSES_HAS_WSYNCUP
|
|
||||||
CURSES_NCURSES_HAS_CBREAK
|
|
||||||
CURSES_TINFO_HAS_CBREAK
|
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue