Macro: bnv_have_qt

Back to the Main Page. | Download the M4 Source.

# bnv_have_qt

## Synopsis

`BNV_HAVE_QT [--with-Qt-includes=DIR] [--with-Qt-dir=DIR]`

## Version

1.1 (2001/07/26) Installed_Packages @ ac-archive-0.5.32

## Author

Bastiaan N. Veelo <Bastiaan.N.Veelo@immtek.ntnu.no>

## Description

Search for Trolltech's Qt GUI framework.

Searches common directories for Qt include files, libraries and the meta object compiler. If one of the options is given, the search is started in the given directory. If both options are given, no checks are performed and the cache is not consulted nor altered.

The following shell variable is set to either "yes" or "no":

`have_qt`

Additionally, the following variables are exported:

`QT_CXXFLAGS`
`QT_LIBS`
`QT_MOC`
`QT_DIR`

which contain an "-I" flag pointing to the Qt include directory, link flags necessary to link with Qt and X, the name of the meta object compiler with full path, and the variable QTDIR as Trolltech likes to see it defined, respectively.

Example lines for Makefile.in:

`CXXFLAGS = @QT_CXXFLAGS@`
`MOC = @QT_MOC@`

After the variables have been set, a trial compile and link is performed to check the correct functioning of the meta object compiler. If this test fails, a warning appears in the output of configure, but the variables remain defined.

No common variables such as $LIBS or $CFLAGS are polluted.

Options:

--with-Qt-includes=DIR: DIR should point to where the Qt includes can be found, as in -IDIR.

--with-Qt-dir=DIR: DIR should point to the "QTDIR", i.e., libraries are in DIR/lib/.

If at least one of the options "=no" or, equivalently, --without-Qt-includes and/or --without-Qt-dir is given, "have_qt" is set to "no" and the other variables are set to the empty string.

Calls BNV_PATH_QT_DIRECT as a subroutine.

