diff options
author | Joerg Sonnenberger <joerg.sonnenberger@gmail.com> | 2010-05-09 19:48:04 -0400 |
---|---|---|
committer | Joerg Sonnenberger <joerg.sonnenberger@gmail.com> | 2010-05-09 19:48:04 -0400 |
commit | 2ce66f4b1caf6501ef3ed28ea02504e1b50bca37 (patch) | |
tree | 9ab2d2fe94247f6556ce01dc0502a02cee6dc3bf /CMakeLists.txt | |
parent | ad27480f2c59567a0b9c0de4c2f570703197c380 (diff) | |
download | libarchive-2ce66f4b1caf6501ef3ed28ea02504e1b50bca37.tar.gz |
Rewrite the hash function detection. Build an actual test program using
archive_hash.h and link against libcrypto if needed.
Fixes issue #73 and #86.
SVN-Revision: 2375
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 128 |
1 files changed, 63 insertions, 65 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index d9b6ac7c..ec82efb8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -268,72 +268,70 @@ LA_CHECK_INCLUDE_FILE("winioctl.h" HAVE_WINIOCTL_H) # IF(ENABLE_OPENSSL) FIND_PACKAGE(OpenSSL) -ELSE() - SET(OPENSSL_FOUND 0) ENDIF() -IF(OPENSSL_FOUND) - INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR}) - LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_LIBRARIES}) -ELSE() - # Block OpenSSL checks and override cached results. - SET(HAVE_OPENSSL_MD5_H 0) - SET(HAVE_OPENSSL_RIPEMD_H 0) - SET(HAVE_OPENSSL_SHA_H 0) - SET(HAVE_OPENSSL_SHA256_INIT 0) - SET(HAVE_OPENSSL_SHA384_INIT 0) - SET(HAVE_OPENSSL_SHA512_INIT 0) -ENDIF() -# -# Check MD5/RMD160/SHA headers -# -LA_CHECK_INCLUDE_FILE("md5.h" HAVE_MD5_H) -LA_CHECK_INCLUDE_FILE("openssl/md5.h" HAVE_OPENSSL_MD5_H) -LA_CHECK_INCLUDE_FILE("openssl/ripemd.h" HAVE_OPENSSL_RIPEMD_H) -LA_CHECK_INCLUDE_FILE("openssl/sha.h" HAVE_OPENSSL_SHA_H) -LA_CHECK_INCLUDE_FILE("ripemd.h" HAVE_RIPEMD_H) -LA_CHECK_INCLUDE_FILE("rmd160.h" HAVE_RMD160_H) -LA_CHECK_INCLUDE_FILE("sha.h" HAVE_SHA_H) -LA_CHECK_INCLUDE_FILE("sha1.h" HAVE_SHA1_H) -LA_CHECK_INCLUDE_FILE("sha2.h" HAVE_SHA2_H) -LA_CHECK_INCLUDE_FILE("sha256.h" HAVE_SHA256_H) - -# -# Find MD5/RMD160/SHA library -# -FIND_LIBRARY(CRYPTO_LIBRARY NAMES crypto) -IF(CRYPTO_LIBRARY) - LIST(APPEND ADDITIONAL_LIBS ${CRYPTO_LIBRARY}) -ELSE(CRYPTO_LIBRARY) - IF(NOT OPENSSL_FOUND) - FIND_LIBRARY(MD_LIBRARY NAMES md) - IF(MD_LIBRARY) - LIST(APPEND ADDITIONAL_LIBS ${MD_LIBRARY}) - ENDIF(MD_LIBRARY) - ENDIF(NOT OPENSSL_FOUND) -ENDIF(CRYPTO_LIBRARY) -# -# Check MD5/RMD160/SHA functions -# -SET(CMAKE_REQUIRED_LIBRARIES ${ADDITIONAL_LIBS}) -IF(HAVE_MD5_H) - CHECK_SYMBOL_EXISTS(MD5Init "md5.h" HAVE_MD5INIT) -ENDIF(HAVE_MD5_H) -IF(HAVE_RMD160_H) - CHECK_SYMBOL_EXISTS(RMD160Init "rmd160.h" HAVE_RMD160INIT) -ENDIF(HAVE_RMD160_H) -IF(HAVE_SHA2_H) - CHECK_SYMBOL_EXISTS(SHA256Init "sha2.h" HAVE_SHA256INIT) - CHECK_SYMBOL_EXISTS(SHA384Init "sha2.h" HAVE_SHA384INIT) - CHECK_SYMBOL_EXISTS(SHA512Init "sha2.h" HAVE_SHA512INIT) - CHECK_SYMBOL_EXISTS(SHA256_Init "sha2.h" HAVE_SHA256_INIT) - CHECK_SYMBOL_EXISTS(SHA384_Init "sha2.h" HAVE_SHA384_INIT) - CHECK_SYMBOL_EXISTS(SHA512_Init "sha2.h" HAVE_SHA512_INIT) -ELSEIF(HAVE_OPENSSL_SHA_H) - CHECK_SYMBOL_EXISTS(SHA256_Init "openssl/sha.h" HAVE_OPENSSL_SHA256_INIT) - CHECK_SYMBOL_EXISTS(SHA384_Init "openssl/sha.h" HAVE_OPENSSL_SHA384_INIT) - CHECK_SYMBOL_EXISTS(SHA512_Init "openssl/sha.h" HAVE_OPENSSL_SHA512_INIT) -ENDIF() -SET(CMAKE_REQUIRED_LIBRARIES "") + +MACRO(CHECK_MD HASH IMPLEMENTATIONS) + FOREACH(IMPLEMENTATION ${IMPLEMENTATIONS}) + IF (CHECK_MD_${HASH}) + BREAK() + ENDIF (CHECK_MD_${HASH}) + STRING(TOLOWER "${HASH}" lower_hash) + STRING(TOUPPER "${HASH}" hash) + + IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND) + INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR}) + LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_LIBRARIES}) + ENDIF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND) + + SET(SOURCE "#define ${hash}_COMPILE_TEST +#define ARCHIVE_HASH_${hash}_${IMPLEMENTATION} +#define __LIBARCHIVE_BUILD +#include \"archive_hash.h\" + +int +main(int argc, char **argv) +{ + archive_${lower_hash}_ctx ctx; + + archive_${lower_hash}_init(&ctx); + archive_${lower_hash}_update(&ctx, *argv, argc); + archive_${lower_hash}_final(&ctx, *argv); + return 0; +} +") + + FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c" "${SOURCE}") + MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION}") + + TRY_COMPILE(CHECK_MD_${HASH} + ${CMAKE_BINARY_DIR} + ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.c + CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=/home/joerg/wd/libarchive-full/trunk/libarchive" + OUTPUT_VARIABLE OUTPUT) + + IF (CHECK_MD_${HASH}) + MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} -- found") + SET(ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} 1) + BREAK() + ENDIF(CHECK_MD_${HASH}) + + MESSAGE(STATUS "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} -- not found") + FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Checking support for ARCHIVE_HASH_${HASH}_${IMPLEMENTATION} failed with the following output:\n" + "${OUTPUT}\n" + "Source file was:\n${SOURCE}\n") + ENDFOREACH(IMPLEMENTATION) +ENDMACRO(CHECK_MD HASH IMPLEMENTATIONS) + +# +# Check MD5/RMD160/SHA support +# +CHECK_MD(MD5 "LIBC;WIN;OPENSSL") +CHECK_MD(RMD160 "LIBC;WIN;OPENSSL") +CHECK_MD(SHA1 "LIBC;WIN;OPENSSL") +CHECK_MD(SHA256 "LIBC;LIBC2;LIBC3;WIN;OPENSSL") +CHECK_MD(SHA384 "LIBC;LIBC2;LIBC3;WIN;OPENSSL") +CHECK_MD(SHA512 "LIBC;LIBC2;LIBC3;WIN;OPENSSL") # # Find Libxml2 |