configure: Improve check for built-in __atomic_* functions
authorTobias Brunner <tobias@strongswan.org>
Wed, 20 Jul 2016 09:01:17 +0000 (11:01 +0200)
committerTobias Brunner <tobias@strongswan.org>
Fri, 26 Aug 2016 07:59:01 +0000 (09:59 +0200)
With AC_SEARCH_LIBS() we don't succeed if the searched function is a
built-in as the check uses the wrong signature so the built-in will not
be applied (the warning issued by GCC is "conflicting types for built-in
function '...'").  So even if not required, libatomic will be linked if
it is found, which could be problematic if compiling on a separate host
and the target host does not have libatomic installed.

Also, some tests showed that it's more likely that __atomic_and_fetch()
requires linking libatomic than __atomic_load_n() does.

References #1533.

configure.ac

index b58a5c1..408152a 100644 (file)
@@ -501,9 +501,20 @@ LIBS=$DLLIB
 AC_SEARCH_LIBS(pthread_create, pthread, [PTHREADLIB=$LIBS])
 AC_SUBST(PTHREADLIB)
 
-# uClibc requires explicit -latomic for __atomic_* operations
+# Some architectures require explicit -latomic for __atomic_* operations
+# AC_SEARCH_LIBS() does not work when checking built-ins due to conflicting types
 LIBS=""
-AC_SEARCH_LIBS(__atomic_load, atomic, [ATOMICLIB=$LIBS])
+AC_MSG_CHECKING(for library containing __atomic_and_fetch)
+AC_LINK_IFELSE(
+       [AC_LANG_PROGRAM([[]], [[int x; __atomic_and_fetch(&x, 1, __ATOMIC_RELAXED);]])],
+       [AC_MSG_RESULT([none required])],
+       [LIBS="-latomic";
+        AC_LINK_IFELSE(
+               [AC_LANG_PROGRAM([[]], [[int x; __atomic_and_fetch(&x, 1, __ATOMIC_RELAXED);]])],
+               [AC_MSG_RESULT([-latomic]); ATOMICLIB=$LIBS],
+               [AC_MSG_RESULT([no])])
+       ]
+)
 AC_SUBST(ATOMICLIB)
 
 LIBS=$saved_LIBS