Skip to content

Commit 807eadc

Browse files
committed
Improve support for custom OpenSSL selection
1 parent 45a46f3 commit 807eadc

File tree

3 files changed

+38
-6
lines changed

3 files changed

+38
-6
lines changed

CMakeLists.txt

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ option(QUIC_SKIP_CI_CHECKS "Disable CI specific build checks" OFF)
112112
option(QUIC_TELEMETRY_ASSERTS "Enable telemetry asserts in release builds" OFF)
113113
option(QUIC_USE_SYSTEM_LIBCRYPTO "Use system libcrypto if quictls TLS" OFF)
114114
option(QUIC_USE_EXTERNAL_OPENSSL "Use external OpenSSL instead of building from submodules" OFF)
115+
set(QUIC_OPENSSL_DIR "" CACHE PATH "Path to OpenSSL directory")
115116
set(QUIC_OPENSSL_INCLUDE_DIR "" CACHE PATH "Path to OpenSSL include directory")
116117
set(QUIC_OPENSSL_LIB_DIR "" CACHE PATH "Path to OpenSSL library directory")
117118
option(QUIC_HIGH_RES_TIMERS "Configure the system to use high resolution timers" OFF)
@@ -772,20 +773,38 @@ if(QUIC_TLS_LIB STREQUAL "quictls" OR QUIC_TLS_LIB STREQUAL "openssl")
772773
add_library(OpenSSLQuic INTERFACE)
773774
if(QUIC_OPENSSL_INCLUDE_DIR AND QUIC_OPENSSL_LIB_DIR)
774775
target_include_directories(OpenSSLQuic INTERFACE ${QUIC_OPENSSL_INCLUDE_DIR})
775-
find_library(LIB_CRYPTO NAMES crypto libcrypto PATHS ${QUIC_OPENSSL_LIB_DIR} NO_DEFAULT_PATH)
776+
if(BUILD_SHARED_LIBS)
777+
find_library(LIB_CRYPTO NAMES crypto libcrypto PATHS ${QUIC_OPENSSL_LIB_DIR} NO_DEFAULT_PATH)
778+
else()
779+
find_library(LIB_CRYPTO NAMES "crypto${CMAKE_STATIC_LIBRARY_SUFFIX}" "libcrypto${CMAKE_STATIC_LIBRARY_SUFFIX}" PATHS ${QUIC_OPENSSL_LIB_DIR} NO_DEFAULT_PATH)
780+
endif()
776781
if(NOT LIB_CRYPTO)
777782
message(FATAL_ERROR "libcrypto not found in ${QUIC_OPENSSL_LIB_DIR}")
778783
endif()
779-
find_library(LIB_SSL NAMES ssl libssl PATHS ${QUIC_OPENSSL_LIB_DIR} NO_DEFAULT_PATH)
784+
if(BUILD_SHARED_LIBS)
785+
find_library(LIB_SSL NAMES ssl libssl PATHS ${QUIC_OPENSSL_LIB_DIR} NO_DEFAULT_PATH)
786+
else()
787+
find_library(LIB_SSL NAMES "ssl${CMAKE_STATIC_LIBRARY_SUFFIX}" "libssl${CMAKE_STATIC_LIBRARY_SUFFIX}" PATHS ${QUIC_OPENSSL_LIB_DIR} NO_DEFAULT_PATH)
788+
endif()
780789
if(NOT LIB_SSL)
781790
message(FATAL_ERROR "libssl not found in ${QUIC_OPENSSL_LIB_DIR}")
782791
endif()
783792
target_link_libraries(OpenSSLQuic INTERFACE ${LIB_SSL} ${LIB_CRYPTO})
784793
elseif(QUIC_OPENSSL_INCLUDE_DIR OR QUIC_OPENSSL_LIB_DIR)
785794
message(FATAL_ERROR "Both QUIC_OPENSSL_INCLUDE_DIR and QUIC_OPENSSL_LIB_DIR must be set to select custom OpenSSL version.")
786795
else()
796+
if(QUIC_OPENSSL_DIR)
797+
set(OPENSSL_ROOT_DIR "${QUIC_OPENSSL_DIR}")
798+
endif()
799+
if(NOT BUILD_SHARED_LIBS)
800+
set(OPENSSL_USE_STATIC_LIBS TRUE)
801+
endif()
787802
find_package(OpenSSL 3.5.0 REQUIRED)
788-
target_link_libraries(OpenSSLQuic INTERFACE OpenSSL::SSL OpenSSL::Crypto)
803+
# OpenSSL::SSL and OpenSSL::Crypto imported targets include their dependencies such as zstd.
804+
# However, these dependencies will be linked in src/platform/CMakeLists.txt,
805+
# so link only the main OpenSSL targets here to avoid duplication.
806+
target_include_directories(OpenSSLQuic INTERFACE ${OPENSSL_INCLUDE_DIR})
807+
target_link_libraries(OpenSSLQuic INTERFACE ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
789808
endif()
790809
add_library(MsQuic::OpenSSL ALIAS OpenSSLQuic)
791810
else()

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ find = []
9090
# This feature enables quictls on windows, and has no effect on linux.
9191
# This feature enables openssl on windows, and has no effect on linux.
9292
openssl = []
93+
openssl-external = []
9394
quictls = []
9495
static = ["src"]
9596
preview-api = []

scripts/build.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@ fn cmake_build() {
2929
let target = env::var("TARGET").unwrap().replace("\\", "/");
3030
let out_dir = env::var("OUT_DIR").unwrap().replace("\\", "/");
3131
// The output directory for the native MsQuic library.
32-
let libdir = "/lib";
33-
let full_out_dir = [out_dir, libdir.to_string()].join("");
34-
let quic_output_dir = Path::new(&full_out_dir);
32+
let quic_output_dir = Path::new(&out_dir).join("artifacts");
3533

3634
// Builds the native MsQuic and installs it into $OUT_DIR.
3735
let mut config = Config::new(".");
@@ -50,6 +48,20 @@ fn cmake_build() {
5048
config.define("QUIC_TLS_LIB", "quictls");
5149
} else if cfg!(feature = "openssl") {
5250
config.define("QUIC_TLS_LIB", "openssl");
51+
} else if cfg!(feature = "openssl-external") {
52+
config
53+
.define("QUIC_TLS_LIB", "openssl")
54+
.define("QUIC_USE_EXTERNAL_OPENSSL", "on");
55+
if let Ok(openssl_dir) = std::env::var("OPENSSL_DIR") {
56+
config.define("QUIC_OPENSSL_DIR", openssl_dir);
57+
} else {
58+
if let Ok(openssl_include_dir) = std::env::var("OPENSSL_INCLUDE_DIR") {
59+
config.define("QUIC_OPENSSL_INCLUDE_DIR", openssl_include_dir);
60+
}
61+
if let Ok(openssl_lib_dir) = std::env::var("OPENSSL_LIB_DIR") {
62+
config.define("QUIC_OPENSSL_LIB_DIR", openssl_lib_dir);
63+
}
64+
}
5365
} else if cfg!(windows) {
5466
config.define("QUIC_TLS_LIB", "schannel");
5567
} else {

0 commit comments

Comments
 (0)