1*e415196aSJoakim Soderberg# - Check if the protoype we expect is correct. 2*e415196aSJoakim Soderberg# check_prototype_definition(FUNCTION PROTOTYPE RETURN HEADER VARIABLE) 3*e415196aSJoakim Soderberg# 4*e415196aSJoakim Soderberg# FUNCTION - The name of the function (used to check if prototype exists) 5*e415196aSJoakim Soderberg# PROTOTYPE- The prototype to check. 6*e415196aSJoakim Soderberg# RETURN - The return value of the function. 7*e415196aSJoakim Soderberg# HEADER - The header files required. 8*e415196aSJoakim Soderberg# VARIABLE - The variable to store the result. 9*e415196aSJoakim Soderberg# 10*e415196aSJoakim Soderberg# Example: 11*e415196aSJoakim Soderberg# 12*e415196aSJoakim Soderberg# check_prototype_definition(getpwent_r 13*e415196aSJoakim Soderberg# "struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)" 14*e415196aSJoakim Soderberg# "NULL" 15*e415196aSJoakim Soderberg# "unistd.h;pwd.h" 16*e415196aSJoakim Soderberg# SOLARIS_GETPWENT_R) 17*e415196aSJoakim Soderberg# 18*e415196aSJoakim Soderberg# The following variables may be set before calling this macro to 19*e415196aSJoakim Soderberg# modify the way the check is run: 20*e415196aSJoakim Soderberg# 21*e415196aSJoakim Soderberg# CMAKE_REQUIRED_FLAGS = string of compile command line flags 22*e415196aSJoakim Soderberg# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) 23*e415196aSJoakim Soderberg# CMAKE_REQUIRED_INCLUDES = list of include directories 24*e415196aSJoakim Soderberg# CMAKE_REQUIRED_LIBRARIES = list of libraries to link 25*e415196aSJoakim Soderberg 26*e415196aSJoakim Soderberg 27*e415196aSJoakim Soderbergfunction(CHECK_PROTOTYPE_DEFINITION _FUNCTION _PROTOTYPE _RETURN _HEADER _VARIABLE) 28*e415196aSJoakim Soderberg 29*e415196aSJoakim Soderberg if ("${_VARIABLE}" MATCHES "^${_VARIABLE}$") 30*e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_CONTENT "/* */\n") 31*e415196aSJoakim Soderberg 32*e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_FLAGS ${CMAKE_REQUIRED_FLAGS}) 33*e415196aSJoakim Soderberg if (CMAKE_REQUIRED_LIBRARIES) 34*e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_LIBS 35*e415196aSJoakim Soderberg "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") 36*e415196aSJoakim Soderberg else(CMAKE_REQUIRED_LIBRARIES) 37*e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_LIBS) 38*e415196aSJoakim Soderberg endif(CMAKE_REQUIRED_LIBRARIES) 39*e415196aSJoakim Soderberg if (CMAKE_REQUIRED_INCLUDES) 40*e415196aSJoakim Soderberg set(CMAKE_SYMBOL_EXISTS_INCLUDES 41*e415196aSJoakim Soderberg "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}") 42*e415196aSJoakim Soderberg else(CMAKE_REQUIRED_INCLUDES) 43*e415196aSJoakim Soderberg set(CMAKE_SYMBOL_EXISTS_INCLUDES) 44*e415196aSJoakim Soderberg endif(CMAKE_REQUIRED_INCLUDES) 45*e415196aSJoakim Soderberg 46*e415196aSJoakim Soderberg foreach(_FILE ${_HEADER}) 47*e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_HEADER 48*e415196aSJoakim Soderberg "${CHECK_PROTOTYPE_DEFINITION_HEADER}#include <${_FILE}>\n") 49*e415196aSJoakim Soderberg endforeach(_FILE) 50*e415196aSJoakim Soderberg 51*e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_SYMBOL ${_FUNCTION}) 52*e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_PROTO ${_PROTOTYPE}) 53*e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_RETURN ${_RETURN}) 54*e415196aSJoakim Soderberg 55*e415196aSJoakim Soderberg #configure_file("${CMAKE_ROOT}/Modules/CheckPrototypeDefinition.c.in" 56*e415196aSJoakim Soderberg # "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c" @ONLY) 57*e415196aSJoakim Soderberg configure_file("${CMAKE_MODULE_PATH}/CheckPrototypeDefinition.c.in" 58*e415196aSJoakim Soderberg "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c" @ONLY) 59*e415196aSJoakim Soderberg 60*e415196aSJoakim Soderberg file(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c _SOURCE) 61*e415196aSJoakim Soderberg 62*e415196aSJoakim Soderberg try_compile(${_VARIABLE} 63*e415196aSJoakim Soderberg ${CMAKE_BINARY_DIR} 64*e415196aSJoakim Soderberg ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c 65*e415196aSJoakim Soderberg COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} 66*e415196aSJoakim Soderberg CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CHECK_PROTOTYPE_DEFINITION_FLAGS} 67*e415196aSJoakim Soderberg "${CHECK_PROTOTYPE_DEFINITION_LIBS}" 68*e415196aSJoakim Soderberg "${CMAKE_SYMBOL_EXISTS_INCLUDES}" 69*e415196aSJoakim Soderberg OUTPUT_VARIABLE OUTPUT) 70*e415196aSJoakim Soderberg 71*e415196aSJoakim Soderberg if (${_VARIABLE}) 72*e415196aSJoakim Soderberg set(${_VARIABLE} 1 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}") 73*e415196aSJoakim Soderberg message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - True") 74*e415196aSJoakim Soderberg file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log 75*e415196aSJoakim Soderberg "Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} passed with the following output:\n" 76*e415196aSJoakim Soderberg "${OUTPUT}\n\n") 77*e415196aSJoakim Soderberg else (${_VARIABLE}) 78*e415196aSJoakim Soderberg message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - False") 79*e415196aSJoakim Soderberg set(${_VARIABLE} 0 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}") 80*e415196aSJoakim Soderberg file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log 81*e415196aSJoakim Soderberg "Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} failed with the following output:\n" 82*e415196aSJoakim Soderberg "${OUTPUT}\n\n${_SOURCE}\n\n") 83*e415196aSJoakim Soderberg endif (${_VARIABLE}) 84*e415196aSJoakim Soderberg endif("${_VARIABLE}" MATCHES "^${_VARIABLE}$") 85*e415196aSJoakim Soderberg 86*e415196aSJoakim Soderbergendfunction(CHECK_PROTOTYPE_DEFINITION) 87