blob: 575e2803f2bd46d88dd9d3a4dd722045d6eefc75 [file]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
# =============================================================================
# FetchOpenSSL.cmake (only included when WITH_SSL=ON)
#
# Resolution order:
# 1. find_package(OpenSSL) - any system / vendor install is taken as-is.
# 2. On Linux/macOS:
# use tarball ${IOTDB_OS_DEPS_DIR}/openssl-${OPENSSL_VERSION}.tar.gz
# or download from openssl.org when not in offline mode, then
# ./Configure && make && make install_sw into ${CMAKE_BINARY_DIR}/_deps/openssl.
# 3. On Windows: emit a FATAL_ERROR with instructions to run the bundled
# Win64OpenSSL installer (or any other prebuilt OpenSSL); building
# OpenSSL from source on MSVC is out of scope.
#
# Side effects:
# Defines imported targets OpenSSL::SSL / OpenSSL::Crypto via find_package
# so callers can just link against them.
# =============================================================================
set(OPENSSL_VERSION "3.5.0" CACHE STRING "OpenSSL version to fetch when missing")
find_package(OpenSSL QUIET)
if(OpenSSL_FOUND)
message(STATUS "[OpenSSL] using system OpenSSL ${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}")
return()
endif()
if(WIN32)
message(FATAL_ERROR
"[OpenSSL] WITH_SSL=ON but no OpenSSL was found on Windows. "
"Please run third-party/windows/Win64OpenSSL-3_5_0.exe (or any "
"OpenSSL installer), then re-run the configure step with "
"-DOPENSSL_ROOT_DIR=<install_path>.")
endif()
# --- Linux / macOS fallback: build from source ---------------------------
set(_ossl_tarname "openssl-${OPENSSL_VERSION}.tar.gz")
set(_ossl_tarball "${IOTDB_OS_DEPS_DIR}/${_ossl_tarname}")
if(NOT EXISTS "${_ossl_tarball}")
if(IOTDB_OFFLINE)
message(FATAL_ERROR
"[OpenSSL] IOTDB_OFFLINE=ON but ${_ossl_tarname} is missing in ${IOTDB_OS_DEPS_DIR}.")
endif()
set(_ossl_url "https://www.openssl.org/source/${_ossl_tarname}")
message(STATUS "[OpenSSL] downloading ${_ossl_url}")
file(DOWNLOAD "${_ossl_url}" "${_ossl_tarball}"
SHOW_PROGRESS TLS_VERIFY ON STATUS _st)
list(GET _st 0 _code)
if(NOT _code EQUAL 0)
list(GET _st 1 _msg)
file(REMOVE "${_ossl_tarball}")
message(FATAL_ERROR "[OpenSSL] download failed: ${_msg}")
endif()
endif()
set(_ossl_root "${CMAKE_BINARY_DIR}/_deps/openssl")
set(_ossl_src "${_ossl_root}/src/openssl-${OPENSSL_VERSION}")
set(_ossl_inst "${_ossl_root}/install")
set(_ossl_stamp "${_ossl_root}/.built-${OPENSSL_VERSION}")
if(NOT EXISTS "${_ossl_stamp}")
file(REMOVE_RECURSE "${_ossl_root}/src")
file(MAKE_DIRECTORY "${_ossl_root}/src")
message(STATUS "[OpenSSL] extracting ${_ossl_tarball}")
file(ARCHIVE_EXTRACT INPUT "${_ossl_tarball}" DESTINATION "${_ossl_root}/src")
include(ProcessorCount)
ProcessorCount(_jobs)
if(_jobs LESS 1)
set(_jobs 1)
endif()
message(STATUS "[OpenSSL] configuring -> ${_ossl_inst}")
execute_process(
COMMAND ./Configure --prefix=${_ossl_inst} --openssldir=${_ossl_inst}/ssl no-shared
WORKING_DIRECTORY "${_ossl_src}"
RESULT_VARIABLE _rc)
if(NOT _rc EQUAL 0)
message(FATAL_ERROR "[OpenSSL] Configure failed (rc=${_rc})")
endif()
message(STATUS "[OpenSSL] building (-j${_jobs})")
execute_process(
COMMAND make -j${_jobs}
WORKING_DIRECTORY "${_ossl_src}"
RESULT_VARIABLE _rc)
if(NOT _rc EQUAL 0)
message(FATAL_ERROR "[OpenSSL] make failed (rc=${_rc})")
endif()
execute_process(
COMMAND make install_sw
WORKING_DIRECTORY "${_ossl_src}"
RESULT_VARIABLE _rc)
if(NOT _rc EQUAL 0)
message(FATAL_ERROR "[OpenSSL] make install_sw failed (rc=${_rc})")
endif()
file(TOUCH "${_ossl_stamp}")
endif()
set(OPENSSL_ROOT_DIR "${_ossl_inst}" CACHE PATH "OpenSSL root" FORCE)
set(OPENSSL_USE_STATIC_LIBS ON)
find_package(OpenSSL REQUIRED)
message(STATUS "[OpenSSL] built locally at ${OPENSSL_ROOT_DIR}")