summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorJoerg Sonnenberger <joerg.sonnenberger@gmail.com>2010-05-09 19:48:04 -0400
committerJoerg Sonnenberger <joerg.sonnenberger@gmail.com>2010-05-09 19:48:04 -0400
commit2ce66f4b1caf6501ef3ed28ea02504e1b50bca37 (patch)
tree9ab2d2fe94247f6556ce01dc0502a02cee6dc3bf /CMakeLists.txt
parentad27480f2c59567a0b9c0de4c2f570703197c380 (diff)
downloadlibarchive-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.txt128
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