diff options
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/CheckLinkerFlag.c | 14 | ||||
-rw-r--r-- | cmake/CheckLinkerFlag.cmake | 47 | ||||
-rw-r--r-- | cmake/FindReadline.cmake | 55 |
3 files changed, 96 insertions, 20 deletions
diff --git a/cmake/CheckLinkerFlag.c b/cmake/CheckLinkerFlag.c new file mode 100644 index 000000000..a0dcc168d --- /dev/null +++ b/cmake/CheckLinkerFlag.c @@ -0,0 +1,14 @@ +#ifdef __CLASSIC_C__ +int main() +{ + int ac; + char* av[]; +#else +int main(int ac, char* av[]) +{ +#endif + if (ac > 1000) { + return *av[0]; + } + return 0; +} diff --git a/cmake/CheckLinkerFlag.cmake b/cmake/CheckLinkerFlag.cmake new file mode 100644 index 000000000..a3879d0be --- /dev/null +++ b/cmake/CheckLinkerFlag.cmake @@ -0,0 +1,47 @@ +include(CheckCCompilerFlag) + +macro(CHECK_LINKER_FLAG flag VARIABLE) + if(NOT DEFINED "${VARIABLE}") + if(NOT CMAKE_REQUIRED_QUIET) + message(STATUS "Looking for ${flag} linker flag") + endif() + + set(_cle_source ${CMAKE_SOURCE_DIR}/cmake/CheckLinkerFlag.c) + + set(saved_CMAKE_C_FLAGS ${CMAKE_C_FLAGS}) + set(CMAKE_C_FLAGS "${flag}") + try_compile(${VARIABLE} + ${CMAKE_BINARY_DIR} + ${_cle_source} + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} ${flag} + CMAKE_FLAGS + OUTPUT_VARIABLE OUTPUT) + unset(_cle_source) + set(CMAKE_C_FLAGS ${saved_CMAKE_C_FLAGS}) + unset(saved_CMAKE_C_FLAGS) + + if ("${OUTPUT}" MATCHES "warning.*ignored") + set(${VARIABLE} 0) + endif() + + if(${VARIABLE}) + if(NOT CMAKE_REQUIRED_QUIET) + message(STATUS "Looking for ${flag} linker flag - found") + endif() + set(${VARIABLE} 1 CACHE INTERNAL "Have linker flag ${flag}") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Determining if the ${flag} linker flag is supported " + "passed with the following output:\n" + "${OUTPUT}\n\n") + else() + if(NOT CMAKE_REQUIRED_QUIET) + message(STATUS "Looking for ${flag} linker flag - not found") + endif() + set(${VARIABLE} "" CACHE INTERNAL "Have linker flag ${flag}") + file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if the ${flag} linker flag is suppored " + "failed with the following output:\n" + "${OUTPUT}\n\n") + endif() + endif() +endmacro() diff --git a/cmake/FindReadline.cmake b/cmake/FindReadline.cmake index cdce0bfca..87f8ccace 100644 --- a/cmake/FindReadline.cmake +++ b/cmake/FindReadline.cmake @@ -15,8 +15,11 @@ # # READLINE_FOUND System has readline, include and lib dirs found # GNU_READLINE_FOUND Version of readline found is GNU readline, not libedit! +# LIBEDIT_FOUND Version of readline found is libedit, not GNU readline! # Readline_INCLUDE_DIR The readline include directories. # Readline_LIBRARY The readline library. +# GNU_READLINE_LIBRARY The GNU readline library or empty string. +# LIBEDIT_LIBRARY The libedit library or empty string. find_path(Readline_ROOT_DIR NAMES include/readline/readline.h @@ -36,14 +39,18 @@ find_library(Readline_LIBRARY NO_DEFAULT_PATH ) -if(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY) +find_library(Termcap_LIBRARY + NAMES tinfo termcap ncursesw ncurses cursesw curses +) + +if(Readline_INCLUDE_DIR AND Readline_LIBRARY) set(READLINE_FOUND TRUE) -else(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY) +else(Readline_INCLUDE_DIR AND Readline_LIBRARY) FIND_LIBRARY(Readline_LIBRARY NAMES readline PATHS Readline_ROOT_DIR) include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Readline DEFAULT_MSG Readline_INCLUDE_DIR Readline_LIBRARY ) MARK_AS_ADVANCED(Readline_INCLUDE_DIR Readline_LIBRARY) -endif(Readline_INCLUDE_DIR AND Readline_LIBRARY AND Ncurses_LIBRARY) +endif(Readline_INCLUDE_DIR AND Readline_LIBRARY) mark_as_advanced( Readline_ROOT_DIR @@ -53,22 +60,30 @@ mark_as_advanced( set(CMAKE_REQUIRED_INCLUDES ${Readline_INCLUDE_DIR}) set(CMAKE_REQUIRED_LIBRARIES ${Readline_LIBRARY}) -INCLUDE(CheckCXXSourceCompiles) -CHECK_CXX_SOURCE_COMPILES( -" -#include <stdio.h> -#include <readline/readline.h> -int -main() -{ - char * s = rl_copy_text(0, 0); -} -" GNU_READLINE_FOUND) -if(NOT Readline_LIBRARY) - set(Readline_LIBRARY "") -endif() +include(CheckFunctionExists) +check_function_exists(rl_copy_text HAVE_COPY_TEXT) +check_function_exists(rl_filename_completion_function HAVE_COMPLETION_FUNCTION) + +if(NOT HAVE_COMPLETION_FUNCTION) + set(CMAKE_REQUIRED_LIBRARIES ${Readline_LIBRARY} ${Termcap_LIBRARY}) + check_function_exists(rl_copy_text HAVE_COPY_TEXT_TC) + check_function_exists(rl_filename_completion_function HAVE_COMPLETION_FUNCTION_TC) + set(HAVE_COMPLETION_FUNCTION ${HAVE_COMPLETION_FUNCTION_TC}) + set(HAVE_COPY_TEXT ${HAVE_COPY_TEXT_TC}) + if(HAVE_COMPLETION_FUNCTION) + set(Readline_LIBRARY ${Readline_LIBRARY} ${Termcap_LIBRARY}) + endif(HAVE_COMPLETION_FUNCTION) +endif(NOT HAVE_COMPLETION_FUNCTION) + +set(LIBEDIT_LIBRARY "") +set(GNU_READLINE_LIBRARY "") + +if(HAVE_COMPLETION_FUNCTION AND HAVE_COPY_TEXT) + set(GNU_READLINE_FOUND TRUE) + set(GNU_READLINE_LIBRARY ${Readline_LIBRARY}) +elseif(READLINE_FOUND AND NOT HAVE_COPY_TEXT) + set(LIBEDIT_FOUND TRUE) + set(LIBEDIT_LIBRARY ${Readline_LIBRARY}) +endif(HAVE_COMPLETION_FUNCTION AND HAVE_COPY_TEXT) -if(Readline_LIBRARY AND OPENBSD) - list(APPEND EXTRA_LIBRARIES curses) -endif() |