diff options
Diffstat (limited to '')
-rw-r--r-- | m4macros/ax_gtest.m4 | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/m4macros/ax_gtest.m4 b/m4macros/ax_gtest.m4 new file mode 100644 index 0000000..138a03f --- /dev/null +++ b/m4macros/ax_gtest.m4 @@ -0,0 +1,224 @@ +AC_DEFUN([AX_ISC_GTEST], [ + +enable_gtest="no" +GTEST_INCLUDES= + +AC_ARG_WITH([gtest-source], + [AS_HELP_STRING([--with-gtest-source[[=PATH]]], + [location of the Googletest source])], + [enable_gtest="yes" ; GTEST_SOURCE="$withval"]) + +AC_ARG_WITH([gtest], + [AS_HELP_STRING([--with-gtest[[=PATH]]], + [specify a path to gtest header files (PATH/include) and library (PATH/lib)])], + [gtest_path="$withval"; enable_gtest="yes"], [gtest_path="no"]) + +AC_ARG_WITH([lcov], + [AS_HELP_STRING([--with-lcov[[=PROGRAM]]], + [enable gtest and coverage target using the specified lcov])], + [lcov="$withval"], + [lcov="no"]) + +USE_LCOV="no" +if test "$lcov" != "no"; then + # force gtest if not set + if test "$enable_gtest" = "no"; then +# AC_MSG_ERROR("lcov needs gtest for test coverage report") + AC_MSG_NOTICE([gtest support is now enabled, because used by coverage tests]) + enable_gtest="yes" + fi + if test "$lcov" != "yes"; then + LCOV=$lcov + else + AC_PATH_PROG([LCOV], [lcov]) + fi + if test -x "${LCOV}"; then + USE_LCOV="yes" + else + AC_MSG_ERROR([Cannot find lcov.]) + fi + # is genhtml always in the same directory? + GENHTML=`echo "$LCOV" | ${SED} s/lcov$/genhtml/` + if test ! -x $GENHTML; then + AC_MSG_ERROR([genhtml not found, needed for lcov]) + fi + # GCC specific? + CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage" + LIBS=" $LIBS -lgcov" + AC_SUBST(CPPFLAGS) + AC_SUBST(LIBS) + AC_SUBST(LCOV) + AC_SUBST(GENHTML) +fi +AC_SUBST(USE_LCOV) + +# +# Check availability of gtest, which will be used for unit tests. +# +GTEST_LDFLAGS= +GTEST_LDADD= +DISTCHECK_GTEST_CONFIGURE_FLAG= +GTEST_VERSION="unknown" + +if test "x$enable_gtest" = "xyes" ; then + + DISTCHECK_GTEST_CONFIGURE_FLAG="--with-gtest=$gtest_path" + + if test -n "$with_gtest_source" ; then + + AC_MSG_CHECKING([for gtest source]) + + if test "x$GTEST_SOURCE" = "xyes" ; then + + # If not specified, try some common paths. + GTEST_SOURCE= + for d in /usr/src/googletest /usr/src/gtest /usr/local /usr/pkg /opt /opt/local ; do + cmakelists="$d/CMakeLists.txt" + if test ! -d "$d/src" -a -d "$d/googletest"; then + d="$d/googletest" + fi + if test -f "$d/src/gtest-all.cc" -a -f "$d/src/gtest_main.cc"; then + GTEST_SOURCE="$d" + AC_MSG_RESULT([$GTEST_SOURCE]) + break + fi + done + if test -z "$GTEST_SOURCE" ; then + AC_MSG_ERROR([no gtest sources found]) + fi + else + # Trim trailing slashes. + GTEST_SOURCE=$(echo "$GTEST_SOURCE" | ${SED} 's:/*$::') + cmakelists="$GTEST_SOURCE/CMakeLists.txt" + if test ! -d "$GTEST_SOURCE/src" -a -d "$GTEST_SOURCE/googletest"; then + GTEST_SOURCE="$GTEST_SOURCE/googletest" + fi + if test -f "$GTEST_SOURCE/src/gtest-all.cc" -a -f "$GTEST_SOURCE/src/gtest_main.cc"; then + AC_MSG_RESULT([$GTEST_SOURCE]) + else + AC_MSG_ERROR([no gtest source at $GTEST_SOURCE]) + fi + fi + have_gtest_source=yes + + GTEST_LDADD="\$(top_builddir)/ext/gtest/libgtest.a" + DISTCHECK_GTEST_CONFIGURE_FLAG="--with-gtest-source=$GTEST_SOURCE" + GTEST_INCLUDES="-I$GTEST_SOURCE -I$GTEST_SOURCE/include" + gtest_src_basename="$(basename $GTEST_SOURCE)" + + # Versions starting from 1.8.0 are put in the googletest directory. If the basename + # returns googletest string, we need to cut it off and try basename again. + if test "$gtest_src_basename" = "googletest"; then + gtest_src_parent_dir=${GTEST_SOURCE%"/googletest"} + if test -f "$gtest_src_parent_dir/CMakeLists.txt" ; then + cmakelists="$gtest_src_parent_dir/CMakeLists.txt" + fi + gtest_src_basename=$(basename "$gtest_src_parent_dir") + fi + gtest_src_basename="${gtest_src_basename#googletest-release-}" + gtest_src_basename="${gtest_src_basename#gtest-}" + gtest_src_basename="${gtest_src_basename#googletest-}" + + gtest_version_candidate=$(echo "$gtest_src_basename" | grep -Eo '[[0-9]+\.[0-9]+\.[0-9]+]') + + if test -z "$gtest_version_candidate" ; then + # If the GTEST_VERSION is still not correct semver, we need to determine googletest version in other way. + # Let's try to extract it from CMake build script used by Google Test starting from version 1.8.0. + if test -f "$cmakelists" ; then + gtest_version_candidate=$(grep -F 'set(GOOGLETEST_VERSION' "$cmakelists" | grep -Eo '[[0-9]+\.[0-9]+\.[0-9]+]') + if test -n "$gtest_version_candidate"; then + GTEST_VERSION="$gtest_version_candidate" + fi + fi + if test "$GTEST_VERSION" = "unknown" ; then + # Try to get googletest version from debian/ubuntu package + AC_PATH_PROG(DPKG, dpkg) + AC_PATH_PROG(DPKGQUERY, dpkg-query) + if test -n "${DPKG}" -a -n "${DPKGQUERY}"; then + # Let's check if there is a googletest package owning files under given GTEST_SOURCE path + ${DPKG} -S "$GTEST_SOURCE" 2>/dev/null | grep googletest >/dev/null 2>&1 + if test $? -eq 0; then + GTEST_VERSION="$(${DPKGQUERY} --showformat='${Version}' --show googletest | cut -d'-' -f1)" + fi + fi + fi + else + GTEST_VERSION="$gtest_version_candidate" + fi + fi + + if test "$gtest_path" != "no" ; then + if test "$gtest_path" != "yes"; then + GTEST_PATHS=$gtest_path + AC_PATH_PROG([GTEST_CONFIG], [gtest-config], [], [${gtest_path}/bin]) + else + AC_PATH_PROG([GTEST_CONFIG], [gtest-config]) + fi + if test -x "${GTEST_CONFIG}" ; then : + # using cppflags instead of cxxflags + GTEST_INCLUDES=`${GTEST_CONFIG} --cppflags` + GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags` + GTEST_LDADD=`${GTEST_CONFIG} --libs` + GTEST_VERSION=`${GTEST_CONFIG} --version` + GTEST_FOUND="true" + else + if test -z "${GTEST_PATHS}" ; then + GTEST_PATHS="/usr /usr/local" + fi + GTEST_FOUND="false" + fi + if test "${GTEST_FOUND}" != "true"; then + AC_MSG_CHECKING([for gtest lib path]) + GTEST_FOUND="false" + for dir in $GTEST_PATHS; do + if test -f "$dir/include/gtest/gtest.h"; then + if test -f "$dir/lib/libgtest.a" || \ + test -f "$dir/lib/libgtest.so"; then + GTEST_INCLUDES="-I$dir/include" + GTEST_LDFLAGS="-L$dir/lib" + GTEST_LDADD="-lgtest" + GTEST_FOUND="true" + AC_MSG_RESULT([$dir/lib]) + if test -f "$dir/lib/pkgconfig/gtest.pc" ; then + AX_FIND_LIBRARY([gtest], ["$dir/lib/pkgconfig/gtest.pc"]) + if "${LIBRARY_FOUND}"; then + GTEST_VERSION="${LIBRARY_VERSION}" + fi + fi + break + elif test -f "$dir/lib/$dumpmachine/libgtest.a" || \ + test -f "$dir/lib/$dumpmachine/libgtest.so"; then + GTEST_INCLUDES="-I$dir/include" + # check also multiarch dir in debian/ubuntu distributions + GTEST_LDFLAGS="-L$dir/lib/$dumpmachine" + GTEST_LDADD="-lgtest" + GTEST_FOUND="true" + AC_MSG_RESULT([$dir/lib/$dumpmachine]) + if test -f "$dir/lib/$dumpmachine/pkgconfig/gtest.pc" ; then + AX_FIND_LIBRARY([gtest], ["$dir/lib/$dumpmachine/pkgconfig/gtest.pc"]) + if "${LIBRARY_FOUND}"; then + GTEST_VERSION="${LIBRARY_VERSION}" + fi + fi + break + else + AC_MSG_WARN([Found Google Test include but not the library in $dir.]) + fi + fi + done + fi + if test "${GTEST_FOUND}" != "true"; then + AC_MSG_ERROR([Cannot find gtest in: $GTEST_PATHS]) + fi + + fi +fi +AM_CONDITIONAL(HAVE_GTEST, test $enable_gtest != "no") +AM_CONDITIONAL(HAVE_GTEST_SOURCE, test "X$have_gtest_source" = "Xyes") +AC_SUBST(DISTCHECK_GTEST_CONFIGURE_FLAG) +AC_SUBST(GTEST_INCLUDES) +AC_SUBST(GTEST_LDFLAGS) +AC_SUBST(GTEST_LDADD) +AC_SUBST(GTEST_SOURCE) + +])dnl AX_ISC_GTEST |