@@ -133,6 +133,9 @@ ELSE ()
133133ENDIF ()
134134
135135IF (USE_HTTPS)
136+ # We try to find any packages our backends might use
137+ FIND_PACKAGE (OpenSSL)
138+ FIND_PACKAGE (mbedTLS)
136139 IF (CMAKE_SYSTEM_NAME MATCHES "Darwin" )
137140 FIND_PACKAGE (Security)
138141 FIND_PACKAGE (CoreFoundation)
@@ -149,8 +152,13 @@ IF (USE_HTTPS)
149152 ENDIF ()
150153 ELSEIF (WINHTTP)
151154 SET (HTTPS_BACKEND "WinHTTP" )
152- ELSE ( )
155+ ELSEIF (OPENSSL_FOUND )
153156 SET (HTTPS_BACKEND "OpenSSL" )
157+ ELSEIF (MBEDTLS_FOUND)
158+ SET (HTTPS_BACKEND "mbedTLS" )
159+ ELSE ()
160+ MESSAGE (FATAL_ERROR "Unable to autodetect a usable HTTPS backend."
161+ "Please pass the backend name explicitly (-DUSE_HTTPS=backend)" )
154162 ENDIF ()
155163 ELSE ()
156164 # Backend was explicitly set
@@ -174,8 +182,6 @@ IF (USE_HTTPS)
174182 LIST (APPEND LIBGIT2_LIBS ${COREFOUNDATION_LIBRARIES} ${SECURITY_LIBRARIES} )
175183 LIST (APPEND LIBGIT2_PC_LIBS ${COREFOUNDATION_LDFLAGS} ${SECURITY_LDFLAGS} )
176184 ELSEIF (HTTPS_BACKEND STREQUAL "OpenSSL" )
177- FIND_PACKAGE (OpenSSL)
178-
179185 IF (NOT OPENSSL_FOUND)
180186 MESSAGE (FATAL_ERROR "Asked for OpenSSL TLS backend, but it wasn't found" )
181187 ENDIF ()
@@ -185,6 +191,53 @@ IF (USE_HTTPS)
185191 LIST (APPEND LIBGIT2_LIBS ${OPENSSL_LIBRARIES} )
186192 LIST (APPEND LIBGIT2_PC_LIBS ${OPENSSL_LDFLAGS} )
187193 LIST (APPEND LIBGIT2_PC_REQUIRES "openssl" )
194+ ELSEIF (HTTPS_BACKEND STREQUAL "mbedTLS" )
195+ IF (NOT MBEDTLS_FOUND)
196+ MESSAGE (FATAL_ERROR "Asked for mbedTLS backend, but it wasn't found" )
197+ ENDIF ()
198+
199+ IF (NOT CERT_LOCATION)
200+ MESSAGE ("Auto-detecting default certificates location" )
201+ IF (CMAKE_SYSTEM_NAME MATCHES Darwin)
202+ # Check for an Homebrew installation
203+ SET (OPENSSL_CMD "/usr/local/opt/openssl/bin/openssl" )
204+ ELSE ()
205+ SET (OPENSSL_CMD "openssl" )
206+ ENDIF ()
207+ EXECUTE_PROCESS (COMMAND ${OPENSSL_CMD} version -d OUTPUT_VARIABLE OPENSSL_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
208+ IF (OPENSSL_DIR)
209+ STRING (REGEX REPLACE "^OPENSSLDIR: \" (.*)\" $" "\\ 1/" OPENSSL_DIR ${OPENSSL_DIR} )
210+
211+ SET (OPENSSL_CA_LOCATIONS
212+ "ca-bundle.pem" # OpenSUSE Leap 42.1
213+ "cert.pem" # Ubuntu 14.04, FreeBSD
214+ "certs/ca-certificates.crt" # Ubuntu 16.04
215+ "certs/ca.pem" # Debian 7
216+ )
217+ FOREACH (SUFFIX IN LISTS OPENSSL_CA_LOCATIONS)
218+ SET (LOC "${OPENSSL_DIR}${SUFFIX} " )
219+ IF (NOT CERT_LOCATION AND EXISTS "${OPENSSL_DIR}${SUFFIX} " )
220+ SET (CERT_LOCATION ${LOC} )
221+ ENDIF ()
222+ ENDFOREACH ()
223+ ELSE ()
224+ MESSAGE ("Unable to find OpenSSL executable. Please provide default certificate location via CERT_LOCATION" )
225+ ENDIF ()
226+ ENDIF ()
227+
228+ IF (CERT_LOCATION)
229+ IF (NOT EXISTS ${CERT_LOCATION} )
230+ MESSAGE (FATAL_ERROR "Cannot use CERT_LOCATION=${CERT_LOCATION} as it doesn't exist" )
231+ ENDIF ()
232+ ADD_FEATURE_INFO(CERT_LOCATION ON "using certificates from ${CERT_LOCATION} " )
233+ ADD_DEFINITIONS (-DGIT_DEFAULT_CERT_LOCATION="${CERT_LOCATION} " )
234+ ENDIF ()
235+
236+ SET (GIT_MBEDTLS 1)
237+ LIST (APPEND LIBGIT2_INCLUDES ${MBEDTLS_INCLUDE_DIR} )
238+ LIST (APPEND LIBGIT2_LIBS ${MBEDTLS_LIBRARIES} )
239+ LIST (APPEND LIBGIT2_PC_LIBS ${MBEDTLS_LDFLAGS} )
240+ LIST (APPEND LIBGIT2_PC_REQUIRES "mbedtls" )
188241 ELSEIF (HTTPS_BACKEND STREQUAL "WinHTTP" )
189242 # WinHTTP setup was handled in the WinHTTP-specific block above
190243 ELSE ()
@@ -230,6 +283,11 @@ ELSEIF(SHA1_BACKEND STREQUAL "Win32")
230283ELSEIF (SHA1_BACKEND STREQUAL "CommonCrypto" )
231284 ADD_FEATURE_INFO(SHA ON "using CommonCrypto" )
232285 SET (GIT_SHA1_COMMON_CRYPTO 1)
286+ ELSEIF (SHA1_BACKEND STREQUAL "mbedTLS" )
287+ ADD_FEATURE_INFO(SHA ON "using mbedTLS" )
288+ SET (GIT_SHA1_MBEDTLS 1)
289+ FILE (GLOB SRC_SHA1 src/hash/hash_mbedtls.c)
290+ LIST (APPEND LIBGIT2_PC_REQUIRES "mbedtls" )
233291ELSE ()
234292 MESSAGE (FATAL_ERROR "Asked for unknown SHA1 backend ${SHA1_BACKEND} " )
235293ENDIF ()
0 commit comments