mirror of https://gitee.com/bigwinds/arangodb
155 lines
5.8 KiB
CMake
155 lines
5.8 KiB
CMake
# Copyright Louis Dionne 2013-2016
|
|
# Distributed under the Boost Software License, Version 1.0.
|
|
# (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
|
|
#
|
|
#
|
|
# This CMake module finds the Hana library. It sets the following CMake
|
|
# variables:
|
|
#
|
|
# Hana_FOUND
|
|
# Set to 1 when Hana is found, set to 0 otherwise.
|
|
#
|
|
# Hana_INCLUDE_DIRS
|
|
# If Hana is found, this is a list containing Hana's include/ directory,
|
|
# along with that of any dependency of Hana. Since Hana has no external
|
|
# dependencies as a library, this will always contain only Hana's include/
|
|
# directory. This is provided for consistency with normal CMake Find-modules.
|
|
# If Hana is not found, this is not set.
|
|
#
|
|
#
|
|
# The following variables can be used to customize the behavior of the module:
|
|
#
|
|
# Hana_ROOT
|
|
# The path to Hana's installation prefix. If this is specified, this prefix
|
|
# will be searched first while looking for Hana. If Hana is not found in
|
|
# this prefix, the usual system directories are searched.
|
|
#
|
|
# Hana_INSTALL_PREFIX
|
|
# If Hana can't be found and this is set to something, Hana will be downloaded
|
|
# and installed to that directory. This can be very useful for installing
|
|
# Hana as a local dependency of the current project. A suggestion is to set
|
|
# `Hana_INSTALL_PREFIX` to `project_root/ext/hana`, and to Git-ignore the
|
|
# whole `ext/` subdirectory, to avoid tracking external dependencies in
|
|
# source control. Note that when `Hana_INSTALL_PREFIX` is specified, the
|
|
# version of Hana must be provided explicitly to `find_package`.
|
|
#
|
|
# Hana_ENABLE_TESTS
|
|
# If Hana is installed as an external project and this is set to true, the
|
|
# tests will be run whenever Hana is updated. By default, this is set to
|
|
# false because the tests tend to be quite long.
|
|
|
|
|
|
##############################################################################
|
|
# Sanitize input variables
|
|
##############################################################################
|
|
if (DEFINED Hana_FIND_VERSION AND "${Hana_FIND_VERSION}" VERSION_LESS "0.6.0")
|
|
message(FATAL_ERROR
|
|
"This FindHana.cmake module may not be used with Hana < 0.6.0, "
|
|
"because Hana did not carry version information before that.")
|
|
endif()
|
|
|
|
if (DEFINED Hana_INSTALL_PREFIX AND NOT DEFINED Hana_FIND_VERSION)
|
|
message(FATAL_ERROR
|
|
"The version of Hana must be specified when cloning locally. "
|
|
"Otherwise, we wouldn't know which version to clone.")
|
|
endif()
|
|
|
|
|
|
##############################################################################
|
|
# First, try to find the library locally (using Hana_ROOT as a hint, if provided)
|
|
##############################################################################
|
|
find_path(Hana_INCLUDE_DIR
|
|
NAMES boost/hana.hpp
|
|
HINTS "${Hana_ROOT}/include"
|
|
DOC "Include directory for the Hana library"
|
|
)
|
|
|
|
# Extract Hana's version from <boost/hana/version.hpp>, and set
|
|
# Hana_VERSION_XXX variables accordingly.
|
|
if (EXISTS "${Hana_INCLUDE_DIR}")
|
|
foreach(level MAJOR MINOR PATCH)
|
|
file(STRINGS
|
|
${Hana_INCLUDE_DIR}/boost/hana/version.hpp
|
|
Hana_VERSION_${level}
|
|
REGEX "#define BOOST_HANA_${level}_VERSION"
|
|
)
|
|
string(REGEX MATCH "([0-9]+)" Hana_VERSION_${level} "${Hana_VERSION_${level}}")
|
|
endforeach()
|
|
|
|
set(Hana_VERSION_STRING "${Hana_VERSION_MAJOR}.${Hana_VERSION_MINOR}.${Hana_VERSION_PATCH}")
|
|
endif()
|
|
|
|
# Temporarily override the quietness level to avoid producing a "not-found"
|
|
# message when we're going to install anyway.
|
|
if (Hana_INSTALL_PREFIX)
|
|
set(_hana_quiet_level ${Hana_FIND_QUIETLY})
|
|
set(Hana_FIND_QUIETLY 1)
|
|
endif()
|
|
include(FindPackageHandleStandardArgs)
|
|
find_package_handle_standard_args(Hana
|
|
REQUIRED_VARS Hana_INCLUDE_DIR
|
|
VERSION_VAR Hana_VERSION_STRING
|
|
)
|
|
if (Hana_INSTALL_PREFIX)
|
|
set(Hana_FIND_QUIETLY ${_hana_quiet_level})
|
|
endif()
|
|
|
|
if (Hana_FOUND)
|
|
set(Hana_INCLUDE_DIRS "${Hana_INCLUDE_DIR}")
|
|
return()
|
|
endif()
|
|
|
|
|
|
##############################################################################
|
|
# Otherwise, if Hana_INSTALL_PREFIX was specified, try to install the library.
|
|
##############################################################################
|
|
if (NOT Hana_FOUND AND DEFINED Hana_INSTALL_PREFIX)
|
|
if (DEFINED Hana_ENABLE_TESTS)
|
|
set(_hana_test_cmd ${CMAKE_COMMAND} --build ${CMAKE_CURRENT_BINARY_DIR}/hana --target check)
|
|
endif()
|
|
|
|
include(ExternalProject)
|
|
ExternalProject_Add(Hana EXCLUDE_FROM_ALL 1
|
|
SOURCE_DIR ${Hana_INSTALL_PREFIX}
|
|
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/hana
|
|
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/hana
|
|
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/hana/_download
|
|
STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/hana/_stamps
|
|
TMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/hana/_tmp
|
|
|
|
# Download step
|
|
DOWNLOAD_NAME "hana-v${Hana_FIND_VERSION}.tar.gz"
|
|
URL "https://github.com/boostorg/hana/tarball/v${Hana_FIND_VERSION}"
|
|
TIMEOUT 20
|
|
|
|
# Configure step
|
|
CMAKE_ARGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
|
|
|
|
# No build step because Hana is header-only
|
|
BUILD_COMMAND ""
|
|
|
|
# No install step
|
|
INSTALL_COMMAND ""
|
|
|
|
# Test step
|
|
TEST_COMMAND ${_hana_test_cmd}
|
|
)
|
|
|
|
if ("${Hana_FIND_VERSION}" MATCHES "([0-9]+)\\.([0-9]+)\\.([0-9]+)")
|
|
set(Hana_VERSION_MAJOR ${CMAKE_MATCH_1})
|
|
set(Hana_VERSION_MINOR ${CMAKE_MATCH_2})
|
|
set(Hana_VERSION_PATCH ${CMAKE_MATCH_3})
|
|
set(Hana_VERSION_STRING "${Hana_VERSION_MAJOR}.${Hana_VERSION_MINOR}.${Hana_VERSION_PATCH}")
|
|
endif()
|
|
|
|
set(Hana_INCLUDE_DIR "${Hana_INSTALL_PREFIX}/include")
|
|
find_package_handle_standard_args(Hana
|
|
REQUIRED_VARS Hana_INCLUDE_DIR
|
|
VERSION_VAR Hana_VERSION_STRING
|
|
)
|
|
|
|
if (Hana_FOUND)
|
|
set(Hana_INCLUDE_DIRS "${Hana_INCLUDE_DIR}")
|
|
endif()
|
|
endif()
|