summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChun-wei Fan <fanchunwei@src.gnome.org>2016-05-09 16:37:39 +0800
committerChun-wei Fan <fanchunwei@src.gnome.org>2016-05-10 17:14:07 +0800
commit092cb9e202a9f654152bc5fbb276521817346d11 (patch)
tree994776b3fb72a339bdb8c3281f3a92d25b46d7d4
parent7a0941c0908df71ce5f11f76537c288ef0cba26b (diff)
downloadgtk+-092cb9e202a9f654152bc5fbb276521817346d11.tar.gz
GTK: Fix build for pre-C99 compilers
Some compilers we support, such as pre-2013 Visual Studio, does not support for INIFINITY, log2() and exp2(), so check for exp2() and log2() during configure, and use fallbacks for them and INIFINTY if they are not found. https://bugzilla.gnome.org/show_bug.cgi?id=766207
-rw-r--r--config.h.win32.in10
-rw-r--r--configure.ac2
-rw-r--r--gtk/fallback-c89.c27
-rw-r--r--gtk/gtkprogressbar.c3
-rw-r--r--gtk/inspector/visual.c2
5 files changed, 41 insertions, 3 deletions
diff --git a/config.h.win32.in b/config.h.win32.in
index 8269db73e2..a73067e420 100644
--- a/config.h.win32.in
+++ b/config.h.win32.in
@@ -50,6 +50,11 @@
/* Define to 1 if you have the <dlfcn.h> header file. */
/* #undef HAVE_DLFCN_H */
+/* Define to 1 if you have the `exp2' function. */
+#if !defined (_MSC_VER) || (_MSC_VER >= 1800)
+#define HAVE_EXP2 1
+#endif
+
/* Define to 1 if you have the `flockfile' function. */
#undef HAVE_FLOCKFILE
@@ -105,6 +110,11 @@
/* Define to 1 if you have the `localtime_r' function. */
/* #undef HAVE_LOCALTIME_R */
+/* Define to 1 if you have the `log2' function. */
+#if !defined (_MSC_VER) || (_MSC_VER >= 1800)
+#define HAVE_LOG2 1
+#endif
+
/* Define to 1 if you have the `lstat' function. */
/* #undef HAVE_LSTAT */
diff --git a/configure.ac b/configure.ac
index 3718dbf898..2d4df249f5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -897,7 +897,7 @@ AC_TYPE_UID_T
# Check for round(), rint(), isnan(), isinf() and nearbyint()
AC_CHECK_LIB(m,round,,)
-AC_CHECK_FUNCS(round rint nearbyint sincos)
+AC_CHECK_FUNCS(round rint nearbyint sincos exp2 log2)
AC_CHECK_DECLS([isnan, isinf], [], [], [[#include <math.h>]])
# Checks for gdkspawn
diff --git a/gtk/fallback-c89.c b/gtk/fallback-c89.c
index e87bf76c0c..df28048feb 100644
--- a/gtk/fallback-c89.c
+++ b/gtk/fallback-c89.c
@@ -77,3 +77,30 @@ isinf (double x)
return (!_finite (x) && !_isnan (x));
}
#endif
+
+#ifndef INFINITY
+/* define INFINITY for compilers that lack support for it */
+# ifdef HUGE_VALF
+# define INFINITY HUGE_VALF
+# else
+# define INFINITY (float)HUGE_VAL
+# endif
+#endif
+
+#ifndef HAVE_LOG2
+/* Use a simple implementation for log2() for compilers that lack it */
+static inline double
+log2 (double x)
+{
+ return log (x) / log (2.0);
+}
+#endif
+
+#ifndef HAVE_EXP2
+/* Use a simple implementation for exp2() for compilers that lack it */
+static inline double
+exp2 (double x)
+{
+ return pow (2.0, x);
+}
+#endif
diff --git a/gtk/gtkprogressbar.c b/gtk/gtkprogressbar.c
index 9ba2c86d1f..86c57a5318 100644
--- a/gtk/gtkprogressbar.c
+++ b/gtk/gtkprogressbar.c
@@ -25,7 +25,6 @@
#include "config.h"
#include <string.h>
-#include <math.h>
#include "gtkprogressbar.h"
#include "gtkorientableprivate.h"
@@ -42,6 +41,8 @@
#include "a11y/gtkprogressbaraccessible.h"
+#include "fallback-c89.c"
+
/**
* SECTION:gtkprogressbar
* @Short_description: A widget which indicates progress visually
diff --git a/gtk/inspector/visual.c b/gtk/inspector/visual.c
index f56f66e993..b3da229a73 100644
--- a/gtk/inspector/visual.c
+++ b/gtk/inspector/visual.c
@@ -31,7 +31,7 @@
#include "gtkwindow.h"
#include "gtkcssproviderprivate.h"
-#include <math.h>
+#include "fallback-c89.c"
#ifdef GDK_WINDOWING_X11
#include "x11/gdkx.h"