diff options
author | Etienne Samson <samson.etienne@gmail.com> | 2017-09-06 22:13:58 +0000 |
---|---|---|
committer | Etienne Samson <samson.etienne@gmail.com> | 2017-10-23 20:04:21 +0200 |
commit | 9980be03c29169265ad45591925e88e4c8b90327 (patch) | |
tree | 4c1b70ef11e70282d5dd76c5181dec808fc912c9 | |
parent | 10b25dbf1864549cacbc36b36184c4f42e76cc7c (diff) | |
download | libgit2-9980be03c29169265ad45591925e88e4c8b90327.tar.gz |
cmake: Add USE_HTTPS as a CMake option
It defaults to ON, e.g. "pick whatever default is appropriate for the platform".
It accepts one of SecureTransport, OpenSSL, WinHTTP, or OFF.
It errors if the backend library couldn't be found.
-rw-r--r-- | CMakeLists.txt | 5 | ||||
-rw-r--r-- | src/CMakeLists.txt | 80 | ||||
-rw-r--r-- | tests/CMakeLists.txt | 2 |
3 files changed, 57 insertions, 30 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index cc5253054..8f1644368 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,7 @@ OPTION( LIBGIT2_FILENAME "Name of the produced binary" OFF ) OPTION( USE_SHA1DC "Use SHA-1 with collision detection" OFF ) OPTION( USE_ICONV "Link with and use iconv library" OFF ) OPTION( USE_SSH "Link with libssh to enable SSH support" ON ) +OPTION( USE_HTTPS "Enable HTTPS support. Can be set to a specific backend" ON ) OPTION( USE_GSSAPI "Link with libgssapi for SPNEGO auth" OFF ) OPTION( VALGRIND "Configure build for valgrind" OFF ) OPTION( CURL "Use curl for HTTP if available" ON) @@ -91,10 +92,6 @@ IF(MSVC) OPTION(MSVC_CRTDBG "Enable CRTDBG memory leak reporting" OFF) ENDIF() -IF (NOT CMAKE_SYSTEM_NAME MATCHES "Darwin") - OPTION( USE_OPENSSL "Link with and use openssl library" ON ) -ENDIF() - CHECK_STRUCT_HAS_MEMBER ("struct stat" st_mtim "sys/types.h;sys/stat.h" HAVE_STRUCT_STAT_ST_MTIM LANGUAGE C) CHECK_STRUCT_HAS_MEMBER ("struct stat" st_mtimespec "sys/types.h;sys/stat.h" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b873953a1..e81dfb1b4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -97,15 +97,6 @@ IF(THREADSAFE) ENDIF() ADD_FEATURE_INFO(threadsafe THREADSAFE "threadsafe support") -IF (SECURITY_FOUND) - IF (SECURITY_HAS_SSLCREATECONTEXT) - LIST(APPEND LIBGIT2_PC_LIBS ${SECURITY_LDFLAGS}) - ELSE() - MESSAGE("-- Security framework is too old, falling back to OpenSSL") - SET(USE_OPENSSL "ON") - ENDIF() -ENDIF() - IF (COREFOUNDATION_FOUND) LIST(APPEND LIBGIT2_LIBS ${COREFOUNDATION_LIBRARIES}) LIST(APPEND LIBGIT2_PC_LIBS ${COREFOUNDATION_LDFLAGS}) @@ -121,7 +112,6 @@ ENDIF() IF (WIN32 AND WINHTTP) SET(GIT_WINHTTP 1) - SET(GIT_HTTPS 1) # Since MinGW does not come with headers or an import library for winhttp, # we have to include a private header and generate our own import library @@ -142,7 +132,7 @@ ELSE () PKG_CHECK_MODULES(CURL libcurl) ENDIF () - IF (NOT AMIGA AND USE_OPENSSL) + IF (NOT AMIGA AND (USE_HTTPS STREQUAL "OpenSSL" OR USE_HTTPS STREQUAL "ON")) FIND_PACKAGE(OpenSSL) ENDIF () @@ -156,6 +146,60 @@ ELSE () ADD_FEATURE_INFO(cURL GIT_CURL "cURL for HTTP proxy support") ENDIF() +IF (USE_HTTPS) + # Auto-select TLS backend + IF (USE_HTTPS STREQUAL ON) + IF (SECURITY_FOUND) + IF (SECURITY_HAS_SSLCREATECONTEXT) + SET(HTTPS_BACKEND "SecureTransport") + ELSE() + MESSAGE("-- Security framework is too old, falling back to OpenSSL") + SET(HTTPS_BACKEND "OpenSSL") + ENDIF() + ELSEIF (WINHTTP) + SET(HTTPS_BACKEND "WinHTTP") + ELSE() + SET(HTTPS_BACKEND "OpenSSL") + ENDIF() + ELSE() + # Backend was explicitly set + SET(HTTPS_BACKEND ${USE_HTTPS}) + ENDIF() + + # Check that we can find what's required for the selected backend + IF (HTTPS_BACKEND STREQUAL "SecureTransport") + IF (NOT SECURITY_FOUND) + MESSAGE(FATAL_ERROR "Cannot use SecureTransport backend, Security.framework not found") + ENDIF() + IF (NOT SECURITY_HAS_SSLCREATECONTEXT) + MESSAGE(FATAL_ERROR "Cannot use SecureTransport backend, SSLCreateContext not supported") + ENDIF() + + SET(GIT_SECURE_TRANSPORT 1) + LIST(APPEND LIBGIT2_INCLUDES ${SECURITY_INCLUDE_DIR}) + LIST(APPEND LIBGIT2_LIBS ${SECURITY_LIBRARIES}) + LIST(APPEND LIBGIT2_PC_LIBS ${SECURITY_LDFLAGS}) + ELSEIF (HTTPS_BACKEND STREQUAL "OpenSSL") + IF (NOT OPENSSL_FOUND) + MESSAGE(FATAL_ERROR "Asked for OpenSSL TLS backend, but it wasn't found") + ENDIF() + + SET(GIT_OPENSSL 1) + LIST(APPEND LIBGIT2_INCLUDES ${OPENSSL_INCLUDE_DIR}) + LIST(APPEND LIBGIT2_LIBS ${OPENSSL_LIBRARIES}) + LIST(APPEND LIBGIT2_PC_LIBS ${OPENSSL_LDFLAGS}) + ELSEIF (HTTPS_BACKEND STREQUAL "WinHTTP") + # WinHTTP setup was handled in the WinHTTP-specific block above + ELSE() + MESSAGE(FATAL_ERROR "Asked for backend ${HTTPS_BACKEND} but it wasn't found") + ENDIF() + + ADD_FEATURE_INFO(HTTPS ON "using ${HTTPS_BACKEND}") + SET(GIT_HTTPS 1) +ELSE() + ADD_FEATURE_INFO(HTTPS OFF "no support") +ENDIF() + # Specify sha1 implementation IF (USE_SHA1DC) ADD_FEATURE_INFO(SHA ON "using SHA1DC") @@ -270,20 +314,6 @@ IF (ICONV_FOUND) ENDIF() ADD_FEATURE_INFO(iconv GIT_USE_ICONV "iconv encoding conversion support") -IF (SECURITY_FOUND) - SET(GIT_SECURE_TRANSPORT 1) - SET(GIT_HTTPS 1) - LIST(APPEND LIBGIT2_INCLUDES ${SECURITY_INCLUDE_DIR}) -ENDIF () - -IF (OPENSSL_FOUND) - SET(GIT_OPENSSL 1) - SET(GIT_HTTPS 1) - LIST(APPEND LIBGIT2_INCLUDES ${OPENSSL_INCLUDE_DIR}) - LIST(APPEND LIBGIT2_LIBS ${OPENSSL_LIBRARIES}) -ENDIF() - - IF (THREADSAFE) IF (NOT WIN32) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f3becefa4..08ecb396b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -52,7 +52,7 @@ IF (MSVC_IDE) SET_SOURCE_FILES_PROPERTIES("precompiled.c" COMPILE_FLAGS "/Ycprecompiled.h") ENDIF () -IF (GIT_HTTPS) +IF (USE_HTTPS) ADD_TEST(libgit2_clar "${libgit2_BINARY_DIR}/libgit2_clar" -ionline -xclone::local::git_style_unc_paths -xclone::local::standard_unc_paths_are_written_git_style) ELSE () ADD_TEST(libgit2_clar "${libgit2_BINARY_DIR}/libgit2_clar" -v -xclone::local::git_style_unc_paths -xclone::local::standard_unc_paths_are_written_git_style) |