From: Tim Kientzle Date: Sat, 17 Dec 2011 07:38:11 +0000 (-0500) Subject: Rework the crypto probe to check a list of algorithms for X-Git-Tag: v3.0.2~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2ad581f2c856bb0c43b5903fd6cd1d018280f19f;p=thirdparty%2Flibarchive.git Rework the crypto probe to check a list of algorithms for a single library, rather than a list of libraries for each algorithm. Use this to order libmd to be checked after OpenSSL/libcrypto. SVN-Revision: 3928 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 04ee4dabe..757898acd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -341,22 +341,23 @@ ENDIF(LIBMD_FOUND) # platforms, just see if archive_crypto.c can compile and link against # required libraries. # -MACRO(CHECK_CRYPTO CRYPTO IMPLEMENTATIONS) +MACRO(CHECK_CRYPTO ALGORITHMS IMPLEMENTATION) IF(HAVE_SYS_TYPES_H) SET(CRYPTO_HEADER_CONFIG "#define HAVE_SYS_TYPES_H 1\n") ELSE(HAVE_SYS_TYPES_H) SET(CRYPTO_HEADER_CONFIG "") ENDIF(HAVE_SYS_TYPES_H) - STRING(TOLOWER "${CRYPTO}" lower_crypto) - STRING(TOUPPER "${CRYPTO}" crypto) - FOREACH(IMPLEMENTATION ${IMPLEMENTATIONS}) + FOREACH(ALGORITHM ${ALGORITHMS}) + STRING(TOLOWER "${ALGORITHM}" lower_algorithm) + STRING(TOUPPER "${ALGORITHM}" algorithm) IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND NOT OPENSSL_FOUND) - SET(ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION} FALSE) + SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE) ELSEIF("${IMPLEMENTATION}" MATCHES "^NETTLE$" AND NOT NETTLE_FOUND) - SET(ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION} FALSE) + SET(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} FALSE) ENDIF("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND NOT OPENSSL_FOUND) - IF(NOT DEFINED ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION}) + + IF(NOT DEFINED ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}) # Probe the local implementation for whether this # crypto implementation is available on this platform. SET(TRY_CRYPTO_REQUIRED_INCLUDES @@ -379,8 +380,8 @@ MACRO(CHECK_CRYPTO CRYPTO IMPLEMENTATIONS) ARCHIVE_CRYPTO_C) SET(SOURCE " -#define ARCHIVE_${crypto}_COMPILE_TEST -#define ARCHIVE_CRYPTO_${crypto}_${IMPLEMENTATION} +#define ARCHIVE_${algorithm}_COMPILE_TEST +#define ARCHIVE_CRYPTO_${algorithm}_${IMPLEMENTATION} #define PLATFORM_CONFIG_H \"check_crypto_md.h\" ${ARCHIVE_CRYPTO_C} @@ -398,9 +399,9 @@ main(int argc, char **argv) FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.h" "") FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.c" "${SOURCE}") - MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION}") + MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}") - TRY_COMPILE(ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION} + TRY_COMPILE(ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/check_crypto_md.c CMAKE_FLAGS @@ -409,28 +410,28 @@ main(int argc, char **argv) OUTPUT_VARIABLE OUTPUT) # Inform user whether or not we found it; if not, log why we didn't. - IF (ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION}) - MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION} -- found") - ELSE (ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION}) - MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION} -- not found") + IF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}) + MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} -- found") + ELSE (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}) + MESSAGE(STATUS "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} -- not found") FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log - "Checking support for ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION} failed with the following output:\n" + "Checking support for ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION} failed with the following output:\n" "${OUTPUT}\n" "Source file was:\n${SOURCE}\n") - ENDIF (ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION}) - ENDIF(NOT DEFINED ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION}) + ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}) + ENDIF(NOT DEFINED ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}) # Add appropriate libs/includes depending on whether the implementation # was found on this platform. - IF (ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION}) + IF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}) IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND) INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR}) LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_LIBRARIES}) LIST(REMOVE_DUPLICATES ADDITIONAL_LIBS) ENDIF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND) - ENDIF (ARCHIVE_CRYPTO_${CRYPTO}_${IMPLEMENTATION}) + ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION}) ENDFOREACH(IMPLEMENTATION ${IMPLEMENTATIONS}) -ENDMACRO(CHECK_CRYPTO CRYPTO IMPLEMENTATIONS) +ENDMACRO(CHECK_CRYPTO ALGORITHMS IMPLEMENTATION) # # CRYPTO functions on Windows is defined at archive_windows.c, thus we do not @@ -1048,12 +1049,16 @@ ENDIF(ENABLE_ACL) # Check MD5/RMD160/SHA support # NOTE: Crypto checks must be run last before generating config.h # -CHECK_CRYPTO(MD5 "LIBC;LIBMD;LIBSYSTEM;NETTLE;OPENSSL") -CHECK_CRYPTO(RMD160 "LIBC;NETTLE;OPENSSL") -CHECK_CRYPTO(SHA1 "LIBC;LIBMD;LIBSYSTEM;NETTLE;OPENSSL") -CHECK_CRYPTO(SHA256 "LIBC;LIBC2;LIBC3;LIBMD;LIBSYSTEM;NETTLE;OPENSSL") -CHECK_CRYPTO(SHA384 "LIBC;LIBC2;LIBC3;LIBSYSTEM;NETTLE;OPENSSL") -CHECK_CRYPTO(SHA512 "LIBC;LIBC2;LIBC3;LIBMD;LIBSYSTEM;NETTLE;OPENSSL") +CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" LIBC) +CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC2) +CHECK_CRYPTO("SHA256;SHA384;SHA512" LIBC3) +CHECK_CRYPTO("MD5;SHA1;SHA256;SHA384;SHA512" LIBSYSTEM) +CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" NETTLE) +CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA384;SHA512" OPENSSL) + +# Libmd has to be probed after OpenSSL. +CHECK_CRYPTO("MD5;RMD160;SHA1;SHA256;SHA512" LIBMD) + CHECK_CRYPTO_WIN("MD5;SHA1;SHA256;SHA384;SHA512") # Generate "config.h" from "build/cmake/config.h.in"