## M4 Source Code

    AC_DEFUN([BNV_HAVE_QT],
    [
      AC_REQUIRE([AC_PROG_CXX])
      AC_REQUIRE([AC_PATH_X])
      AC_REQUIRE([AC_PATH_XTRA])

      AC_MSG_CHECKING(for Qt)

      AC_ARG_WITH([Qt-includes],
        [  --with-Qt-includes=DIR  Qt include files are in DIR])
      AC_ARG_WITH([Qt-dir],
        [  --with-Qt-dir=DIR       Qt library file is in DIR/lib/])
      if test x"$with_Qt_includes" = x"no" || test x"$with_Qt_dir" = x"no"; then
        # user disabled Qt. Leave cache alone.
        have_qt="User disabled Qt."
      else
        # "yes" is a bogus option
        if test "x$with_Qt_includes" = xyes; then
          with_Qt_includes=
        fi
        if test "x$with_Qt_dir" = xyes; then
          with_Qt_dir=
        fi
        if test "x$with_Qt_includes" != x && test "x$with_Qt_dir" != x; then
          # Both values are set, no need to search
          have_qt=yes
          bnv_qt_includes="$with_Qt_includes"
          bnv_qt_dir="$with_Qt_dir"
          bnv_qt_LIBS="-lqt $X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu -lXt -lXi $X_EXTRA_LIBS"
          if test x"$with_Qt_dir" != x; then
            bnv_qt_LIBS="-L$with_Qt_dir/lib $bnv_qt_LIBS"
          fi
        else
          # Use cached value or do search, starting with suggestions from
          # the command line
          AC_CACHE_VAL(bnv_cv_have_qt,
          [
            # One or both of the vars are not set, and there is no cached value.
            bnv_qt_includes=NO bnv_qt_dir=NO
            BNV_PATH_QT_DIRECT
            if test "$bnv_qt_includes" = NO || test "$bnv_qt_dir" = NO; then
              # Didn't find Qt anywhere.  Cache the known absence of Qt.
              bnv_cv_have_qt="have_qt=no"
            else
              # Record where we found Qt for the cache.
              bnv_cv_have_qt="have_qt=yes              \
                      bnv_qt_includes=$bnv_qt_includes \
                           bnv_qt_dir=$bnv_qt_dir      \
                          bnv_qt_LIBS=\"$bnv_qt_LIBS\""
            fi
          ])dnl
          eval "$bnv_cv_have_qt"
        fi # all $bnv_qt_* are set
      fi   # $have_qt reflects the system status
      if test x"$have_qt" = xyes; then
        QT_CXXFLAGS="-I$bnv_qt_includes"
        QT_DIR="$bnv_qt_dir"
        QT_LIBS="$bnv_qt_LIBS"
        QT_MOC="$bnv_qt_dir/bin/moc"
        AC_MSG_RESULT([$have_qt:
        QT_CXXFLAGS=$QT_CXXFLAGS
        QT_LIBS=$QT_LIBS
        QT_MOC=$QT_MOC])
      else
        QT_CXXFLAGS=
        QT_DIR=
        QT_LIBS=
        QT_MOC=
        AC_MSG_RESULT($have_qt)
      fi
      AC_SUBST(QT_CXXFLAGS) AC_SUBST(QT_DIR) AC_SUBST(QT_LIBS) AC_SUBST(QT_MOC)

      #### Being paranoid:
      AC_MSG_CHECKING(the Qt meta object compiler)
      AC_CACHE_VAL(bnv_cv_qt_test_result,
      [
        cat > bnv_qt_test.h << EOF
    #include <qobject.h>
    class Test : public QObject
    {
    Q_OBJECT
    public:
      Test() {}
      ~Test() {}
    public slots:
      void receive() {}
    signals:
      void send();
    };
    EOF

        cat > bnv_qt_main.$ac_ext << EOF
    #include "bnv_qt_test.h"
    #include <qapplication.h>
    int main( int argc, char **argv )
    {
      QApplication app( argc, argv );
      Test t;
      QObject::connect( &t, SIGNAL(send()), &t, SLOT(receive()) );
    }
    EOF

        bnv_cv_qt_test_result="failure"
        bnv_try_1="$QT_MOC bnv_qt_test.h -o moc_bnv_qt_test.$ac_ext >/dev/null 2>bnv_qt_test_1.out"
        AC_TRY_EVAL(bnv_try_1)
        bnv_err_1=`grep -v '^ *+' bnv_qt_test_1.out | grep -v "^bnv_qt_test.h\$"`
        if test -n "$bnv_err_1"; then
          echo "$bnv_err_1" >&AC_FD_CC
          echo "configure: could not run $QT_MOC on:" >&AC_FD_CC
          cat bnv_qt_test.h >&AC_FD_CC
        else
          bnv_try_2="$CXX $QT_CXXFLAGS -c $CXXFLAGS -o moc_bnv_qt_test.o moc_bnv_qt_test.$ac_ext >/dev/null 2>bnv_qt_test_2.out"
          AC_TRY_EVAL(bnv_try_2)
          bnv_err_2=`grep -v '^ *+' bnv_qt_test_2.out | grep -v "^bnv_qt_test.{$ac_ext}\$"`
          if test -n "$bnv_err_2"; then
            echo "$bnv_err_2" >&AC_FD_CC
            echo "configure: could not compile:" >&AC_FD_CC
            cat bnv_qt_test.$ac_ext >&AC_FD_CC
          else
            bnv_try_3="$CXX $QT_CXXFLAGS -c $CXXFLAGS -o bnv_qt_main.o bnv_qt_main.$ac_ext >/dev/null 2>bnv_qt_test_3.out"
            AC_TRY_EVAL(bnv_try_3)
            bnv_err_3=`grep -v '^ *+' bnv_qt_test_3.out | grep -v "^bnv_qt_main.{$ac_ext}\$"`
            if test -n "$bnv_err_3"; then
              echo "$bnv_err_3" >&AC_FD_CC
              echo "configure: could not compile:" >&AC_FD_CC
              cat bnv_qt_main.$ac_ext >&AC_FD_CC
            else
              bnv_try_4="$CXX $QT_LIBS $LIBS -o bnv_qt_main bnv_qt_main.o moc_bnv_qt_test.o >/dev/null 2>bnv_qt_test_4.out"
              AC_TRY_EVAL(bnv_try_4)
              bnv_err_4=`grep -v '^ *+' bnv_qt_test_4.out`
              if test -n "$bnv_err_4"; then
                echo "$bnv_err_4" >&AC_FD_CC
              else
                bnv_cv_qt_test_result="succes"
              fi
            fi
          fi
        fi
      ])dnl AC_CACHE_VAL bnv_cv_qt_test_result
      AC_MSG_RESULT([$bnv_cv_qt_test_result]);
      if test x"$bnv_cv_qt_test_result" = "xfailure"; then
        AC_MSG_WARN([Your Qt installation seems to be broken!])
      fi

      rm -f bnv_qt_test.h moc_bnv_qt_test.$ac_ext moc_bnv_qt_test.o \
            bnv_qt_main.$ac_ext bnv_qt_main.o bnv_qt_main \
            bnv_qt_test_1.out bnv_qt_test_2.out bnv_qt_test_3.out bnv_qt_test_4.out
    ])

    dnl Internal subroutine of BNV_HAVE_QT
    dnl Set bnv_qt_includes bnv_qt_dir.
    dnl Copyright 2001 Bastiaan N. Veelo <Bastiaan.N.Veelo@immtek.ntnu.no>
    AC_DEFUN(BNV_PATH_QT_DIRECT,
    [
      ## Look for include files ##
      qt_direct_test_header=qapplication.h
      # First, try using that file with no special directory specified.
      AC_TRY_CPP([#include <$qt_direct_test_header>],
      [
        # Success.
        # We can compile using Qt headers with no special include directory.
        bnv_qt_includes=
      ], [
        # That did not work.
        echo "Non-critical error, please neglect the above." >&AC_FD_CC
        # Look for the header file in a standard set of common directories.
        bnv_include_path_list="
          $with_Qt_include
          /usr/include/qt
          /usr/lib/qt2/include
          /usr/lib/qt1g/include
          `ls -d /usr/local/qt*/include 2>/dev/null`
        "
        for bnv_dir in $bnv_include_path_list; do
          if test -r "$bnv_dir/$qt_direct_test_header"; then
            bnv_qt_includes=$bnv_dir
            break
          fi
        done
      ])

      ## Look for Qt directory ##
      qt_direct_test_library=qt
      qt_direct_test_main="
        int argc;
        char ** argv;
        QApplication app(argc,argv);
      "

      # See if we find the library without any special options.
      # Don't add top $LIBS permanently yet
      bnv_save_LIBS="$LIBS"
      LIBS="-l$qt_direct_test_library $X_PRE_LIBS $X_LIBS -lX11 -lXext -lXmu -lXt -lXi $X_EXTRA_LIBS"
      bnv_qt_LIBS="$LIBS"
      AC_TRY_LINK([#include <$qt_direct_test_header>],
        $qt_direct_test_main,
      [
        # Succes.
        # We can link with no special library directory.
        bnv_qt_dir=
      ], [
        # That did not work.
        echo "Non-critical error, please neglect the above." >&AC_FD_CC
        # Look for the Qt dir in a standard set of common directories.
        bnv_dir_list="
          $with_Qt_dir
          /usr
          /usr/lib/qt
          /usr/lib/qt2
          /usr/lib/qt1g
          `ls -d /usr/local/qt* 2>/dev/null`
        "
        for bnv_dir in $bnv_dir_list; do
          for bnv_ext in a so sl; do
            if test -r $bnv_dir/lib/lib${qt_direct_test_library}.$bnv_ext; then
              bnv_qt_dir=$bnv_dir
              break 2
            fi
          done
        done
      ])
      QT_DIR=$bnv_qt_dir
      if test -z $bnv_qt_dir; then
        QT_LIBS=$LIBS
        # when the library is in $LD_PATH then moc can be assumed to be in $PATH:
        QT_MOC=moc
      else
        QT_LIBS="-L$bnv_qt_dir/lib $LIBS"
        QT_MOC="$bnv_qt_dir/moc"
      fi
      LIBS="$bnv_save_LIBS"
    ])