From 0eb518e53f7f8da458394e8dcc687b1b614cca50 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B6=20Fahlke?= <jorrit@jorrit.de>
Date: Thu, 18 Dec 2014 03:18:32 +0100
Subject: [PATCH] [threads][autotools] Guess the flags needed to get working
 threading support.

We simply get the flags from ACX_PTHREAD.  If we are compiling natively, we
run a test program to check whether that worked.  Otherwise we print a warning
and assume that threading works.
---
 m4/dune_common.m4    |  7 ++++++
 m4/dune_stdthread.m4 | 60 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+)
 create mode 100644 m4/dune_stdthread.m4

diff --git a/m4/dune_common.m4 b/m4/dune_common.m4
index f697a7db0..6ca3ed600 100644
--- a/m4/dune_common.m4
+++ b/m4/dune_common.m4
@@ -33,6 +33,13 @@ AC_DEFUN([DUNE_COMMON_CHECKS],
   AC_REQUIRE([DUNE_MPI])
   AC_REQUIRE([DUNE_SYS_MPROTECT])
 
+  AC_REQUIRE([DUNE_STDTHREAD])
+  AS_IF([test "x$DUNE_STDTHREAD_WORKS" = xno], [
+    AC_MSG_ERROR([dune-common needs working threading support])
+  ])
+  DUNE_ADD_MODULE_DEPS([dune-common], [STDTHREAD], [${STDTHREAD_CPPFLAGS}],
+                       [${STDTHREAD_LDFLAGS}], [${STDTHREAD_LIBS}])
+  
   dnl check for programs
   AC_REQUIRE([AC_PROG_CC])
   # add -Wall if the compiler is gcc
diff --git a/m4/dune_stdthread.m4 b/m4/dune_stdthread.m4
new file mode 100644
index 000000000..59545bec1
--- /dev/null
+++ b/m4/dune_stdthread.m4
@@ -0,0 +1,60 @@
+# Determine flags necessary to compile multithreaded programs
+#
+# We simply defer to ACX_PTHREAD
+
+AC_DEFUN([DUNE_STDTHREAD],[
+  AC_REQUIRE([ACX_PTHREAD])
+  AC_CACHE_CHECK([libraries needed for std::thread],
+    [dune_cv_stdthread_libs],
+    [dune_cv_stdthread_libs=$PTHREAD_LIBS])
+  AC_CACHE_CHECK([linker flags needed for std::thread],
+    [dune_cv_stdthread_ldflags],
+    [dune_cv_stdthread_ldflags=$PTHREAD_CFLAGS])
+  AC_CACHE_CHECK([compiler flags needed for std::thread],
+    [dune_cv_stdthread_cppflags],
+    [dune_cv_stdthread_cppflags=$PTHREAD_CFLAGS])
+
+  AC_CACHE_CHECK([whether std::thread works],
+    [dune_cv_stdthread_works],
+    [
+      AC_LANG_PUSH([C++])
+      dune_save_CPPFLAGS=$CPPFLAGS
+      dune_save_LDFLAGS=$LDFLAGS
+      dune_save_LIBS=$LIBS
+      CPPFLAGS="$CPPFLAGS $dune_cv_stdthread_cppflags"
+      LDFLAGS="$LDFLAGS $dune_cv_stdthread_ldflags"
+      LIBS="$dune_cv_stdthread_libs $LIBS"
+      AC_RUN_IFELSE([DUNE_STDTHREAD_TESTPROG],
+        [dune_cv_stdthread_works=yes],
+        [dune_cv_stdthread_works=no],
+        [dune_cv_stdthread_works=unknown])
+      LIBS=$dune_save_LIBS
+      LDFLAGS=$dune_save_LDFLAGS
+      CPPFLAGS=$dune_save_CPPFLAGS
+      AC_LANG_POP([C++])
+    ])
+  AS_CASE([$dune_cv_stdthread_works],
+    [unknown], [AC_MSG_WARN([Cross compiling; cannot check whether std::thread works.  I am going to assume that the flags guessed above do work; if not, please adjust the cache variables dune_cv_stdthread_*])
+                DUNE_STDTHREAD_WORKS=yes],
+               [DUNE_STDTHREAD_WORKS=$dune_cv_stdthread_works])
+
+  AC_SUBST([STDTHREAD_LIBS], ["${dune_cv_stdthread_libs}"])
+  AC_SUBST([STDTHREAD_LDFLAGS], ["${dune_cv_stdthread_ldflags}"])
+  AC_SUBST([STDTHREAD_CPPFLAGS], ["${dune_cv_stdthread_cppflags}"])
+  AM_CONDITIONAL([STDTHREAD], [test "x$DUNE_STDTHREAD_WORKS" = xyes])
+])
+
+AC_DEFUN([DUNE_STDTHREAD_TESTPROG], [dnl
+  AC_LANG_PROGRAM([[
+    #include <thread>
+
+    void f()
+    {
+      // do nothing
+    }
+    ]],
+    [[
+      std::thread t(f);
+      t.join();
+    ]])dnl
+])
-- 
GitLab