From 8e1a4c0405e555943ea78df4b57b423d705b078c Mon Sep 17 00:00:00 2001
From: Dan Villiom Podlaski Christiansen <danchr@gmail.com>
Date: Wed, 21 Oct 2020 16:48:38 +0200
Subject: [PATCH] Fix Autoconf checks on Darwin

The Autoconf checks merely verify that the symbol is available and
linkable, but not that it's actually defined and usable. This breaks
compilation on recent versions of macOS, where `lgamma_r()` is
unavailable unless `_REENTRANT` is defined. Since this is rather
difficult to detect, I strengthened the check so that it simple omits
lgamma_r on macOS.

While at it, I added support for `exp10()` on macOS, which is
available, but named `__exp10` due to its nonstandard nature.
---
 config/m4/check-math-func.m4 | 12 +++++++++++-
 configure.ac                 |  3 ++-
 src/libm.h                   |  4 ++++
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/config/m4/check-math-func.m4 b/config/m4/check-math-func.m4
index 5677cede..739da671 100644
--- a/config/m4/check-math-func.m4
+++ b/config/m4/check-math-func.m4
@@ -1,9 +1,19 @@
 dnl AC_CHECK_MATH_FUNC(func)
 AC_DEFUN([AC_CHECK_MATH_FUNC], [
   AC_LANG(C)
-  AC_CHECK_LIB([m],[$1],[
+  AC_MSG_CHECKING(for $1)
+  AC_LINK_IFELSE([AC_LANG_SOURCE([
+    #include <math.h>
+
+    int main() {
+      void *x = $1;
+      return !x;
+    }
+  ])], [
+    AC_MSG_RESULT(yes)
     eval "ac_tr_func=HAVE_[]upcase($1)"
     AC_DEFINE_UNQUOTED($ac_tr_func)
   ],[
+    AC_MSG_RESULT(no)
   ])
 ])
diff --git a/configure.ac b/configure.ac
index 0441d4a2..ad784a54 100644
--- a/configure.ac
+++ b/configure.ac
@@ -166,7 +166,8 @@ AC_CHECK_MATH_FUNC(cosh)
 AC_CHECK_MATH_FUNC(drem)
 AC_CHECK_MATH_FUNC(erf)
 AC_CHECK_MATH_FUNC(erfc)
-AC_CHECK_MATH_FUNC(exp10)
+AC_CHECK_MATH_FUNC(exp10) # nonstandard
+AC_CHECK_MATH_FUNC(__exp10) # available on darwin
 AC_CHECK_MATH_FUNC(exp2)
 AC_CHECK_MATH_FUNC(exp)
 AC_CHECK_MATH_FUNC(expm1)
diff --git a/src/libm.h b/src/libm.h
index b1db7882..4812947e 100644
--- a/src/libm.h
+++ b/src/libm.h
@@ -176,6 +176,10 @@ LIBM_DD_NO(erfc)
 #endif
 #if defined(HAVE_EXP10) && !defined(WIN32)
 LIBM_DD(exp10)
+#elif defined(HAVE___EXP10)
+#define exp10 __exp10
+LIBM_DD(exp10)
+#undef exp10
 #else
 LIBM_DD_NO(exp10)
 #endif