From d6044e20be4fa995235e621b05e9ea1943b99333 Mon Sep 17 00:00:00 2001 From: pthiel Date: Thu, 23 Nov 2017 09:51:59 +0100 Subject: [PATCH 1/2] [CMAKE] Refactored FindXDR.cmake module Configuration problems on macOS using -std=c++11 concerning finding XDR should be resolved now. --- cmake/BALLConfiguration.cmake | 6 +- cmake/FindXDR.cmake | 160 +++++++++++++++------------------- 2 files changed, 70 insertions(+), 96 deletions(-) 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..0f56306a83 100644 --- a/cmake/FindXDR.cmake +++ b/cmake/FindXDR.cmake @@ -9,106 +9,82 @@ INCLUDE(CheckIncludeFileCXX) INCLUDE(CheckCXXSourceCompiles) -INCLUDE(CheckFunctionExists) -INCLUDE(CheckTypeSize) -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() +SET(XDR_TEST_HEADER " + #include + #include + + int main(int /*argc*/, char** /*argv*/) + { + XDR *x = NULL;") + +SET(XDR_TEST_FOOTER " + return 0; + }") + + +# 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() -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() - - SET(XDR_INT_FOUND TRUE) - BREAK() - ENDIF() - ENDFOREACH() - 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() - 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 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) + MESSAGE(STATUS "XRD symbol 'xdr_int' not found. 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) +# 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(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(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.") - 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) + 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() From bd50baf264f568c8d691cfbb8cf803c373fb052f Mon Sep 17 00:00:00 2001 From: pthiel Date: Thu, 23 Nov 2017 11:12:47 +0100 Subject: [PATCH 2/2] [CMAKE] Refactored FindXDR.cmake module fixed for Win Manual library searching required. --- cmake/FindXDR.cmake | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/cmake/FindXDR.cmake b/cmake/FindXDR.cmake index 0f56306a83..f6c49f3da8 100644 --- a/cmake/FindXDR.cmake +++ b/cmake/FindXDR.cmake @@ -2,13 +2,15 @@ # # 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(CheckIncludeFileCXX) +INCLUDE(CheckLibraryExists) SET(XDR_TEST_HEADER " @@ -44,11 +46,41 @@ 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 (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() + + 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) @@ -59,6 +91,9 @@ CHECK_CXX_SOURCE_COMPILES("${XDR_TEST_HEADER} 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")