| # Try to find the MPFR C++ (MPREAL) library |
| # See http://www.holoborodko.com/pavel/mpreal/ |
| # |
| # This module supports requiring a minimum version, e.g. you can do |
| # find_package(MPREAL 1.8.6) |
| # to require version 1.8.6 or newer of MPREAL C++. |
| # |
| # Once done this will define |
| # |
| # MPREAL_FOUND - system has MPREAL lib with correct version |
| # MPREAL_INCLUDES - MPREAL required include directories |
| # MPREAL_LIBRARIES - MPREAL required libraries |
| # MPREAL_VERSION - MPREAL version |
| |
| # Copyright (c) 2020 The Eigen Authors. |
| # Redistribution and use is allowed according to the terms of the BSD license. |
| |
| include(CMakeFindDependencyMacro) |
| find_dependency(MPFR) |
| find_dependency(GMP) |
| |
| # Set MPREAL_INCLUDES |
| find_path(MPREAL_INCLUDES |
| NAMES |
| mpreal.h |
| PATHS |
| $ENV{GMPDIR} |
| ${INCLUDE_INSTALL_DIR} |
| ) |
| |
| # Set MPREAL_FIND_VERSION to 1.0.0 if no minimum version is specified |
| |
| if(NOT MPREAL_FIND_VERSION) |
| if(NOT MPREAL_FIND_VERSION_MAJOR) |
| set(MPREAL_FIND_VERSION_MAJOR 1) |
| endif() |
| if(NOT MPREAL_FIND_VERSION_MINOR) |
| set(MPREAL_FIND_VERSION_MINOR 0) |
| endif() |
| if(NOT MPREAL_FIND_VERSION_PATCH) |
| set(MPREAL_FIND_VERSION_PATCH 0) |
| endif() |
| |
| set(MPREAL_FIND_VERSION "${MPREAL_FIND_VERSION_MAJOR}.${MPREAL_FIND_VERSION_MINOR}.${MPREAL_FIND_VERSION_PATCH}") |
| endif() |
| |
| # Check bugs |
| # - https://github.com/advanpix/mpreal/issues/7 |
| # - https://github.com/advanpix/mpreal/issues/9 |
| set(MPREAL_TEST_PROGRAM " |
| #include <mpreal.h> |
| #include <algorithm> |
| int main(int argc, char** argv) { |
| const mpfr::mpreal one = 1.0; |
| const mpfr::mpreal zero = 0.0; |
| using namespace std; |
| const mpfr::mpreal smaller = min(one, zero); |
| return 0; |
| }") |
| |
| if(MPREAL_INCLUDES) |
| |
| # Set MPREAL_VERSION |
| |
| file(READ "${MPREAL_INCLUDES}/mpreal.h" _mpreal_version_header) |
| |
| string(REGEX MATCH "define[ \t]+MPREAL_VERSION_MAJOR[ \t]+([0-9]+)" _mpreal_major_version_match "${_mpreal_version_header}") |
| set(MPREAL_MAJOR_VERSION "${CMAKE_MATCH_1}") |
| string(REGEX MATCH "define[ \t]+MPREAL_VERSION_MINOR[ \t]+([0-9]+)" _mpreal_minor_version_match "${_mpreal_version_header}") |
| set(MPREAL_MINOR_VERSION "${CMAKE_MATCH_1}") |
| string(REGEX MATCH "define[ \t]+MPREAL_VERSION_PATCHLEVEL[ \t]+([0-9]+)" _mpreal_patchlevel_version_match "${_mpreal_version_header}") |
| set(MPREAL_PATCHLEVEL_VERSION "${CMAKE_MATCH_1}") |
| |
| set(MPREAL_VERSION ${MPREAL_MAJOR_VERSION}.${MPREAL_MINOR_VERSION}.${MPREAL_PATCHLEVEL_VERSION}) |
| |
| # Check whether found version exceeds minimum version |
| |
| if(${MPREAL_VERSION} VERSION_LESS ${MPREAL_FIND_VERSION}) |
| set(MPREAL_VERSION_OK FALSE) |
| message(STATUS "MPREAL version ${MPREAL_VERSION} found in ${MPREAL_INCLUDES}, " |
| "but at least version ${MPREAL_FIND_VERSION} is required") |
| else() |
| set(MPREAL_VERSION_OK TRUE) |
| |
| list(APPEND MPREAL_INCLUDES "${MPFR_INCLUDES}" "${GMP_INCLUDES}") |
| list(REMOVE_DUPLICATES MPREAL_INCLUDES) |
| |
| list(APPEND MPREAL_LIBRARIES "${MPFR_LIBRARIES}" "${GMP_LIBRARIES}") |
| list(REMOVE_DUPLICATES MPREAL_LIBRARIES) |
| |
| # Make sure it compiles with the current compiler. |
| unset(MPREAL_WORKS CACHE) |
| include(CheckCXXSourceCompiles) |
| set(CMAKE_REQUIRED_INCLUDES "${MPREAL_INCLUDES}") |
| set(CMAKE_REQUIRED_LIBRARIES "${MPREAL_LIBRARIES}") |
| check_cxx_source_compiles("${MPREAL_TEST_PROGRAM}" MPREAL_WORKS) |
| endif() |
| endif() |
| |
| include(FindPackageHandleStandardArgs) |
| find_package_handle_standard_args(MPREAL DEFAULT_MSG |
| MPREAL_INCLUDES MPREAL_VERSION_OK MPREAL_WORKS) |
| mark_as_advanced(MPREAL_INCLUDES) |