| # 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. | |
| # | |
| # ============================================================================= | |
| # FetchBoost.cmake | |
| # | |
| # Resolves the location of Boost headers needed at thrift / iotdb_session | |
| # compile time, in three stages: | |
| # | |
| # 1. Use system / user-provided Boost (find_package, BOOST_ROOT, etc.). | |
| # 2. Fall back to a local tarball under ${IOTDB_OS_DEPS_DIR}/. | |
| # 3. Otherwise download the tarball from archives.boost.io (unless | |
| # IOTDB_OFFLINE is ON). | |
| # | |
| # Output (cache) variables: | |
| # BOOST_INCLUDE_DIR - directory containing <boost/...> headers. | |
| # ============================================================================= | |
| if(DEFINED BOOST_INCLUDE_DIR AND EXISTS "${BOOST_INCLUDE_DIR}/boost/version.hpp") | |
| message(STATUS "[Boost] reusing cached BOOST_INCLUDE_DIR=${BOOST_INCLUDE_DIR}") | |
| return() | |
| endif() | |
| # --------------------------------------------------------------------------- | |
| # Stage 1: find_package(Boost) - respects BOOST_ROOT / Boost_INCLUDE_DIR | |
| # --------------------------------------------------------------------------- | |
| find_package(Boost QUIET) | |
| if(Boost_FOUND AND Boost_INCLUDE_DIRS) | |
| set(BOOST_INCLUDE_DIR "${Boost_INCLUDE_DIRS}" CACHE PATH "Boost include directory" FORCE) | |
| message(STATUS "[Boost] using system Boost at ${BOOST_INCLUDE_DIR}") | |
| return() | |
| endif() | |
| # Allow plain -DBOOST_INCLUDEDIR= / -DBoost_INCLUDE_DIR= as a fast path. | |
| foreach(_hint Boost_INCLUDE_DIR BOOST_INCLUDEDIR BOOST_ROOT) | |
| if(DEFINED ${_hint}) | |
| set(_candidate "${${_hint}}") | |
| if(EXISTS "${_candidate}/boost/version.hpp") | |
| set(BOOST_INCLUDE_DIR "${_candidate}" CACHE PATH "Boost include directory" FORCE) | |
| message(STATUS "[Boost] using hinted path ${BOOST_INCLUDE_DIR}") | |
| return() | |
| elseif(EXISTS "${_candidate}/include/boost/version.hpp") | |
| set(BOOST_INCLUDE_DIR "${_candidate}/include" CACHE PATH "Boost include directory" FORCE) | |
| message(STATUS "[Boost] using hinted path ${BOOST_INCLUDE_DIR}") | |
| return() | |
| endif() | |
| endif() | |
| endforeach() | |
| # --------------------------------------------------------------------------- | |
| # Stage 2: local tarball cache | |
| # --------------------------------------------------------------------------- | |
| string(REPLACE "." "_" _boost_us "${BOOST_VERSION}") | |
| set(_boost_dirname "boost_${_boost_us}") | |
| set(_boost_tarname_gz "${_boost_dirname}.tar.gz") | |
| set(_boost_tarname_zip "${_boost_dirname}.zip") | |
| set(_boost_tarball "") | |
| foreach(_name IN ITEMS ${_boost_tarname_gz} ${_boost_tarname_zip}) | |
| if(EXISTS "${IOTDB_OS_DEPS_DIR}/${_name}") | |
| set(_boost_tarball "${IOTDB_OS_DEPS_DIR}/${_name}") | |
| break() | |
| endif() | |
| endforeach() | |
| # --------------------------------------------------------------------------- | |
| # Stage 3: download | |
| # --------------------------------------------------------------------------- | |
| if(NOT _boost_tarball) | |
| if(IOTDB_OFFLINE) | |
| message(FATAL_ERROR | |
| "[Boost] IOTDB_OFFLINE=ON but no Boost tarball found in " | |
| "${IOTDB_OS_DEPS_DIR}. Expected one of: ${_boost_tarname_gz}, ${_boost_tarname_zip}.") | |
| endif() | |
| set(_boost_url "https://archives.boost.io/release/${BOOST_VERSION}/source/${_boost_tarname_gz}") | |
| set(_boost_tarball "${IOTDB_OS_DEPS_DIR}/${_boost_tarname_gz}") | |
| message(STATUS "[Boost] downloading ${_boost_url}") | |
| file(DOWNLOAD "${_boost_url}" "${_boost_tarball}" | |
| SHOW_PROGRESS | |
| STATUS _boost_dl_status | |
| TLS_VERIFY ON) | |
| list(GET _boost_dl_status 0 _boost_dl_code) | |
| if(NOT _boost_dl_code EQUAL 0) | |
| list(GET _boost_dl_status 1 _boost_dl_msg) | |
| file(REMOVE "${_boost_tarball}") | |
| message(FATAL_ERROR "[Boost] download failed: ${_boost_dl_msg}") | |
| endif() | |
| endif() | |
| # --------------------------------------------------------------------------- | |
| # Extract headers-only into ${CMAKE_BINARY_DIR}/_deps/boost | |
| # --------------------------------------------------------------------------- | |
| set(_boost_extract_dir "${CMAKE_BINARY_DIR}/_deps/boost") | |
| set(_boost_marker "${_boost_extract_dir}/.extracted-${BOOST_VERSION}") | |
| if(NOT EXISTS "${_boost_marker}") | |
| file(REMOVE_RECURSE "${_boost_extract_dir}") | |
| file(MAKE_DIRECTORY "${_boost_extract_dir}") | |
| message(STATUS "[Boost] extracting ${_boost_tarball}") | |
| file(ARCHIVE_EXTRACT | |
| INPUT "${_boost_tarball}" | |
| DESTINATION "${_boost_extract_dir}") | |
| file(TOUCH "${_boost_marker}") | |
| endif() | |
| set(BOOST_INCLUDE_DIR "${_boost_extract_dir}/${_boost_dirname}" | |
| CACHE PATH "Boost include directory" FORCE) | |
| if(NOT EXISTS "${BOOST_INCLUDE_DIR}/boost/version.hpp") | |
| message(FATAL_ERROR | |
| "[Boost] Could not locate boost/version.hpp after extraction. " | |
| "Looked in: ${BOOST_INCLUDE_DIR}") | |
| endif() | |
| message(STATUS "[Boost] BOOST_INCLUDE_DIR = ${BOOST_INCLUDE_DIR}") |