about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2013-03-08 10:21:38 +0000
committerEric Wong <normalperson@yhbt.net>2013-03-08 10:21:38 +0000
commitcce7f3c33207c534f9e5a6c0cb389a97df21235b (patch)
tree7a1d91bd6cd389a239e06d00c3b4d71e8295b07c
parent08b8d7f1e5101631f642134718871dd2ef24c1e5 (diff)
downloadcmogstored-cce7f3c33207c534f9e5a6c0cb389a97df21235b.tar.gz
Andrey Okunev noted undefined references on the MogileFS mailing
list when building cmogstored 1.2.1 on his 32-bit CentOS5 machine.
-rw-r--r--Makefile.am2
-rw-r--r--configure.ac1
-rw-r--r--m4/gcc_atomics.m440
3 files changed, 42 insertions, 1 deletions
diff --git a/Makefile.am b/Makefile.am
index 6fa520c..4c9f19a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,6 +1,6 @@
 ACLOCAL_AMFLAGS = -I m4
 AM_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib
-AM_CFLAGS = $(WARN_CFLAGS) $(PTHREAD_CFLAGS)
+AM_CFLAGS = $(WARN_CFLAGS) $(GCC_ATOMICS_CFLAGS) $(PTHREAD_CFLAGS)
 AM_LDFLAGS = $(LIBGNU_LIBDEPS) $(LIB_CLOCK_GETTIME)
 SUBDIRS = lib
 
diff --git a/configure.ac b/configure.ac
index 08cab08..adb37f3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -28,6 +28,7 @@ gl_WARN_ADD([-Werror-implicit-function-declaration])
 gl_WARN_ADD([-Werror=declaration-after-statement]) dnl I hate C99 for this :P
 gl_WARN_ADD([-ggdb3],[CFLAGS])
 AX_PTHREAD(true)
+CM_GCC_ATOMICS(true)
 AC_SYS_LARGEFILE
 AC_C_FLEXIBLE_ARRAY_MEMBER
 
diff --git a/m4/gcc_atomics.m4 b/m4/gcc_atomics.m4
new file mode 100644
index 0000000..b55ffc4
--- /dev/null
+++ b/m4/gcc_atomics.m4
@@ -0,0 +1,40 @@
+dnl test for _all_ the GCC atomic builtins we use
+dnl we need to test for CMPXCHG in particular since i386-only targets lack it
+dnl even though other atomics may be available
+AC_DEFUN([CM_GCC_ATOMICS],[
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_PUSH([C])
+AS_CASE([$host_cpu], [[i[3456]86]], [
+        AC_CACHE_CHECK([for GCC atomic builtins],
+                [cm_cv_gcc_atomics], [
+                AC_TRY_LINK([unsigned long a = 0;], [
+                        __sync_bool_compare_and_swap(&a, 0, 1);
+                        __sync_add_and_fetch(&a, 1);
+                        __sync_sub_and_fetch(&a, 1)
+                        ],
+                        [cm_cv_gcc_atomics=yes],
+                        [cm_cv_gcc_atomics=no])])
+        dnl try not to add -march=i486 unless we are certain it is needed
+        AS_CASE([$cm_cv_gcc_atomics], [[no]], [
+                unset cm_cv_gcc_atomics
+                save_CFLAGS="$CFLAGS"
+                CFLAGS="$CFLAGS -march=i486"
+                AC_CACHE_CHECK([for GCC atomic builtins with -march=i486],
+                        [cm_cv_gcc_atomics], [
+                         AC_TRY_LINK([unsigned long a = 0;], [
+                                __sync_bool_compare_and_swap(&a, 0, 1);
+                                __sync_add_and_fetch(&a, 1);
+                                __sync_sub_and_fetch(&a, 1)
+                                ], [
+                                cm_cv_gcc_atomics=yes
+                                GCC_ATOMICS_CFLAGS=-march=i486
+                                ],
+                                [cm_cv_gcc_atomics=no])])
+                 CFLAGS="$save_CFLAGS"
+         ])
+         AS_CASE([$cm_cv_gcc_atomics],[[no]],
+                [AC_MSG_ERROR([GCC atomic builtins not available])])
+AC_SUBST(GCC_ATOMICS_CFLAGS)
+])
+AC_LANG_POP
+]) dnl CM_GCC_ATOMICS