AC_DEFUN([AX_EIGEN], [

  PKG_CHECK_MODULES(EIGEN, eigen3, [ax_eigen_ok=yes], [ax_eigen_ok=no])

  if test x"$ax_eigen_ok" = x"no"; then
    AC_LANG_SAVE
    AC_LANG([C++])

    EIGEN_CFLAGS=
    AC_CHECK_HEADER(Eigen/Core,[
      AC_MSG_CHECKING([if Eigen library is usable])
      AC_LINK_IFELSE(
       [AC_LANG_PROGRAM(
        [[#include <Eigen/Dense>
          #include <Eigen/Eigenvalues>
        ]],
        [[
          typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> Matrix;
          Matrix h; h << 2.0, 1.0, 1.0, 2.0;
          Matrix s; s << 1.0, 0.0, 0.0, 1.0;
          Eigen::GeneralizedSelfAdjointEigenSolver<Matrix> gen_eig_solver(h, s);
          auto evals = gen_eig_solver.eigenvalues();
         ]]
        )
       ],[
          ax_eigen_ok=yes
          EIGEN_CFLAGS=
         ]
      )
      AC_MSG_RESULT([$ax_eigen_ok])
    ])
    AC_LANG_RESTORE
  fi
  AS_IF([test "x$ax_eigen_ok" = "xyes"], [
      HAVE_EIGEN=1
  ],[
      HAVE_EIGEN=0
  ])
  AC_SUBST(HAVE_EIGEN)
  AC_SUBST(EIGEN_CFLAGS)
])