cart-elc

Source code for CART-ELC
git clone git://git.laack.co/cart-elc.git
Log | Files | Refs | README | LICENSE

FindMPREAL.cmake (3524B)


      1 # Try to find the MPFR C++ (MPREAL) library
      2 # See http://www.holoborodko.com/pavel/mpreal/
      3 #
      4 # This module supports requiring a minimum version, e.g. you can do
      5 #   find_package(MPREAL 1.8.6)
      6 # to require version 1.8.6 or newer of MPREAL C++.
      7 #
      8 # Once done this will define
      9 #
     10 #  MPREAL_FOUND - system has MPREAL lib with correct version
     11 #  MPREAL_INCLUDES - MPREAL required include directories
     12 #  MPREAL_LIBRARIES - MPREAL required libraries
     13 #  MPREAL_VERSION - MPREAL version
     14 
     15 # Copyright (c) 2020 The Eigen Authors.
     16 # Redistribution and use is allowed according to the terms of the BSD license.
     17 
     18 include(CMakeFindDependencyMacro)
     19 find_dependency(MPFR)
     20 find_dependency(GMP)
     21 
     22 # Set MPREAL_INCLUDES
     23 find_path(MPREAL_INCLUDES
     24   NAMES
     25   mpreal.h
     26   PATHS
     27   $ENV{GMPDIR}
     28   ${INCLUDE_INSTALL_DIR}
     29 )
     30 
     31 # Set MPREAL_FIND_VERSION to 1.0.0 if no minimum version is specified
     32 
     33 if(NOT MPREAL_FIND_VERSION)
     34   if(NOT MPREAL_FIND_VERSION_MAJOR)
     35     set(MPREAL_FIND_VERSION_MAJOR 1)
     36   endif()
     37   if(NOT MPREAL_FIND_VERSION_MINOR)
     38     set(MPREAL_FIND_VERSION_MINOR 0)
     39   endif()
     40   if(NOT MPREAL_FIND_VERSION_PATCH)
     41     set(MPREAL_FIND_VERSION_PATCH 0)
     42   endif()
     43 
     44   set(MPREAL_FIND_VERSION "${MPREAL_FIND_VERSION_MAJOR}.${MPREAL_FIND_VERSION_MINOR}.${MPREAL_FIND_VERSION_PATCH}")
     45 endif()
     46 
     47 # Check bugs
     48 # - https://github.com/advanpix/mpreal/issues/7
     49 # - https://github.com/advanpix/mpreal/issues/9
     50 set(MPREAL_TEST_PROGRAM "
     51 #include <mpreal.h>
     52 #include <algorithm>
     53 int main(int argc, char** argv) {
     54   const mpfr::mpreal one  =    1.0;
     55   const mpfr::mpreal zero =    0.0;
     56   using namespace std;
     57   const mpfr::mpreal smaller = min(one, zero);
     58   return 0;
     59 }")
     60 
     61 if(MPREAL_INCLUDES)
     62 
     63   # Set MPREAL_VERSION
     64   
     65   file(READ "${MPREAL_INCLUDES}/mpreal.h" _mpreal_version_header)
     66   
     67   string(REGEX MATCH "define[ \t]+MPREAL_VERSION_MAJOR[ \t]+([0-9]+)" _mpreal_major_version_match "${_mpreal_version_header}")
     68   set(MPREAL_MAJOR_VERSION "${CMAKE_MATCH_1}")
     69   string(REGEX MATCH "define[ \t]+MPREAL_VERSION_MINOR[ \t]+([0-9]+)" _mpreal_minor_version_match "${_mpreal_version_header}")
     70   set(MPREAL_MINOR_VERSION "${CMAKE_MATCH_1}")
     71   string(REGEX MATCH "define[ \t]+MPREAL_VERSION_PATCHLEVEL[ \t]+([0-9]+)" _mpreal_patchlevel_version_match "${_mpreal_version_header}")
     72   set(MPREAL_PATCHLEVEL_VERSION "${CMAKE_MATCH_1}")
     73   
     74   set(MPREAL_VERSION ${MPREAL_MAJOR_VERSION}.${MPREAL_MINOR_VERSION}.${MPREAL_PATCHLEVEL_VERSION})
     75   
     76   # Check whether found version exceeds minimum version
     77   
     78   if(${MPREAL_VERSION} VERSION_LESS ${MPREAL_FIND_VERSION})
     79     set(MPREAL_VERSION_OK FALSE)
     80     message(STATUS "MPREAL version ${MPREAL_VERSION} found in ${MPREAL_INCLUDES}, "
     81                    "but at least version ${MPREAL_FIND_VERSION} is required")
     82   else()
     83     set(MPREAL_VERSION_OK TRUE)
     84     
     85     list(APPEND MPREAL_INCLUDES "${MPFR_INCLUDES}" "${GMP_INCLUDES}")
     86     list(REMOVE_DUPLICATES MPREAL_INCLUDES)
     87     
     88     list(APPEND MPREAL_LIBRARIES "${MPFR_LIBRARIES}" "${GMP_LIBRARIES}")
     89     list(REMOVE_DUPLICATES MPREAL_LIBRARIES)
     90     
     91     # Make sure it compiles with the current compiler.
     92     unset(MPREAL_WORKS CACHE)
     93     include(CheckCXXSourceCompiles)
     94     set(CMAKE_REQUIRED_INCLUDES "${MPREAL_INCLUDES}")
     95     set(CMAKE_REQUIRED_LIBRARIES "${MPREAL_LIBRARIES}")
     96     check_cxx_source_compiles("${MPREAL_TEST_PROGRAM}" MPREAL_WORKS)
     97   endif()
     98 endif()
     99 
    100 include(FindPackageHandleStandardArgs)
    101 find_package_handle_standard_args(MPREAL DEFAULT_MSG
    102                                   MPREAL_INCLUDES MPREAL_VERSION_OK MPREAL_WORKS)
    103 mark_as_advanced(MPREAL_INCLUDES)