diff --git a/cmake/BALLConfiguration.cmake b/cmake/BALLConfiguration.cmake index 1e5a5dc328..b565c5cf77 100644 --- a/cmake/BALLConfiguration.cmake +++ b/cmake/BALLConfiguration.cmake @@ -101,10 +101,8 @@ INCLUDE(cmake/BALLConfigTypes.cmake) # Header and Compile checks -IF(NOT APPLE) - SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${BALL_PROJECT_COMPILE_FLAGS}") - SET(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} ${BALL_PROJECT_COMPILE_DEFNS}") -ENDIF() +SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${BALL_PROJECT_COMPILE_FLAGS}") +SET(CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} ${BALL_PROJECT_COMPILE_DEFNS}") ## system headers: CHECK_INCLUDE_FILE_CXX("unistd.h" BALL_HAS_UNISTD_H) diff --git a/cmake/FindXDR.cmake b/cmake/FindXDR.cmake index 0760ea669f..f6c49f3da8 100644 --- a/cmake/FindXDR.cmake +++ b/cmake/FindXDR.cmake @@ -2,113 +2,124 @@ # # Once run this will define: # -# XDR_FOUND = system has XDR lib +# XDR_FOUND = system has XDR lib # -# XDR_LIBRARIES = full path to the libraries, if required +# XDR_LIBRARIES = full path to the libraries, if required # -INCLUDE(CheckIncludeFileCXX) + INCLUDE(CheckCXXSourceCompiles) -INCLUDE(CheckFunctionExists) -INCLUDE(CheckTypeSize) +INCLUDE(CheckIncludeFileCXX) INCLUDE(CheckLibraryExists) -## First try to find the required header files (rpc/types.h, rpc/xdr.h) -#check for the XDR functions: their interface and the libraries they're hidden in. -CHECK_INCLUDE_FILE_CXX(rpc/types.h XDR_HAS_RPC_TYPES_H) -IF(NOT XDR_HAS_RPC_TYPES_H) - MESSAGE(STATUS "Cannot find RPC headers (rpc/types.h). Persistence will be disabled!") -ELSE() - CHECK_CXX_SOURCE_COMPILES("#include - #include - - int main(int /*argc*/, char** /*argv*/) - { - return 0; - }" XDR_HAS_RPC_XDR_H) - IF(NOT XDR_HAS_RPC_XDR_H) - MESSAGE(WARNING "Cannot find RPC headers (rpc/xdr.h). Persistence will be disabled!") - ENDIF() -ENDIF() +SET(XDR_TEST_HEADER " + #include + #include -IF (XDR_HAS_RPC_TYPES_H AND XDR_HAS_RPC_XDR_H) - ## Now let's see if we need an extra lib to compile it - SET(XDR_INT_FOUND) - CHECK_FUNCTION_EXISTS(xdr_int XDR_INT_FOUND) - IF (NOT XDR_INT_FOUND) - FOREACH(lib nsl oncrpc) - ## Try to find the corresponding lib - SET(XDR_INT_LIBRARY) - FIND_LIBRARY(XDR_INT_LIBRARY ${lib}) - - IF (XDR_INT_LIBRARY) - CHECK_LIBRARY_EXISTS(${XDR_INT_LIBRARY} xdr_int "" XDR_INT_SYMBOL_FOUND) - ENDIF() - IF (XDR_INT_SYMBOL_FOUND) - SET(XDR_LIBRARIES ${XDR_INT_LIBRARY}) - ## try to find the debug version as well - FIND_LIBRARY(XDR_INT_LIBRARY_D ${lib}d) - - IF (XDR_INT_LIBRARY_D) - CHECK_LIBRARY_EXISTS(${XDR_INT_LIBRARY_D} xdr_int "" XDR_INT_SYMBOL_D_FOUND) - IF (XDR_INT_SYMBOL_D_FOUND) - BALL_COMBINE_LIBS(XDR_LIBRARIES ${XDR_LIBRARIES} ${XDR_INT_LIBRARY_D}) - ENDIF() - ENDIF() + int main(int /*argc*/, char** /*argv*/) + { + XDR *x = NULL;") - SET(XDR_INT_FOUND TRUE) - BREAK() - ENDIF() - ENDFOREACH() - ENDIF() +SET(XDR_TEST_FOOTER " + return 0; + }") - IF(NOT XDR_INT_FOUND) - MESSAGE(WARNING "Could not locate xdr symbols in libc or libnsl. Persistence will be disabled!") - ELSE() - SET(XDR_FOUND TRUE) +# Check RPC header files +CHECK_INCLUDE_FILE_CXX(rpc/types.h RPC_TYPES_H) +IF(NOT RPC_TYPES_H) + MESSAGE(STATUS "Cannot find RPC header rpc/types.h. Persistence will be disabled!") + RETURN() +ENDIF() + +CHECK_CXX_SOURCE_COMPILES("${XDR_TEST_HEADER} + ${XDR_TEST_FOOTER}" RPC_XDR_H) +IF(NOT RPC_XDR_H) + MESSAGE(STATUS "Cannot find RPC header rpc/xdr.h. Persistence will be disabled!") + RETURN() +ENDIF() + - ## Let's see if we have an implementation for xdr_u_hyper - IF (XDR_LIBRARIES) - CHECK_LIBRARY_EXISTS(${XDR_INT_LIBRARY} xdr_u_hyper "" BALL_HAS_XDR_U_HYPER) - ELSE() - CHECK_FUNCTION_EXISTS(xdr_u_hyper BALL_HAS_XDR_U_HYPER) +# Check for symbol xdr_int +CHECK_CXX_SOURCE_COMPILES("${XDR_TEST_HEADER} + int i; + xdr_int(x, &i); + ${XDR_TEST_FOOTER}" RPC_XDR_INT) +IF(NOT RPC_XDR_INT) + FOREACH(lib nsl oncrpc) + # Try to find the corresponding lib manually + SET(XDR_INT_LIBRARY) + FIND_LIBRARY(XDR_INT_LIBRARY ${lib}) + + IF (XDR_INT_LIBRARY) + CHECK_LIBRARY_EXISTS(${XDR_INT_LIBRARY} xdr_int "" XDR_INT_SYMBOL_FOUND) ENDIF() - IF(BALL_HAS_XDR_U_HYPER) - SET(XDR_TEST_HEADER "#include - #include - int main(){") - SET(XDR_TEST_FOOTER "XDR xdrs; - xdr_u_hyper(&xdrs, &q); }") - - MESSAGE(STATUS "Looking for 64-bit XDR type (for xdr_u_hyper)") - - #List containing possible types for BALL_XDR_UINT64_TYPE - SET(POSSIBLE_64BIT_TYPES u_quad_t u_longlong_t "unsigned long long" __uint64_t) - - #iterate over the list and try out the types - FOREACH(XDR_UINT64_TYPE ${POSSIBLE_64BIT_TYPES}) - CHECK_CXX_SOURCE_COMPILES( "${XDR_TEST_HEADER}${XDR_UINT64_TYPE} q;${XDR_TEST_FOOTER}" XDR_64Bit_Type ) - IF (XDR_64Bit_Type) - SET(BALL_XDR_UINT64_TYPE ${XDR_UINT64_TYPE} CACHE STRING "Unsigned 64bit type for xdr_u_hyper" FORCE) - BREAK() - ENDIF() - ENDFOREACH() - - IF (NOT XDR_64Bit_Type) - SET(BALL_XDR_UINT64_TYPE OFF) - MESSAGE(WARNING "Could not identify an appropriate type for XDR_64Bit_Type.") + IF (XDR_INT_SYMBOL_FOUND) + SET(XDR_LIBRARIES ${XDR_INT_LIBRARY}) + + # Try to find the debug version as well + FIND_LIBRARY(XDR_INT_LIBRARY_D ${lib}d) + + IF (XDR_INT_LIBRARY_D) + CHECK_LIBRARY_EXISTS(${XDR_INT_LIBRARY_D} xdr_int "" XDR_INT_SYMBOL_D_FOUND) + IF (XDR_INT_SYMBOL_D_FOUND) + BALL_COMBINE_LIBS(XDR_LIBRARIES ${XDR_LIBRARIES} ${XDR_INT_LIBRARY_D}) ENDIF() + ENDIF() - ELSE(BALL_HAS_XDR_U_HYPER) - CHECK_TYPE_SIZE("unsigned long long int" SUPPORTS_64_BIT) - IF(SUPPORTS_64_BIT) - SET(BALL_U_QUAD_TYPE "unsigned long long int") - ELSE(SUPPORTS_64_BIT) - MESSAGE(WARNING "Could not identify an 64 bit unsigned type (long long).") - ENDIF(SUPPORTS_64_BIT) - ENDIF(BALL_HAS_XDR_U_HYPER) + SET(RPC_XDR_INT TRUE) + BREAK() + ENDIF() + ENDFOREACH() +ENDIF() + +IF(NOT RPC_XDR_INT) + MESSAGE(STATUS "XRD symbol 'xdr_int' not found. Persistence will be disabled!") + RETURN() +ENDIF() + + +# We have found XDR +SET(XDR_FOUND TRUE) + + +# Check for symbol xdr_u_hyper +CHECK_CXX_SOURCE_COMPILES("${XDR_TEST_HEADER} + u_quad_t q; + xdr_u_hyper(x, &q); + ${XDR_TEST_FOOTER}" BALL_HAS_XDR_U_HYPER) + +IF(NOT BALL_HAS_XDR_U_HYPER) + CHECK_LIBRARY_EXISTS(${XDR_INT_LIBRARY} xdr_u_hyper "" BALL_HAS_XDR_U_HYPER) +ENDIF() + +IF(BALL_HAS_XDR_U_HYPER) + MESSAGE(STATUS "Looking for 64-bit XDR type for xdr_u_hyper") + + # Try out possible types + FOREACH(XDR_UINT64_TYPE u_quad_t u_longlong_t "unsigned long long" __uint64_t) + CHECK_CXX_SOURCE_COMPILES("${XDR_TEST_HEADER} + ${XDR_UINT64_TYPE} q; + xdr_u_hyper(x, &q); + ${XDR_TEST_FOOTER}" XDR_64BIT_TYPE) + + IF (XDR_64BIT_TYPE) + SET(BALL_XDR_UINT64_TYPE ${XDR_UINT64_TYPE} CACHE STRING "Unsigned 64bit type for xdr_u_hyper" FORCE) + BREAK() + ENDIF() + ENDFOREACH() + + IF (NOT XDR_64BIT_TYPE) + SET(BALL_XDR_UINT64_TYPE OFF) + MESSAGE(WARNING "Could not identify an appropriate type for XDR_64BIT_TYPE.") + ENDIF() +ELSE() + CHECK_TYPE_SIZE("unsigned long long int" SUPPORTS_64_BIT) + IF(SUPPORTS_64_BIT) + SET(BALL_U_QUAD_TYPE "unsigned long long int") + ELSE() + MESSAGE(WARNING "Could not identify an 64 bit unsigned type (long long).") ENDIF() ENDIF()