summaryrefslogtreecommitdiff
path: root/lldb/cmake/modules/FindCursesAndPanel.cmake
blob: 8628059f91ba144788e1b05096a5b1c33ded2fa7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#.rst:
# FindCursesAndPanel
# -----------
#
# Find the curses, terminfo, and panel library as a whole.

include(CMakePushCheckState)

function(lldb_check_curses_tinfo CURSES_INCLUDE_DIRS CURSES_LIBRARIES CURSES_HAS_TINFO)
  cmake_reset_check_state()
  set(CMAKE_REQUIRED_INCLUDES "${CURSES_INCLUDE_DIRS}")
  set(CMAKE_REQUIRED_LIBRARIES "${CURSES_LIBRARIES}")
  # acs_map is one of many symbols that are part of tinfo but could
  # be bundled in curses.
  check_symbol_exists(acs_map "curses.h" CURSES_HAS_TINFO)
endfunction()

if(CURSES_INCLUDE_DIRS AND CURSES_LIBRARIES AND PANEL_LIBRARIES)
  if(NOT HAS_TERMINFO_SYMBOLS)
    lldb_check_curses_tinfo("${CURSES_INCLUDE_DIRS}"
                            "${CURSES_LIBRARIES}"
                            CURSES_HAS_TINFO)
    if(NOT CURSES_HAS_TINFO)
      message(WARNING "CURSES_LIBRARIES was provided manually but is missing terminfo symbols")
    endif()
    mark_as_advanced(CURSES_HAS_TINFO)
  endif()
  set(CURSESANDPANEL_FOUND TRUE)
else()
  find_package(Curses QUIET)
  find_library(PANEL_LIBRARIES NAMES panel DOC "The curses panel library" QUIET)
  include(FindPackageHandleStandardArgs)

  if(CURSES_FOUND AND PANEL_LIBRARIES)
    # Sometimes the curses libraries define their own terminfo symbols,
    # other times they're extern and are defined by a separate terminfo library.
    # Auto-detect which.
    lldb_check_curses_tinfo("${CURSES_INCLUDE_DIRS}"
                            "${CURSES_LIBRARIES}"
                            CURSES_HAS_TINFO)
    if(NOT CURSES_HAS_TINFO)
      message(STATUS "curses library missing terminfo symbols, looking for tinfo separately")
      find_library(TINFO_LIBRARIES NAMES tinfo DOC "The curses tinfo library" QUIET)
      list(APPEND CURSES_LIBRARIES "${TINFO_LIBRARIES}")
    endif()
    set(HAS_TERMINFO_SYMBOLS "$<OR:$<BOOL:${TERMINFO_LIBRARIES}>,$<BOOL:${CURSES_HAS_TINFO}>>")
  endif()

  find_package_handle_standard_args(CursesAndPanel
                                    FOUND_VAR
                                      CURSESANDPANEL_FOUND
                                    REQUIRED_VARS
                                      CURSES_INCLUDE_DIRS
                                      CURSES_LIBRARIES
                                      PANEL_LIBRARIES
                                      HAS_TERMINFO_SYMBOLS)

  if(CURSES_FOUND AND PANEL_LIBRARIES AND HAS_TERMINFO_SYMBOLS)
    mark_as_advanced(CURSES_INCLUDE_DIRS
                      PANEL_LIBRARIES
                      HAS_TERMINFO_SYMBOLS
                      CURSES_HAS_TINFO)
  endif()
  if(TINFO_LIBRARIES)
    mark_as_advanced(TINFO_LIBRARIES)
  endif()
endif()