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) 28*43b69b2aSAzat Khuzhin if (${_VARIABLE} MATCHES "^${_VARIABLE}$") 29e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_CONTENT "/* */\n") 30e415196aSJoakim Soderberg 31e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_FLAGS ${CMAKE_REQUIRED_FLAGS}) 32e415196aSJoakim Soderberg if (CMAKE_REQUIRED_LIBRARIES) 33e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_LIBS 34e415196aSJoakim Soderberg "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") 35e415196aSJoakim Soderberg else(CMAKE_REQUIRED_LIBRARIES) 36e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_LIBS) 37e415196aSJoakim Soderberg endif(CMAKE_REQUIRED_LIBRARIES) 38e415196aSJoakim Soderberg if (CMAKE_REQUIRED_INCLUDES) 39e415196aSJoakim Soderberg set(CMAKE_SYMBOL_EXISTS_INCLUDES 40e415196aSJoakim Soderberg "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}") 41e415196aSJoakim Soderberg else(CMAKE_REQUIRED_INCLUDES) 42e415196aSJoakim Soderberg set(CMAKE_SYMBOL_EXISTS_INCLUDES) 43e415196aSJoakim Soderberg endif(CMAKE_REQUIRED_INCLUDES) 44e415196aSJoakim Soderberg 45e415196aSJoakim Soderberg foreach(_FILE ${_HEADER}) 46e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_HEADER 47e415196aSJoakim Soderberg "${CHECK_PROTOTYPE_DEFINITION_HEADER}#include <${_FILE}>\n") 48e415196aSJoakim Soderberg endforeach(_FILE) 49e415196aSJoakim Soderberg 50e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_SYMBOL ${_FUNCTION}) 51e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_PROTO ${_PROTOTYPE}) 52e415196aSJoakim Soderberg set(CHECK_PROTOTYPE_DEFINITION_RETURN ${_RETURN}) 53e415196aSJoakim Soderberg 54befbd130SAcer Yang configure_file("${PROJECT_SOURCE_DIR}/cmake/CheckPrototypeDefinition.c.in" 55e415196aSJoakim Soderberg "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c" @ONLY) 56e415196aSJoakim Soderberg 57e415196aSJoakim Soderberg file(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c _SOURCE) 58e415196aSJoakim Soderberg 59e415196aSJoakim Soderberg try_compile(${_VARIABLE} 60e415196aSJoakim Soderberg ${CMAKE_BINARY_DIR} 61e415196aSJoakim Soderberg ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c 62e415196aSJoakim Soderberg COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} 63e415196aSJoakim Soderberg CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CHECK_PROTOTYPE_DEFINITION_FLAGS} 64e415196aSJoakim Soderberg "${CHECK_PROTOTYPE_DEFINITION_LIBS}" 65e415196aSJoakim Soderberg "${CMAKE_SYMBOL_EXISTS_INCLUDES}" 66e415196aSJoakim Soderberg OUTPUT_VARIABLE OUTPUT) 67e415196aSJoakim Soderberg 68e415196aSJoakim Soderberg if (${_VARIABLE}) 69e415196aSJoakim Soderberg set(${_VARIABLE} 1 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}") 70e415196aSJoakim Soderberg message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - True") 71e415196aSJoakim Soderberg file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log 72e415196aSJoakim Soderberg "Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} passed with the following output:\n" 73e415196aSJoakim Soderberg "${OUTPUT}\n\n") 74e415196aSJoakim Soderberg else (${_VARIABLE}) 75e415196aSJoakim Soderberg message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - False") 76e415196aSJoakim Soderberg set(${_VARIABLE} 0 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}") 77e415196aSJoakim Soderberg file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log 78e415196aSJoakim Soderberg "Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} failed with the following output:\n" 79e415196aSJoakim Soderberg "${OUTPUT}\n\n${_SOURCE}\n\n") 80e415196aSJoakim Soderberg endif (${_VARIABLE}) 81*43b69b2aSAzat Khuzhin endif() 82e415196aSJoakim Soderbergendfunction(CHECK_PROTOTYPE_DEFINITION) 83