FindMPREAL.cmake 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. # Copyright (c) 2020 The Eigen Authors.
  15. # Redistribution and use is allowed according to the terms of the BSD license.
  16. include(CMakeFindDependencyMacro)
  17. find_dependency(MPFR)
  18. find_dependency(GMP)
  19. # Set MPREAL_INCLUDES
  20. find_path(MPREAL_INCLUDES
  21. NAMES
  22. mpreal.h
  23. PATHS
  24. $ENV{GMPDIR}
  25. ${INCLUDE_INSTALL_DIR}
  26. )
  27. # Set MPREAL_FIND_VERSION to 1.0.0 if no minimum version is specified
  28. if(NOT MPREAL_FIND_VERSION)
  29. if(NOT MPREAL_FIND_VERSION_MAJOR)
  30. set(MPREAL_FIND_VERSION_MAJOR 1)
  31. endif()
  32. if(NOT MPREAL_FIND_VERSION_MINOR)
  33. set(MPREAL_FIND_VERSION_MINOR 0)
  34. endif()
  35. if(NOT MPREAL_FIND_VERSION_PATCH)
  36. set(MPREAL_FIND_VERSION_PATCH 0)
  37. endif()
  38. set(MPREAL_FIND_VERSION "${MPREAL_FIND_VERSION_MAJOR}.${MPREAL_FIND_VERSION_MINOR}.${MPREAL_FIND_VERSION_PATCH}")
  39. endif()
  40. # Check bugs
  41. # - https://github.com/advanpix/mpreal/issues/7
  42. # - https://github.com/advanpix/mpreal/issues/9
  43. set(MPREAL_TEST_PROGRAM "
  44. #include <mpreal.h>
  45. #include <algorithm>
  46. int main(int argc, char** argv) {
  47. const mpfr::mpreal one = 1.0;
  48. const mpfr::mpreal zero = 0.0;
  49. using namespace std;
  50. const mpfr::mpreal smaller = min(one, zero);
  51. return 0;
  52. }")
  53. if(MPREAL_INCLUDES)
  54. # Set MPREAL_VERSION
  55. file(READ "${MPREAL_INCLUDES}/mpreal.h" _mpreal_version_header)
  56. string(REGEX MATCH "define[ \t]+MPREAL_VERSION_MAJOR[ \t]+([0-9]+)" _mpreal_major_version_match "${_mpreal_version_header}")
  57. set(MPREAL_MAJOR_VERSION "${CMAKE_MATCH_1}")
  58. string(REGEX MATCH "define[ \t]+MPREAL_VERSION_MINOR[ \t]+([0-9]+)" _mpreal_minor_version_match "${_mpreal_version_header}")
  59. set(MPREAL_MINOR_VERSION "${CMAKE_MATCH_1}")
  60. string(REGEX MATCH "define[ \t]+MPREAL_VERSION_PATCHLEVEL[ \t]+([0-9]+)" _mpreal_patchlevel_version_match "${_mpreal_version_header}")
  61. set(MPREAL_PATCHLEVEL_VERSION "${CMAKE_MATCH_1}")
  62. set(MPREAL_VERSION ${MPREAL_MAJOR_VERSION}.${MPREAL_MINOR_VERSION}.${MPREAL_PATCHLEVEL_VERSION})
  63. # Check whether found version exceeds minimum version
  64. if(${MPREAL_VERSION} VERSION_LESS ${MPREAL_FIND_VERSION})
  65. set(MPREAL_VERSION_OK FALSE)
  66. message(STATUS "MPREAL version ${MPREAL_VERSION} found in ${MPREAL_INCLUDES}, "
  67. "but at least version ${MPREAL_FIND_VERSION} is required")
  68. else()
  69. set(MPREAL_VERSION_OK TRUE)
  70. list(APPEND MPREAL_INCLUDES "${MPFR_INCLUDES}" "${GMP_INCLUDES}")
  71. list(REMOVE_DUPLICATES MPREAL_INCLUDES)
  72. list(APPEND MPREAL_LIBRARIES "${MPFR_LIBRARIES}" "${GMP_LIBRARIES}")
  73. list(REMOVE_DUPLICATES MPREAL_LIBRARIES)
  74. # Make sure it compiles with the current compiler.
  75. unset(MPREAL_WORKS CACHE)
  76. include(CheckCXXSourceCompiles)
  77. set(CMAKE_REQUIRED_INCLUDES "${MPREAL_INCLUDES}")
  78. set(CMAKE_REQUIRED_LIBRARIES "${MPREAL_LIBRARIES}")
  79. check_cxx_source_compiles("${MPREAL_TEST_PROGRAM}" MPREAL_WORKS)
  80. endif()
  81. endif()
  82. include(FindPackageHandleStandardArgs)
  83. find_package_handle_standard_args(MPREAL DEFAULT_MSG
  84. MPREAL_INCLUDES MPREAL_VERSION_OK MPREAL_WORKS)
  85. mark_as_advanced(MPREAL_INCLUDES)