1
0

CheckSymbolExists.cmake 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # - Check if the symbol exists in include files
  2. # CHECK_SYMBOL_EXISTS(SYMBOL FILES VARIABLE)
  3. #
  4. # SYMBOL - symbol
  5. # FILES - include files to check
  6. # VARIABLE - variable to return result
  7. #
  8. # If CMAKE_REQUIRED_FLAGS is set then those flags will be passed into the
  9. # compile of the program likewise if CMAKE_REQUIRED_LIBRARIES is set then
  10. # those libraries will be linked against the test program
  11. MACRO(CHECK_SYMBOL_EXISTS SYMBOL FILES VARIABLE)
  12. IF("${VARIABLE}" MATCHES "^${VARIABLE}$")
  13. SET(CHECK_SYMBOL_EXISTS_CONTENT "/* */\n")
  14. SET(MACRO_CHECK_SYMBOL_EXISTS_FLAGS ${CMAKE_REQUIRED_FLAGS})
  15. IF(CMAKE_REQUIRED_LIBRARIES)
  16. SET(CHECK_SYMBOL_EXISTS_LIBS
  17. "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
  18. ENDIF(CMAKE_REQUIRED_LIBRARIES)
  19. FOREACH(FILE ${FILES})
  20. SET(CHECK_SYMBOL_EXISTS_CONTENT
  21. "${CHECK_SYMBOL_EXISTS_CONTENT}#include <${FILE}>\n")
  22. ENDFOREACH(FILE)
  23. SET(CHECK_SYMBOL_EXISTS_CONTENT
  24. "${CHECK_SYMBOL_EXISTS_CONTENT}\nvoid cmakeRequireSymbol(int dummy,...){(void)dummy;}\nint main()\n{\n#ifndef ${SYMBOL}\n cmakeRequireSymbol(0,&${SYMBOL});\n#endif\n return 0;\n}\n")
  25. FILE(WRITE ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/CheckSymbolExists.c
  26. "${CHECK_SYMBOL_EXISTS_CONTENT}")
  27. MESSAGE(STATUS "Looking for ${SYMBOL}")
  28. TRY_COMPILE(${VARIABLE}
  29. ${CMAKE_BINARY_DIR}
  30. ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/CheckSymbolExists.c
  31. CMAKE_FLAGS
  32. -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_SYMBOL_EXISTS_FLAGS}
  33. "${CHECK_SYMBOL_EXISTS_LIBS}"
  34. OUTPUT_VARIABLE OUTPUT)
  35. IF(${VARIABLE})
  36. MESSAGE(STATUS "Looking for ${SYMBOL} - found")
  37. SET(${VARIABLE} 1 CACHE INTERNAL "Have symbol ${SYMBOL}")
  38. FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeOutput.log
  39. "Determining if the ${SYMBOL} "
  40. "exist passed with the following output:\n"
  41. "${OUTPUT}\nFile ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/CheckSymbolExists.c:\n"
  42. "${CHECK_SYMBOL_EXISTS_CONTENT}\n")
  43. ELSE(${VARIABLE})
  44. MESSAGE(STATUS "Looking for ${SYMBOL} - not found.")
  45. SET(${VARIABLE} "" CACHE INTERNAL "Have symbol ${SYMBOL}")
  46. FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log
  47. "Determining if the ${SYMBOL} "
  48. "exist failed with the following output:\n"
  49. "${OUTPUT}\nFile ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/CheckSymbolExists.c:\n"
  50. "${CHECK_SYMBOL_EXISTS_CONTENT}\n")
  51. ENDIF(${VARIABLE})
  52. ENDIF("${VARIABLE}" MATCHES "^${VARIABLE}$")
  53. ENDMACRO(CHECK_SYMBOL_EXISTS)