diff options
| -rw-r--r-- | modules/CheckCXXSymbolExists.cmake | 71 | 
1 files changed, 71 insertions, 0 deletions
| diff --git a/modules/CheckCXXSymbolExists.cmake b/modules/CheckCXXSymbolExists.cmake new file mode 100644 index 00000000..f309fb0a --- /dev/null +++ b/modules/CheckCXXSymbolExists.cmake @@ -0,0 +1,71 @@ +# - 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) | 
