Skip to content

OpenSSL and CentOS 7 #382

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Mar 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,11 @@ if (WIN32)
endif ()

if (NOT COUCHBASE_CXX_CLIENT_POST_LINKED_OPENSSL)
target_link_libraries(couchbase_cxx_client PUBLIC OpenSSL::SSL OpenSSL::Crypto)
if (TARGET PkgConfig::PKG_CONFIG_OPENSSL)
target_link_libraries(couchbase_cxx_client PUBLIC PkgConfig::PKG_CONFIG_OPENSSL)
else()
target_link_libraries(couchbase_cxx_client PUBLIC OpenSSL::SSL OpenSSL::Crypto)
endif()
endif ()

option(COUCHBASE_CXX_CLIENT_BUILD_TESTS "Build test programs" TRUE)
Expand Down
3 changes: 3 additions & 0 deletions bin/build-tests
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,6 @@ ${CB_CMAKE} \
-S "${PROJECT_ROOT}"

${CB_CMAKE} --build "${BUILD_DIR}" --parallel ${CB_NUMBER_OF_JOBS} --verbose ${CB_CMAKE_BUILD_EXTRAS}

${CB_CMAKE} --build "${BUILD_DIR}" --parallel ${CB_NUMBER_OF_JOBS} --verbose --target cbc
${BUILD_DIR}/tools/cbc version --json
9 changes: 9 additions & 0 deletions bin/build-tests.rb
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,12 @@ def run(*args)
"--config", CB_CMAKE_BUILD_TYPE,
"--verbose")
end

