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