This is a bit complex. When compiling string.h with g++, glibc-2.9
defines two prototypes for strcasestr, a const one and a non-const one.

This makes the check_function_exists fail because it tries to compile code that
says "&strcasestr" -- which is ambiguous because of the overload.

Some have said this is a cmake bug and it should be fixed in cmake so that it 
doesn't
take the address of the function but does something more close to what autoconf 
did.

Not knowing the reasons for the cmake implementation, I chose a simpler 
approach:
since string.h defines __CORRECT_ISO_CPP_STRING_H_PROTO when it defines
both versions of strcasestr, we can just check for that. Not as easy as it 
sounds though,
because check_symbol_exists runs gcc and not g++ (in which case string.h doesn't
do all that magic, it's in #ifdef __cplusplus).

So I had to fork check_symbol_exists into a check_cxx_symbol_exists which uses 
a .cxx
extension instead of a .c extension.

cmake guys: could check_symbol_exists take an option for the extension to use, 
maybe?

Meanwhile, ok with this patch for kdelibs?

-- 
David Faure, [email protected], sponsored by Qt Software @ Nokia to work on KDE,
Konqueror (http://www.konqueror.org), and KOffice (http://www.koffice.org).
Index: ConfigureChecks.cmake
===================================================================
--- ConfigureChecks.cmake	(revision 958316)
+++ ConfigureChecks.cmake	(working copy)
@@ -6,6 +6,7 @@
 include(CheckIncludeFile)
 include(CheckIncludeFiles)
 include(CheckSymbolExists)
+include(CheckCXXSymbolExists)
 include(CheckFunctionExists)
 include(CheckLibraryExists)
 include(CheckPrototypeExists)
@@ -232,7 +233,15 @@
 check_function_exists(random     HAVE_RANDOM)            # kdecore/fakes.c
 check_function_exists(strlcpy    HAVE_STRLCPY)           # kdecore/fakes.c
 check_function_exists(strlcat    HAVE_STRLCAT)           # kdecore/fakes.c
-check_function_exists(strcasestr HAVE_STRCASESTR)        # kdecore/fakes.c
+check_cxx_symbol_exists(__CORRECT_ISO_CPP_STRING_H_PROTO "string.h" HAVE_STRCASESTR_OVERLOAD) # glibc-2.9 strangeness
+if (HAVE_STRCASESTR_OVERLOAD)
+  message(STATUS "string.h defines __CORRECT_ISO_CPP_STRING_H_PROTO")
+  set(HAVE_STRCASESTR 1)
+  set(HAVE_STRCASESTR_PROTO 1)
+else()
+  check_function_exists(strcasestr HAVE_STRCASESTR)        # kdecore/fakes.c
+  check_prototype_exists(strcasestr string.h          HAVE_STRCASESTR_PROTO)
+endif()
 check_function_exists(setenv     HAVE_SETENV)            # kdecore/fakes.c
 check_function_exists(seteuid    HAVE_SETEUID)           # kdecore/fakes.c
 check_function_exists(setmntent  HAVE_SETMNTENT)         # solid, kio, kdecore
@@ -245,7 +254,6 @@
 check_prototype_exists(mkdtemp "stdlib.h;unistd.h"  HAVE_MKDTEMP_PROTO)
 check_prototype_exists(mkstemp "stdlib.h;unistd.h"  HAVE_MKSTEMP_PROTO)
 check_prototype_exists(strlcat string.h             HAVE_STRLCAT_PROTO)
-check_prototype_exists(strcasestr string.h          HAVE_STRCASESTR_PROTO)
 check_prototype_exists(strlcpy string.h             HAVE_STRLCPY_PROTO)
 check_prototype_exists(random stdlib.h              HAVE_RANDOM_PROTO)
 check_prototype_exists(res_init "sys/types.h;netinet/in.h;arpa/nameser.h;resolv.h" HAVE_RES_INIT_PROTO)
# - Check if the symbol exists in include files, in C++ mode
# Forked off cmake's CheckSymbolExists.cmake
# CHECK_CXX_SYMBOL_EXISTS(SYMBOL FILES VARIABLE)
#
#  SYMBOL   - symbol
#  FILES    - include files to check
#  VARIABLE - variable to return result
#
# The following variables may be set before calling this macro to
# modify the way the check is run:
#
#  CMAKE_REQUIRED_FLAGS = string of compile command line flags
#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
#  CMAKE_REQUIRED_INCLUDES = list of include directories
#  CMAKE_REQUIRED_LIBRARIES = list of libraries to link

MACRO(CHECK_CXX_SYMBOL_EXISTS SYMBOL FILES VARIABLE)
  IF("${VARIABLE}" MATCHES "^${VARIABLE}$")
    SET(CMAKE_CONFIGURABLE_FILE_CONTENT "/* */\n")
    SET(MACRO_CHECK_SYMBOL_EXISTS_FLAGS ${CMAKE_REQUIRED_FLAGS})
    IF(CMAKE_REQUIRED_LIBRARIES)
      SET(CHECK_SYMBOL_EXISTS_LIBS 
        "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
    ELSE(CMAKE_REQUIRED_LIBRARIES)
      SET(CHECK_SYMBOL_EXISTS_LIBS)
    ENDIF(CMAKE_REQUIRED_LIBRARIES)
    IF(CMAKE_REQUIRED_INCLUDES)
      SET(CMAKE_SYMBOL_EXISTS_INCLUDES
        "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
    ELSE(CMAKE_REQUIRED_INCLUDES)
      SET(CMAKE_SYMBOL_EXISTS_INCLUDES)
    ENDIF(CMAKE_REQUIRED_INCLUDES)
    FOREACH(FILE ${FILES})
      SET(CMAKE_CONFIGURABLE_FILE_CONTENT
        "${CMAKE_CONFIGURABLE_FILE_CONTENT}#include <${FILE}>\n")
    ENDFOREACH(FILE)
    SET(CMAKE_CONFIGURABLE_FILE_CONTENT
      "${CMAKE_CONFIGURABLE_FILE_CONTENT}\nvoid cmakeRequireSymbol(int dummy,...){(void)dummy;}\nint main()\n{\n#ifndef ${SYMBOL}\n  cmakeRequireSymbol(0,&${SYMBOL});\n#endif\n  return 0;\n}\n")

    CONFIGURE_FILE("${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in"
      "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.cxx" @ONLY)

    MESSAGE(STATUS "Looking for ${SYMBOL}")
    TRY_COMPILE(${VARIABLE}
      ${CMAKE_BINARY_DIR}
      ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.cxx
      COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
      CMAKE_FLAGS 
      -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_SYMBOL_EXISTS_FLAGS}
      "${CHECK_SYMBOL_EXISTS_LIBS}"
      "${CMAKE_SYMBOL_EXISTS_INCLUDES}"
      OUTPUT_VARIABLE OUTPUT)
    IF(${VARIABLE})
      MESSAGE(STATUS "Looking for ${SYMBOL} - found")
      SET(${VARIABLE} 1 CACHE INTERNAL "Have symbol ${SYMBOL}")
      FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log 
        "Determining if the ${SYMBOL} "
        "exist passed with the following output:\n"
        "${OUTPUT}\nFile ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.cxx:\n"
        "${CMAKE_CONFIGURABLE_FILE_CONTENT}\n")
    ELSE(${VARIABLE})
      MESSAGE(STATUS "Looking for ${SYMBOL} - not found.")
      SET(${VARIABLE} "" CACHE INTERNAL "Have symbol ${SYMBOL}")
      FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log 
        "Determining if the ${SYMBOL} "
        "exist failed with the following output:\n"
        "${OUTPUT}\nFile ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckSymbolExists.cxx:\n"
        "${CMAKE_CONFIGURABLE_FILE_CONTENT}\n")
    ENDIF(${VARIABLE})
  ENDIF("${VARIABLE}" MATCHES "^${VARIABLE}$")
ENDMACRO(CHECK_CXX_SYMBOL_EXISTS)
_______________________________________________
Kde-buildsystem mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/kde-buildsystem

Reply via email to