|
| 1 | +# Select the backend to use |
| 2 | + |
| 3 | +# We try to find any packages our backends might use |
| 4 | +FIND_PACKAGE(OpenSSL) |
| 5 | +FIND_PACKAGE(mbedTLS) |
| 6 | +IF (CMAKE_SYSTEM_NAME MATCHES "Darwin") |
| 7 | + FIND_PACKAGE(Security) |
| 8 | + FIND_PACKAGE(CoreFoundation) |
| 9 | +ENDIF() |
| 10 | + |
| 11 | +# Auto-select TLS backend |
| 12 | +IF (USE_HTTPS STREQUAL ON) |
| 13 | + message(ON) |
| 14 | + IF (SECURITY_FOUND) |
| 15 | + IF (SECURITY_HAS_SSLCREATECONTEXT) |
| 16 | + SET(HTTPS_BACKEND "SecureTransport") |
| 17 | + ELSE() |
| 18 | + MESSAGE("-- Security framework is too old, falling back to OpenSSL") |
| 19 | + SET(HTTPS_BACKEND "OpenSSL") |
| 20 | + ENDIF() |
| 21 | + ELSEIF (WINHTTP) |
| 22 | + SET(HTTPS_BACKEND "WinHTTP") |
| 23 | + ELSEIF(OPENSSL_FOUND) |
| 24 | + SET(HTTPS_BACKEND "OpenSSL") |
| 25 | + ELSEIF(MBEDTLS_FOUND) |
| 26 | + SET(HTTPS_BACKEND "mbedTLS") |
| 27 | + ELSE() |
| 28 | + MESSAGE(FATAL_ERROR "Unable to autodetect a usable HTTPS backend." |
| 29 | + "Please pass the backend name explicitly (-DUSE_HTTPS=backend)") |
| 30 | + ENDIF() |
| 31 | +ELSEIF(USE_HTTPS) |
| 32 | + message(expl) |
| 33 | + # HTTPS backend was explicitly set |
| 34 | + SET(HTTPS_BACKEND ${USE_HTTPS}) |
| 35 | +ELSE() |
| 36 | + SET(HTTPS_BACKEND NO) |
| 37 | +ENDIF() |
| 38 | + |
| 39 | +IF(HTTPS_BACKEND) |
| 40 | + # Check that we can find what's required for the selected backend |
| 41 | + IF (HTTPS_BACKEND STREQUAL "SecureTransport") |
| 42 | + IF (NOT COREFOUNDATION_FOUND) |
| 43 | + MESSAGE(FATAL_ERROR "Cannot use SecureTransport backend, CoreFoundation.framework not found") |
| 44 | + ENDIF() |
| 45 | + IF (NOT SECURITY_FOUND) |
| 46 | + MESSAGE(FATAL_ERROR "Cannot use SecureTransport backend, Security.framework not found") |
| 47 | + ENDIF() |
| 48 | + IF (NOT SECURITY_HAS_SSLCREATECONTEXT) |
| 49 | + MESSAGE(FATAL_ERROR "Cannot use SecureTransport backend, SSLCreateContext not supported") |
| 50 | + ENDIF() |
| 51 | + |
| 52 | + SET(GIT_SECURE_TRANSPORT 1) |
| 53 | + LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${SECURITY_INCLUDE_DIR}) |
| 54 | + LIST(APPEND LIBGIT2_LIBS ${COREFOUNDATION_LIBRARIES} ${SECURITY_LIBRARIES}) |
| 55 | + LIST(APPEND LIBGIT2_PC_LIBS ${COREFOUNDATION_LDFLAGS} ${SECURITY_LDFLAGS}) |
| 56 | + ELSEIF (HTTPS_BACKEND STREQUAL "OpenSSL") |
| 57 | + IF (NOT OPENSSL_FOUND) |
| 58 | + MESSAGE(FATAL_ERROR "Asked for OpenSSL TLS backend, but it wasn't found") |
| 59 | + ENDIF() |
| 60 | + |
| 61 | + SET(GIT_OPENSSL 1) |
| 62 | + LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${OPENSSL_INCLUDE_DIR}) |
| 63 | + LIST(APPEND LIBGIT2_LIBS ${OPENSSL_LIBRARIES}) |
| 64 | + LIST(APPEND LIBGIT2_PC_LIBS ${OPENSSL_LDFLAGS}) |
| 65 | + LIST(APPEND LIBGIT2_PC_REQUIRES "openssl") |
| 66 | + ELSEIF(HTTPS_BACKEND STREQUAL "mbedTLS") |
| 67 | + IF (NOT MBEDTLS_FOUND) |
| 68 | + MESSAGE(FATAL_ERROR "Asked for mbedTLS backend, but it wasn't found") |
| 69 | + ENDIF() |
| 70 | + |
| 71 | + IF(NOT CERT_LOCATION) |
| 72 | + MESSAGE("Auto-detecting default certificates location") |
| 73 | + IF(CMAKE_SYSTEM_NAME MATCHES Darwin) |
| 74 | + # Check for an Homebrew installation |
| 75 | + SET(OPENSSL_CMD "/usr/local/opt/openssl/bin/openssl") |
| 76 | + ELSE() |
| 77 | + SET(OPENSSL_CMD "openssl") |
| 78 | + ENDIF() |
| 79 | + EXECUTE_PROCESS(COMMAND ${OPENSSL_CMD} version -d OUTPUT_VARIABLE OPENSSL_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) |
| 80 | + IF(OPENSSL_DIR) |
| 81 | + STRING(REGEX REPLACE "^OPENSSLDIR: \"(.*)\"$" "\\1/" OPENSSL_DIR ${OPENSSL_DIR}) |
| 82 | + |
| 83 | + SET(OPENSSL_CA_LOCATIONS |
| 84 | + "ca-bundle.pem" # OpenSUSE Leap 42.1 |
| 85 | + "cert.pem" # Ubuntu 14.04, FreeBSD |
| 86 | + "certs/ca-certificates.crt" # Ubuntu 16.04 |
| 87 | + "certs/ca.pem" # Debian 7 |
| 88 | + ) |
| 89 | + FOREACH(SUFFIX IN LISTS OPENSSL_CA_LOCATIONS) |
| 90 | + SET(LOC "${OPENSSL_DIR}${SUFFIX}") |
| 91 | + IF(NOT CERT_LOCATION AND EXISTS "${OPENSSL_DIR}${SUFFIX}") |
| 92 | + SET(CERT_LOCATION ${LOC}) |
| 93 | + ENDIF() |
| 94 | + ENDFOREACH() |
| 95 | + ELSE() |
| 96 | + MESSAGE("Unable to find OpenSSL executable. Please provide default certificate location via CERT_LOCATION") |
| 97 | + ENDIF() |
| 98 | + ENDIF() |
| 99 | + |
| 100 | + IF(CERT_LOCATION) |
| 101 | + IF(NOT EXISTS ${CERT_LOCATION}) |
| 102 | + MESSAGE(FATAL_ERROR "Cannot use CERT_LOCATION=${CERT_LOCATION} as it doesn't exist") |
| 103 | + ENDIF() |
| 104 | + ADD_FEATURE_INFO(CERT_LOCATION ON "using certificates from ${CERT_LOCATION}") |
| 105 | + ADD_DEFINITIONS(-DGIT_DEFAULT_CERT_LOCATION="${CERT_LOCATION}") |
| 106 | + ENDIF() |
| 107 | + |
| 108 | + SET(GIT_MBEDTLS 1) |
| 109 | + LIST(APPEND LIBGIT2_SYSTEM_INCLUDES ${MBEDTLS_INCLUDE_DIR}) |
| 110 | + LIST(APPEND LIBGIT2_LIBS ${MBEDTLS_LIBRARIES}) |
| 111 | + # mbedTLS has no pkgconfig file, hence we can't require it |
| 112 | + # https://github.com/ARMmbed/mbedtls/issues/228 |
| 113 | + # For now, pass its link flags as our own |
| 114 | + LIST(APPEND LIBGIT2_PC_LIBS ${MBEDTLS_LIBRARIES}) |
| 115 | + ELSEIF (HTTPS_BACKEND STREQUAL "WinHTTP") |
| 116 | + # WinHTTP setup was handled in the WinHTTP-specific block above |
| 117 | + ELSE() |
| 118 | + MESSAGE(FATAL_ERROR "Asked for backend ${HTTPS_BACKEND} but it wasn't found") |
| 119 | + ENDIF() |
| 120 | + |
| 121 | + SET(GIT_HTTPS 1) |
| 122 | + ADD_FEATURE_INFO(HTTPS GIT_HTTPS "using ${HTTPS_BACKEND}") |
| 123 | +ELSE() |
| 124 | + SET(GIT_HTTPS 0) |
| 125 | + ADD_FEATURE_INFO(HTTPS NO "") |
| 126 | +ENDIF() |
0 commit comments