if RUBY_PLATFORM =~ /mswin|mingw/
cbc = Dir["#{BUILD_DIR}/**/cbc.exe"].first
if File.exist?(cbc)
run("#{cbc} version --json")
end
else
run("#{BUILD_DIR}/tools/cbc version --json")
end
16 changes: 12 additions & 4 deletions cmake/CompilerWarnings.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,26 @@ function(set_project_warnings project_name)
-Wuseless-cast # warn if you perform a cast to the same type
-Wdeprecated-declarations # warn if [[deprecated]] elements being used
)
set(CLANG_WARNINGS ${COMMON_WARNINGS}
-Wshadow # warn the user if a variable declaration shadows one from a parent context
set(CLANG_WARNINGS ${COMMON_WARNINGS} -Wshadow # warn the user if a variable declaration shadows one from a parent
# context
)

if(MSVC)
set(PROJECT_WARNINGS ${MSVC_WARNINGS})
elseif(CMAKE_CXX_COMPILER_ID MATCHES ".*Clang")
set(PROJECT_WARNINGS ${CLANG_WARNINGS})
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.0.0" AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "11.0.0"
AND NOT
CMAKE_BUILD_TYPE
STREQUAL
"Debug")
# One of the occurrences: https://github.com/chriskohlhoff/asio/pull/1176
set(GCC_WARNINGS ${GCC_WARNINGS} -Wno-error=null-dereference -Wno-error=array-bounds)
set(GCC_WARNINGS
${GCC_WARNINGS}
-Wno-error=null-dereference
-Wno-error=array-bounds
-Wno-error=stringop-overflow)
endif()
set(PROJECT_WARNINGS ${GCC_WARNINGS})
else()
Expand Down
59 changes: 52 additions & 7 deletions cmake/OpenSSL.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,21 @@ else()
if(NOT OPENSSL_ROOT_DIR)
if(APPLE AND COUCHBASE_CXX_CLIENT_USE_HOMEBREW_TO_DETECT_OPENSSL)
execute_process(
COMMAND brew --prefix openssl@1.1
COMMAND brew --prefix openssl
OUTPUT_VARIABLE OPENSSL_ROOT_DIR
ERROR_VARIABLE HOMEBREW_STDERR
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(OPENSSL_ROOT_DIR)
message(STATUS "Found OpenSSL prefix using homebrew: ${OPENSSL_ROOT_DIR}")
message(STATUS "Found OpenSSL prefix using Homebrew: ${OPENSSL_ROOT_DIR}")
else()
execute_process(
COMMAND brew --prefix openssl@1.1
OUTPUT_VARIABLE OPENSSL_ROOT_DIR
ERROR_VARIABLE HOMEBREW_STDERR
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
if(OPENSSL_ROOT_DIR)
message(STATUS "Found OpenSSL 1.1 prefix using Homebrew: ${OPENSSL_ROOT_DIR}")
endif()
endif()
endif()
if(MSVC AND COUCHBASE_CXX_CLIENT_USE_SCOOP_TO_DETECT_OPENSSL)
Expand All @@ -32,11 +42,46 @@ else()
endif()
endif()
endif()
include(FindOpenSSL)
if(OPENSSL_LIBRARIES AND OPENSSL_INCLUDE_DIR)
message(STATUS "OPENSSL_VERSION: ${OPENSSL_VERSION}")
message(STATUS "OPENSSL_INCLUDE_DIR: ${OPENSSL_INCLUDE_DIR}")
message(STATUS "OPENSSL_LIBRARIES: ${OPENSSL_LIBRARIES}")

find_package(OpenSSL 1.1)
if(OpenSSL_FOUND)
try_compile(
OPENSSL_USABLE ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/cmake/test_openssl.cxx
LINK_LIBRARIES OpenSSL::SSL CXX_STANDARD 17)
if( OPENSSL_USABLE)
message(STATUS "OPENSSL_VERSION: ${OPENSSL_VERSION}")
message(STATUS "OPENSSL_INCLUDE_DIR: ${OPENSSL_INCLUDE_DIR}")
message(STATUS "OPENSSL_LIBRARIES: ${OPENSSL_LIBRARIES}")
else()
if(UNIX)
message(
STATUS
"Cannot use OpenSSL ${OPENSSL_VERSION} at \"${OPENSSL_INCLUDE_DIR}\" and \"${OPENSSL_LIBRARIES}\". Will try to use from pkg-config."
)
find_package(PkgConfig REQUIRED)
pkg_check_modules(PKG_CONFIG_OPENSSL REQUIRED IMPORTED_TARGET GLOBAL openssl11)
if(PKG_CONFIG_OPENSSL_FOUND)
message(STATUS "PKG_CONFIG_OPENSSL_VERSION: ${PKG_CONFIG_OPENSSL_VERSION}")
message(STATUS "PKG_CONFIG_OPENSSL_INCLUDE_DIRS: ${PKG_CONFIG_OPENSSL_INCLUDE_DIRS}")
message(STATUS "PKG_CONFIG_OPENSSL_LIBRARIES: ${PKG_CONFIG_OPENSSL_LIBRARIES}")
else()
message(FATAL_ERROR "Cannot Find OpenSSL using pkg-config, find_package() returns unusable setup")
endif()
else()
message(FATAL_ERROR "OpenSSL discovered by find_package() returns unusable setup")
endif()
endif()
elseif(UNIX)
find_package(PkgConfig REQUIRED)
pkg_check_modules(PKG_CONFIG_OPENSSL REQUIRED IMPORTED_TARGET GLOBAL openssl11)
if(PKG_CONFIG_OPENSSL_FOUND)
message(STATUS "PKG_CONFIG_OPENSSL_VERSION: ${PKG_CONFIG_OPENSSL_VERSION}")
message(STATUS "PKG_CONFIG_OPENSSL_INCLUDE_DIRS: ${PKG_CONFIG_OPENSSL_INCLUDE_DIRS}")
message(STATUS "PKG_CONFIG_OPENSSL_LIBRARIES: ${PKG_CONFIG_OPENSSL_LIBRARIES}")
else()
message(FATAL_ERROR "Cannot Find OpenSSL using pkg-config")
endif()
else()
message(FATAL_ERROR "Cannot build Couchbase C++ SDK without OpenSSL")
endif()
Expand Down
11 changes: 8 additions & 3 deletions cmake/VersionInfo.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,14 @@ file(
#define COUCHBASE_CXX_CLIENT_LINK_OPTIONS \"$<TARGET_PROPERTY:couchbase_cxx_client,LINK_OPTIONS>\"
#define COUCHBASE_CXX_CLIENT_POST_LINKED_OPENSSL \"${COUCHBASE_CXX_CLIENT_POST_LINKED_OPENSSL}\"

#define OPENSSL_CRYPTO_LIBRARIES \"${OPENSSL_CRYPTO_LIBRARIES}\"
#define OPENSSL_SSL_LIBRARIES \"${OPENSSL_SSL_LIBRARIES}\"
#define OPENSSL_INCLUDE_DIR \"${OPENSSL_INCLUDE_DIR}\"
#define OPENSSL_SSL_IMPORTED_LOCATION \"$<$<TARGET_EXISTS:OpenSSL::SSL>:$<TARGET_PROPERTY:OpenSSL::SSL,IMPORTED_LOCATION>>\"
#define OPENSSL_SSL_INTERFACE_INCLUDE_DIRECTORIES \"$<$<TARGET_EXISTS:OpenSSL::SSL>:$<TARGET_PROPERTY:OpenSSL::SSL,INTERFACE_INCLUDE_DIRECTORIES>>\"
#define OPENSSL_SSL_INTERFACE_LINK_LIBRARIES \"$<$<TARGET_EXISTS:OpenSSL::SSL>:$<TARGET_PROPERTY:OpenSSL::SSL,INTERFACE_LINK_LIBRARIES>>\"
#define OPENSSL_CRYPTO_IMPORTED_LOCATION \"$<$<TARGET_EXISTS:OpenSSL::Crypto>:$<TARGET_PROPERTY:OpenSSL::Crypto,IMPORTED_LOCATION>>\"
#define OPENSSL_CRYPTO_INTERFACE_INCLUDE_DIRECTORIES \"$<$<TARGET_EXISTS:OpenSSL::Crypto>:$<TARGET_PROPERTY:OpenSSL::Crypto,INTERFACE_INCLUDE_DIRECTORIES>>\"
#define OPENSSL_CRYPTO_INTERFACE_LINK_LIBRARIES \"$<$<TARGET_EXISTS:OpenSSL::Crypto>:$<TARGET_PROPERTY:OpenSSL::Crypto,INTERFACE_LINK_LIBRARIES>>\"
#define OPENSSL_PKG_CONFIG_INTERFACE_INCLUDE_DIRECTORIES \"$<$<TARGET_EXISTS:PkgConfig::PKG_CONFIG_OPENSSL>:$<TARGET_PROPERTY:PkgConfig::PKG_CONFIG_OPENSSL,INTERFACE_INCLUDE_DIRECTORIES>>\"
#define OPENSSL_PKG_CONFIG_INTERFACE_LINK_LIBRARIES \"$<$<TARGET_EXISTS:PkgConfig::PKG_CONFIG_OPENSSL>:$<TARGET_PROPERTY:PkgConfig::PKG_CONFIG_OPENSSL,INTERFACE_LINK_LIBRARIES>>\"

#define CMAKE_BUILD_TYPE \"${CMAKE_BUILD_TYPE}\"
#define CMAKE_VERSION \"${CMAKE_VERSION}\"
Expand Down
7 changes: 7 additions & 0 deletions cmake/test_openssl.cxx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include <openssl/crypto.h>

int
main()
{
return static_cast<int>(OpenSSL_version_num());
}
6 changes: 5 additions & 1 deletion core/crypto/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ target_link_libraries(couchbase_crypto PRIVATE project_options project_warnings)
target_include_directories(couchbase_crypto PRIVATE ../..)

if(NOT COUCHBASE_CXX_CLIENT_POST_LINKED_OPENSSL)
target_link_libraries(couchbase_crypto PUBLIC OpenSSL::SSL OpenSSL::Crypto)
if (TARGET PkgConfig::PKG_CONFIG_OPENSSL)
target_link_libraries(couchbase_crypto PUBLIC PkgConfig::PKG_CONFIG_OPENSSL)
else()
target_link_libraries(couchbase_crypto PUBLIC OpenSSL::SSL OpenSSL::Crypto)
endif()
endif()

if(WIN32)
Expand Down
12 changes: 7 additions & 5 deletions core/meta/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ target_link_libraries(
snappy
fmt::fmt
spdlog::spdlog)
target_include_directories(couchbase_meta PRIVATE
${PROJECT_BINARY_DIR}/generated
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/third_party/http_parser)
target_include_directories(couchbase_meta PRIVATE ${PROJECT_BINARY_DIR}/generated ${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/third_party/http_parser)

if(NOT COUCHBASE_CXX_CLIENT_POST_LINKED_OPENSSL)
target_link_libraries(couchbase_meta PUBLIC OpenSSL::SSL OpenSSL::Crypto)
if (TARGET PkgConfig::PKG_CONFIG_OPENSSL)
target_link_libraries(couchbase_meta PUBLIC PkgConfig::PKG_CONFIG_OPENSSL)
else()
target_link_libraries(couchbase_meta PUBLIC OpenSSL::SSL OpenSSL::Crypto)
endif()
endif()
19 changes: 19 additions & 0 deletions core/meta/version.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,28 @@ sdk_build_info()
info["openssl_runtime"] = OpenSSL_version(OPENSSL_VERSION);
#elif defined(SSLEAY_VERSION)
info["openssl_runtime"] = SSLeay_version(SSLEAY_VERSION);
#endif
#if defined(OPENSSL_INFO_CONFIG_DIR)
info["openssl_config_dir"] = OPENSSL_info(OPENSSL_INFO_CONFIG_DIR);
#elif defined(OPENSSL_DIR)
if (std::string config_dir(OpenSSL_version(OPENSSL_DIR)); !config_dir.empty()) {
if (auto quote = config_dir.find('"'); quote != std::string::npos && quote + 2 < config_dir.size()) {
info["openssl_config_dir"] = config_dir.substr(quote + 1, config_dir.size() - quote - 2);
} else {
info["openssl_config_dir"] = config_dir;
}
}
#endif
info["openssl_default_cert_dir"] = X509_get_default_cert_dir();
info["openssl_default_cert_file"] = X509_get_default_cert_file();
info["openssl_ssl_interface_include_directories"] = OPENSSL_SSL_INTERFACE_INCLUDE_DIRECTORIES;
info["openssl_ssl_interface_link_libraries"] = OPENSSL_SSL_INTERFACE_LINK_LIBRARIES;
info["openssl_ssl_imported_location"] = OPENSSL_SSL_IMPORTED_LOCATION;
info["openssl_crypto_interface_imported_location"] = OPENSSL_CRYPTO_IMPORTED_LOCATION;
info["openssl_crypto_interface_include_directories"] = OPENSSL_CRYPTO_INTERFACE_INCLUDE_DIRECTORIES;
info["openssl_crypto_interface_link_libraries"] = OPENSSL_CRYPTO_INTERFACE_LINK_LIBRARIES;
info["openssl_pkg_config_interface_include_directories"] = OPENSSL_PKG_CONFIG_INTERFACE_INCLUDE_DIRECTORIES;
info["openssl_pkg_config_interface_link_libraries"] = OPENSSL_PKG_CONFIG_INTERFACE_LINK_LIBRARIES;
info["__cplusplus"] = fmt::format("{}", __cplusplus);
#if defined(_MSC_VER)
info["_MSC_VER"] = fmt::format("{}", _MSC_VER);
Expand Down
20 changes: 12 additions & 8 deletions test/utils/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@ add_library(
uniq_id.cxx
wait_until.cxx)
set_target_properties(test_utils PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_link_libraries(test_utils PRIVATE project_options project_warnings OpenSSL::SSL fmt::fmt spdlog::spdlog)
target_link_libraries(test_utils PRIVATE project_options project_warnings fmt::fmt spdlog::spdlog)
target_include_directories(test_utils PRIVATE ${PROJECT_SOURCE_DIR})
if (MSVC)
target_compile_definitions(test_utils PRIVATE _CRT_SECURE_NO_WARNINGS)
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
target_compile_options(test_utils PUBLIC -Wno-deprecated-declarations)
endif ()
endif ()

if (TARGET PkgConfig::PKG_CONFIG_OPENSSL)
target_link_libraries(test_utils PUBLIC PkgConfig::PKG_CONFIG_OPENSSL)
else()
target_link_libraries(test_utils PUBLIC OpenSSL::SSL)
endif()
if(MSVC)
target_compile_definitions(test_utils PRIVATE _CRT_SECURE_NO_WARNINGS)
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
target_compile_options(test_utils PUBLIC -Wno-deprecated-declarations)
endif()
endif()