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