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