1# Copyright (c) 2009, 2010 Sun Microsystems, Inc.
2# Use is subject to license terms.
3#
4# This program is free software; you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation; version 2 of the License.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program; if not, write to the Free Software
15# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1335  USA
16
17INCLUDE(CheckCXXSourceCompiles)
18
19MACRO (MYSQL_CHECK_MULTIBYTE)
20  CHECK_INCLUDE_FILE(wctype.h HAVE_WCTYPE_H)
21  CHECK_INCLUDE_FILE(wchar.h HAVE_WCHAR_H)
22  IF(HAVE_WCHAR_H)
23    SET(CMAKE_EXTRA_INCLUDE_FILES wchar.h)
24    CHECK_TYPE_SIZE(mbstate_t SIZEOF_MBSTATE_T)
25    SET(CMAKE_EXTRA_INCLUDE_FILES)
26    IF(SIZEOF_MBSTATE_T)
27      SET(HAVE_MBSTATE_T 1)
28    ENDIF()
29  ENDIF()
30
31  CHECK_FUNCTION_EXISTS(mbrlen HAVE_MBRLEN)
32  CHECK_FUNCTION_EXISTS(mbsrtowcs HAVE_MBSRTOWCS)
33  CHECK_FUNCTION_EXISTS(mbrtowc HAVE_MBRTOWC)
34  CHECK_FUNCTION_EXISTS(wcwidth HAVE_WCWIDTH)
35  CHECK_FUNCTION_EXISTS(iswlower HAVE_ISWLOWER)
36  CHECK_FUNCTION_EXISTS(iswupper HAVE_ISWUPPER)
37  CHECK_FUNCTION_EXISTS(towlower HAVE_TOWLOWER)
38  CHECK_FUNCTION_EXISTS(towupper HAVE_TOWUPPER)
39  CHECK_FUNCTION_EXISTS(iswctype HAVE_ISWCTYPE)
40
41  SET(CMAKE_EXTRA_INCLUDE_FILES wchar.h)
42  CHECK_TYPE_SIZE(wchar_t SIZEOF_WCHAR_T)
43  IF(SIZEOF_WCHAR_T)
44    SET(HAVE_WCHAR_T 1)
45  ENDIF()
46
47  SET(CMAKE_EXTRA_INCLUDE_FILES wctype.h)
48  CHECK_TYPE_SIZE(wctype_t SIZEOF_WCTYPE_T)
49  CHECK_TYPE_SIZE(wint_t SIZEOF_WINT_T)
50  SET(CMAKE_EXTRA_INCLUDE_FILES)
51
52ENDMACRO()
53
54MACRO (FIND_CURSES)
55 FIND_PACKAGE(Curses REQUIRED)
56 MARK_AS_ADVANCED(CURSES_CURSES_H_PATH CURSES_FORM_LIBRARY CURSES_HAVE_CURSES_H)
57 IF(NOT CURSES_FOUND)
58   SET(ERRORMSG "Curses library not found. Please install appropriate package,
59    remove CMakeCache.txt and rerun cmake.")
60   IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
61    SET(ERRORMSG ${ERRORMSG}
62    "On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates "
63    "it is ncurses-devel.")
64   ENDIF()
65   MESSAGE(FATAL_ERROR ${ERRORMSG})
66 ENDIF()
67
68 IF(CURSES_HAVE_CURSES_H)
69   SET(HAVE_CURSES_H 1 CACHE INTERNAL "")
70 ENDIF()
71 IF(CMAKE_SYSTEM_NAME MATCHES "HP")
72   # CMake uses full path to library /lib/libcurses.sl
73   # On Itanium, it results into architecture mismatch+
74   # the library is for  PA-RISC
75   SET(CURSES_LIBRARY "curses" CACHE INTERNAL "" FORCE)
76 ENDIF()
77
78 IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
79   # -Wl,--as-needed breaks linking with -lcurses, e.g on Fedora
80   # Lower-level libcurses calls are exposed by libtinfo
81   CHECK_LIBRARY_EXISTS(${CURSES_LIBRARY} tputs "" HAVE_TPUTS_IN_CURSES)
82   IF(NOT HAVE_TPUTS_IN_CURSES)
83     CHECK_LIBRARY_EXISTS(tinfo tputs "" HAVE_TPUTS_IN_TINFO)
84     IF(HAVE_TPUTS_IN_TINFO)
85       SET(CURSES_LIBRARY tinfo)
86     ENDIF()
87   ENDIF()
88 ENDIF()
89 CHECK_LIBRARY_EXISTS(${CURSES_LIBRARY} setupterm "" HAVE_SETUPTERM)
90 CHECK_LIBRARY_EXISTS(${CURSES_LIBRARY} vidattr "" HAVE_VIDATTR)
91ENDMACRO()
92
93MACRO (MYSQL_USE_BUNDLED_READLINE)
94  SET(USE_NEW_READLINE_INTERFACE 1)
95  SET(HAVE_HIST_ENTRY 0 CACHE INTERNAL "" FORCE)
96  SET(MY_READLINE_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/extra/readline)
97  SET(MY_READLINE_LIBRARY readline)
98  ADD_SUBDIRECTORY(${CMAKE_SOURCE_DIR}/extra/readline)
99ENDMACRO()
100
101MACRO (MYSQL_FIND_SYSTEM_READLINE)
102
103  FIND_PATH(READLINE_INCLUDE_DIR readline.h PATH_SUFFIXES readline)
104  FIND_LIBRARY(READLINE_LIBRARY NAMES readline)
105  MARK_AS_ADVANCED(READLINE_INCLUDE_DIR READLINE_LIBRARY)
106
107  IF(READLINE_LIBRARY AND READLINE_INCLUDE_DIR)
108    SET(CMAKE_REQUIRED_LIBRARIES ${READLINE_LIBRARY} ${CURSES_LIBRARY})
109    SET(CMAKE_REQUIRED_INCLUDES ${READLINE_INCLUDE_DIR})
110    CHECK_CXX_SOURCE_COMPILES("
111    #include <stdio.h>
112    #include <readline.h>
113    int main(int argc, char **argv)
114    {
115      rl_completion_func_t *func1= (rl_completion_func_t*)0;
116      rl_compentry_func_t *func2= (rl_compentry_func_t*)0;
117    }"
118    NEW_READLINE_INTERFACE)
119
120    CHECK_C_SOURCE_COMPILES("
121    #include <stdio.h>
122    #include <readline.h>
123    #if RL_VERSION_MAJOR > 5
124    #error
125    #endif
126    int main(int argc, char **argv)
127    {
128      return 0;
129    }"
130    READLINE_V5)
131
132    IF(NEW_READLINE_INTERFACE)
133      IF (READLINE_V5)
134        SET(USE_NEW_READLINE_INTERFACE 1)
135      ELSE()
136        IF(NOT_FOR_DISTRIBUTION)
137          SET(NON_DISTRIBUTABLE_WARNING "GPLv3" CACHE INTERNAL "")
138          SET(USE_NEW_READLINE_INTERFACE 1)
139        ELSE()
140          SET(USE_NEW_READLINE_INTERFACE 0)
141        ENDIF(NOT_FOR_DISTRIBUTION)
142      ENDIF(READLINE_V5)
143    ENDIF(NEW_READLINE_INTERFACE)
144  ENDIF()
145ENDMACRO()
146
147MACRO (MYSQL_FIND_SYSTEM_LIBEDIT)
148  FIND_PATH(LIBEDIT_INCLUDE_DIR readline.h PATH_SUFFIXES editline edit/readline)
149  FIND_LIBRARY(LIBEDIT_LIBRARY edit)
150  MARK_AS_ADVANCED(LIBEDIT_INCLUDE_DIR LIBEDIT_LIBRARY)
151
152  IF(LIBEDIT_LIBRARY AND LIBEDIT_INCLUDE_DIR)
153    SET(CMAKE_REQUIRED_LIBRARIES ${LIBEDIT_LIBRARY})
154    SET(CMAKE_REQUIRED_INCLUDES ${LIBEDIT_INCLUDE_DIR})
155    CHECK_CXX_SOURCE_COMPILES("
156    #include <stdio.h>
157    #include <readline.h>
158    int main(int argc, char **argv)
159    {
160      int res= (*rl_completion_entry_function)(0,0);
161      completion_matches(0,0);
162    }"
163    LIBEDIT_HAVE_COMPLETION_INT)
164
165    CHECK_CXX_SOURCE_COMPILES("
166    #include <stdio.h>
167    #include <readline.h>
168    int main(int argc, char **argv)
169    {
170      char res= *(*rl_completion_entry_function)(0,0);
171      completion_matches(0,0);
172    }"
173    LIBEDIT_HAVE_COMPLETION_CHAR)
174    IF(LIBEDIT_HAVE_COMPLETION_INT OR LIBEDIT_HAVE_COMPLETION_CHAR)
175      SET(USE_LIBEDIT_INTERFACE 1)
176    ENDIF()
177  ENDIF()
178ENDMACRO()
179
180
181MACRO (MYSQL_CHECK_READLINE)
182  IF (NOT WIN32)
183    MYSQL_CHECK_MULTIBYTE()
184    SET(WITH_READLINE OFF CACHE BOOL "Use bundled readline")
185    FIND_CURSES()
186
187    IF(WITH_READLINE)
188      MYSQL_USE_BUNDLED_READLINE()
189    ELSE()
190      # OSX includes incompatible readline lib
191      IF (NOT APPLE)
192        MYSQL_FIND_SYSTEM_READLINE()
193      ENDIF()
194      IF(USE_NEW_READLINE_INTERFACE)
195        SET(MY_READLINE_INCLUDE_DIR ${READLINE_INCLUDE_DIR})
196        SET(MY_READLINE_LIBRARY ${READLINE_LIBRARY} ${CURSES_LIBRARY})
197      ELSE()
198        MYSQL_FIND_SYSTEM_LIBEDIT()
199        IF(USE_LIBEDIT_INTERFACE)
200          SET(MY_READLINE_INCLUDE_DIR ${LIBEDIT_INCLUDE_DIR})
201          SET(MY_READLINE_LIBRARY ${LIBEDIT_LIBRARY} ${CURSES_LIBRARY})
202          SET(USE_NEW_READLINE_INTERFACE ${LIBEDIT_HAVE_COMPLETION_CHAR})
203        ELSE()
204          MYSQL_USE_BUNDLED_READLINE()
205        ENDIF()
206      ENDIF()
207    ENDIF()
208
209    SET(CMAKE_REQUIRED_LIBRARIES ${MY_READLINE_LIBRARY})
210    SET(CMAKE_REQUIRED_INCLUDES ${MY_READLINE_INCLUDE_DIR})
211    CHECK_CXX_SOURCE_COMPILES("
212    #include <stdio.h>
213    #include <readline.h>
214    int main(int argc, char **argv)
215    {
216       HIST_ENTRY entry;
217       return 0;
218    }"
219    HAVE_HIST_ENTRY)
220    SET(CMAKE_REQUIRED_LIBRARIES)
221    SET(CMAKE_REQUIRED_INCLUDES)
222  ENDIF(NOT WIN32)
223  CHECK_INCLUDE_FILES ("curses.h;term.h" HAVE_TERM_H)
224ENDMACRO()
225
226