CheckPrototypeDefinition.cmake 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. # - Check if the protoype we expect is correct.
  2. # check_prototype_definition(FUNCTION PROTOTYPE RETURN HEADER VARIABLE)
  3. # FUNCTION - The name of the function (used to check if prototype exists)
  4. # PROTOTYPE- The prototype to check.
  5. # RETURN - The return value of the function.
  6. # HEADER - The header files required.
  7. # VARIABLE - The variable to store the result.
  8. # Example:
  9. # check_prototype_definition(getpwent_r
  10. # "struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)"
  11. # "NULL"
  12. # "unistd.h;pwd.h"
  13. # SOLARIS_GETPWENT_R)
  14. # The following variables may be set before calling this macro to
  15. # modify the way the check is run:
  16. #
  17. # CMAKE_REQUIRED_FLAGS = string of compile command line flags
  18. # CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
  19. # CMAKE_REQUIRED_INCLUDES = list of include directories
  20. # CMAKE_REQUIRED_LIBRARIES = list of libraries to link
  21. #=============================================================================
  22. # Copyright 2005-2009 Kitware, Inc.
  23. # Copyright 2010-2011 Andreas Schneider <[email protected]>
  24. #
  25. # Distributed under the OSI-approved BSD License (the "License");
  26. # see accompanying file Copyright.txt for details.
  27. #
  28. # This software is distributed WITHOUT ANY WARRANTY; without even the
  29. # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  30. # See the License for more information.
  31. #=============================================================================
  32. # (To distribute this file outside of CMake, substitute the full
  33. # License text for the above reference.)
  34. #
  35. get_filename_component(__check_proto_def_dir "${CMAKE_CURRENT_LIST_FILE}" PATH)
  36. function(CHECK_PROTOTYPE_DEFINITION _FUNCTION _PROTOTYPE _RETURN _HEADER _VARIABLE)
  37. if ("${_VARIABLE}" MATCHES "^${_VARIABLE}$")
  38. set(CHECK_PROTOTYPE_DEFINITION_CONTENT "/* */\n")
  39. set(CHECK_PROTOTYPE_DEFINITION_FLAGS ${CMAKE_REQUIRED_FLAGS})
  40. if (CMAKE_REQUIRED_LIBRARIES)
  41. set(CHECK_PROTOTYPE_DEFINITION_LIBS
  42. LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
  43. else()
  44. set(CHECK_PROTOTYPE_DEFINITION_LIBS)
  45. endif()
  46. if (CMAKE_REQUIRED_INCLUDES)
  47. set(CMAKE_SYMBOL_EXISTS_INCLUDES
  48. "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
  49. else()
  50. set(CMAKE_SYMBOL_EXISTS_INCLUDES)
  51. endif()
  52. foreach(_FILE ${_HEADER})
  53. set(CHECK_PROTOTYPE_DEFINITION_HEADER
  54. "${CHECK_PROTOTYPE_DEFINITION_HEADER}#include <${_FILE}>\n")
  55. endforeach()
  56. set(CHECK_PROTOTYPE_DEFINITION_SYMBOL ${_FUNCTION})
  57. set(CHECK_PROTOTYPE_DEFINITION_PROTO ${_PROTOTYPE})
  58. set(CHECK_PROTOTYPE_DEFINITION_RETURN ${_RETURN})
  59. configure_file("${__check_proto_def_dir}/CheckPrototypeDefinition.c.in"
  60. "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c" @ONLY)
  61. file(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c _SOURCE)
  62. try_compile(${_VARIABLE}
  63. ${CMAKE_BINARY_DIR}
  64. ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c
  65. COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
  66. ${CHECK_PROTOTYPE_DEFINITION_LIBS}
  67. CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CHECK_PROTOTYPE_DEFINITION_FLAGS}
  68. "${CMAKE_SYMBOL_EXISTS_INCLUDES}"
  69. OUTPUT_VARIABLE OUTPUT)
  70. if (${_VARIABLE})
  71. set(${_VARIABLE} 1 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
  72. message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - True")
  73. file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
  74. "Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} passed with the following output:\n"
  75. "${OUTPUT}\n\n")
  76. else ()
  77. message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - False")
  78. set(${_VARIABLE} 0 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
  79. file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
  80. "Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} failed with the following output:\n"
  81. "${OUTPUT}\n\n${_SOURCE}\n\n")
  82. endif ()
  83. endif()
  84. endfunction()