# Copyright (C) 2001 David Johnson # This file is free software; the author gives unlimited permission to copy # and/or distribute it, with or without modifications, as long as this notice # is preserved. # FUN_TYPE BOOL # check for a built-in bool type # HAVE_BOOL will be defined in the config header AC_DEFUN(FUN_TYPE_BOOL, [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH(C++) AC_CHECK_TYPE(bool, ac_check_bool=yes, ac_check_bool=no) AC_LANG_POP(C++) if test "x$ac_check_bool" = "xyes" ; then AC_DEFINE(HAVE_BOOL,,[define if bool is a built-in type]) fi AH_BOTTOM([#ifndef HAVE_BOOL]) AH_BOTTOM([enum booltyp { false, true }; typedef enum booltyp bool;]) AH_BOTTOM([#endif]) ])# FUN_TYPE_BOOL # FUN_HEADER_STDCXX # check for standard ISO C++ headers AC_DEFUN(FUN_HEADER_STDCXX, [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH(C++) ac_check_headers=no AC_CHECK_HEADER(cstdlib, ac_check_headers=yes, ac_check_headers=no) AC_CHECK_HEADER(cstring, ac_check_headers=$ac_check_headers, ac_check_headers=no) AC_CHECK_HEADER(iostream, ac_check_headers=$ac_check_headers, ac_check_headers=no) AC_LANG_POP(C++) if test "x$ac_check_headers" = "xno" ; then AC_MSG_ERROR(standard ISO C++ headers not found!) fi ])#FUN_HEADER_STDCXX # FUN_CHECK_PTHREAD # check for posix pthreads # sets PTHREAD_LIBS and PTHREAD_CFLAGS # sets HAVE_PTHREADS in the configuration header AC_DEFUN(FUN_CHECK_PTHREAD, [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_CC]) PTHREAD_LIBS="" PTHREAD_CFLAGS="" AC_ARG_ENABLE(threads, AC_HELP_STRING([--enable-threads], [enable the use of the threads [[default=no]]]), ac_use_threads=$enableval, ac_use_threads=no) if test "x$ac_use_threads" = "xyes" ; then AC_CHECK_HEADER(pthread.h, ac_posix_threads=yes, ac_posix_threads=no) if test "x$ac_posix_threads" = "xyes" ; then AC_MSG_CHECKING([whether ${CC} accepts -pthread]) ac_cflags_save="$CFLAGS" CFLAGS="$CFLAGS -pthread" AC_TRY_COMPILE([#include ], [pthread_attr_init(0)], ac_cc_pthread=yes, ac_cc_pthread=no) CFLAGS="$ac_cflags_save" if test "x$ac_cc_pthread" = "xyes" ; then AC_MSG_RESULT([yes]) PTHREAD_CFLAGS="-pthread" else AC_MSG_RESULT([no]) ac_thread_library=none if test "x$ac_thread_library" = "xnone" ; then AC_CHECK_LIB(c_r, pthread_self, ac_thread_library=c_r) fi if test "x$ac_thread_library" = "xnone" ; then AC_CHECK_LIB(pthread, pthread_self, ac_thread_library=pthread) fi if test "x$ac_thread_library" = "xnone" ; then AC_CHECK_LIB(pthreads, pthread_self, ac_thread_library=pthreads) fi if test "x$ac_thread_library" = "xnone" ; then AC_CHECK_LIB(thread, pthread_self, ac_thread_library=thread) fi if test "x$ac_thread_library" = "xnone" ; then AC_CHECK_LIB(gthreads, pthread_self, ac_thread_library=gthreads) fi if test "x$ac_thread_library" = "xnone" ; then AC_CHECK_LIB(c, pthread_self, ac_thread_library=c) fi if test "x$ac_thread_library" = "xnone" ; then ac_use_threads=no else PTHREAD_LIBS="-l$ac_thread_library" fi fi else ac_use_threads=no fi fi if test "x$ac_use_threads" = "xyes" ; then AC_DEFINE(HAVE_PTHREAD, 1, [Define if you have POSIX threads]) case $host_os in aix* | freebsd*) PTHREAD_CFLAGS="$PTHREAD_CFLAGS -D_THREAD_SAFE" ;; linux* | solaris*) PTHREAD_CFLAGS="$PTHREAD_CFLAGS -D_REENTRANT" ;; *) ;; esac fi ])#FUN_CHECK_PTHREAD # FUN_CHECK_QT([qt_min_version],[qt_max_version]) # check for qt headers, libs, progs and compilation # substs QT_CXXFLAGS, QT_LDFLAGS, and QT_LIBS # substs QTVERSION, MOC and UIC # LIBQT, MOC and UIC 'precious' variables AC_DEFUN(FUN_CHECK_QT, [ AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([AC_PATH_X]) AC_REQUIRE([AC_PATH_XTRA]) AC_REQUIRE([FUN_CHECK_PTHREAD]) # some 'precious' variables for configure --help AC_ARG_VAR(QTMIN, minimum version of Qt to search for e.g. 220) AC_ARG_VAR(QTMAX, maximum version of Qt to search for e.g. 399) AC_ARG_VAR(LIBQT, library flag for the Qt libary e.g. -lqt) AC_ARG_VAR(MOC, QT meta object compiler command) AC_ARG_VAR(UIC, Qt UI compiler command) AC_CACHE_SAVE AC_MSG_NOTICE([checking for Qt]) # process our args if test -z "$1" ; then qt_min_version=0 else qt_min_version=$1 fi if test -z "$2" ; then qt_max_version=9999 else qt_max_version=$2 fi # adjust for user preferences if test "x$QTMIN" != "x" ; then if expr $QTMIN '>' $qt_min_version > /dev/null ; then qt_min_version=$QTMIN; fi fi if test "x$QTMAX" != "x" ; then if expr $QTMAX '<' $qt_max_version > /dev/null ; then qt_max_version=$QTMAX; fi fi # set up our configuration options qt_dir="" qt_includes="" qt_libraries="" qt_programs="" AC_ARG_WITH([qt_dir], AC_HELP_STRING([--with-qt-dir=DIR], [where the Qt package is installed]), [ qt_dir="$withval" qt_includes="$withval"/include qt_libraries="$withval"/lib qt_programs="$withval"/bin ]) AC_ARG_WITH([qt_includes], AC_HELP_STRING([--with-qt-includes=DIR], [where the Qt includes are installed]), [qt_includes="$withval"]) AC_ARG_WITH([qt_libraries], AC_HELP_STRING([--with-qt-libraries=DIR], [where the Qt libraries are installed]), [qt_libraries="$withval"]) AC_ARG_WITH([qt_programs], AC_HELP_STRING([--with-qt-programs=DIR], [where the Qt programs are installed]), [qt_programs="$withval"]) QTVERSION="000" FUN_QT_HEADERS # check for a traditional qt installation tree if ls $qt_includes/../lib/libqt* > /dev/null 2> /dev/null; then qt_dir="`echo $qt_includes | sed s,'/include',,`" qt_libraries="$qt_dir/lib" qt_programs="$qt_dir/bin" fi FUN_QT_LIBRARIES FUN_QT_PROGRAMS FUN_QT_COMPILE AC_MSG_NOTICE([Found Qt version $QTVERSION]) AC_SUBST(QTVERSION) AC_SUBST(MOC) AC_SUBST(UIC) QT_CXXFLAGS="-I$qt_includes" AC_SUBST(QT_CXXFLAGS) QT_LDFLAGS="-L$qt_libraries" AC_SUBST(QT_LDFLAGS) QT_LIBS="$LIBQT" AC_SUBST(QT_LIBS) ])#FUN_CHECK_QT # FUN_QT_HEADERS # helper function for FUN_CHECK_QT # check for qt headers in standard locations AC_DEFUN(FUN_QT_HEADERS, [ AC_MSG_CHECKING([for Qt headers]) if test "x$qt_includes" = "x" ; then # look in standard locations qt_found_dirs="" qt_include_dirs=" $QTDIR /usr/include /usr/local/include /usr/X11R6/include `ls -dr /usr/include/qt* 2>/dev/null` `ls -dr /usr/local/include/qt* 2>/dev/null` `ls -dr /usr/X11R6/include/qt* 2>/dev/null` `ls -dr /usr/lib/qt*/include 2>/dev/null` `ls -dr /usr/local/lib/qt*/include 2>/dev/null` `ls -dr /usr/X11R6/lib/qt*/include 2>/dev/null` `ls -dr /usr/local/qt*/include 2>/dev/null` `ls -dr /opt/qt*/include 2>/dev/null` " for n in $qt_include_dirs ; do if test -r "$n/qglobal.h"; then qt_found_dirs="$qt_found_dirs $n" fi done # find the latest version between min_version and max_version qt_prev_version=$qt_min_version qt_found_version="" for n in $qt_found_dirs ; do qt_current_version=`grep -w '#define QT_VERSION' $n/qglobal.h | sed s/'#define QT_VERSION'//` if expr $qt_current_version '>=' $qt_prev_version > /dev/null ; then if expr $qt_current_version '<=' $qt_max_version > /dev/null ; then qt_includes=$n qt_prev_version=$qt_current_version fi fi done fi if test "x$qt_includes" = "x" ; then AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot find correct Qt headers!]) else dnl TODO need to strip out white space QTVERSION=$qt_prev_version; AC_MSG_RESULT([$qt_includes]) fi ])#FUN_QT_HEADERS # FUN_QT_LIBRARIES # helper function for FUN_CHECK_QT # check for qt libs in standard locations AC_DEFUN(FUN_QT_LIBRARIES, [ AC_REQUIRE([FUN_QT_HEADERS]) AC_MSG_CHECKING([for Qt libraries]) # check which library to look for if test -z "$LIBQT" ; then if test "x$ac_use_threads" = "xyes" ; then LIBQT="-lqt-mt" else LIBQT="-lqt" fi fi lib_qt=`echo $LIBQT | sed s/'-l'//` if test "x$qt_libraries" = "x" ; then # see if it is relative to the includes qt_tree="$qt_includes" while test "x$qt_tree" != "x" ; do # first go around will fail... if ls $qt_tree/lib/libqt* > /dev/null 2> /dev/null ; then qt_libraries=$qt_tree/lib break else # lop off tail of path dnl not as portable as it should be... qt_tree="`dirname $qt_tree`" fi done fi if test "x$qt_libraries" = "x" ; then AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot find Qt libraries!]) else # check that we're looking at the right library if ls $qt_libraries/lib$lib_qt.* > /dev/null 2> /dev/null ; then AC_MSG_RESULT([$qt_libraries]) else AC_MSG_RESULT([no]) if test "x$ac_use_threads" = "xyes" ; then AC_MSG_ERROR([cannot find the threaded Qt library in $qt_libraries!]) else AC_MSG_ERROR([cannot find the non-threaded Qt library in $qt_libraries!]) fi fi fi ])#FUN_QT_LIBRARIES # FUN_QT_PROGRAMS # helper function for FUN_CHECK_QT # searches for moc and uic AC_DEFUN(FUN_QT_PROGRAMS, [ AC_REQUIRE([FUN_QT_LIBRARIES]) AC_MSG_CHECKING([for Qt utilities]) if test "x$q_programs" = "x" ; then # see if it is relative to the libraries qt_tree="$qt_libraries" while test "x$qt_tree" != "x" ; do # first go around will fail if ls $qt_tree/bin/moc* > /dev/null 2> /dev/null ; then qt_programs=$qt_tree/bin break else # lop off tail of path dnl not as portable as it should be... qt_tree="`dirname $qt_tree`" fi done # if we haven't found the progs, there's not much more we can do fi if test "x$qt_programs" = "x" ; then AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot find Qt utilities!]) else AC_MSG_RESULT([$qt_programs]) # find the right moc if test -z "$MOC" ; then AC_CHECK_PROG(MOC, moc, moc) if test "x$MOC" = "x" ; then # could be renamed to avoid clashes if ls $qt_programs/moc > /dev/null 2> /dev/null ; then MOC="$qt_programs/moc" else if expr "$QTVERSION" '>=' "200" > /dev/null ; then if ls $qt_programs/moc2 > /dev/null 2> /dev/null ; then MOC="$qt_programs/moc2" fi else if expr "$QTVERSION" '>=' "300" > /dev/null ; then if $qt_programs/moc3 > /dev/null 2> /dev/null ; then MOC="$qt_programs/moc3" fi fi fi fi fi if test "x$MOC" = "x" ; then AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot find Qt meta object compiler!]) fi fi # find the right uic if expr "$QTVERSION" '>=' "220" > /dev/null ; then if test -z "$UIC" ; then AC_CHECK_PROG(UIC, uic, uic) if test "x$UIC" = "x" ; then # could be renamed to avoid clashes if ls $qt_programs/uic > /dev/null 2> /dev/null ; then UIC="$qt_programs/uic" else if expr "$QTVERSION" '>=' "300" > /dev/null ; then if ls $qt_programs/uic3 > /dev/null 2> /dev/null ; then UIC="$qt_programs/uic3" fi fi fi fi fi else # if uic is important to the build, change this UIC="" fi fi ])#FUN_QT_PROGRAMS # FUN_QT_COMPILE # helper function for FUN_CHECK_QT # compile a simple qt program AC_DEFUN(FUN_QT_COMPILE, [ AC_REQUIRE([FUN_QT_HEADERS]) AC_REQUIRE([FUN_QT_LIBRARIES]) AC_REQUIRE([FUN_QT_PROGRAMS]) AC_MSG_CHECKING([whether a simple Qt program compiles]) AC_LANG_PUSH(C++) ac_cxxflags_save="$CXXFLAGS" ac_ldflags_save="$LDFLAGS" ac_libs_save="$LIBS" CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS -I$qt_includes $X_CFLAGS $all_includes" LDFLAGS="$LDFLAGS -L$qt_libraries $X_LIBS " LIBS="$LIBS $PTHREAD_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lXext -lX11 $LIBQT" AC_TRY_LINK([ #include #include #include ], [QString s = "hello world"; QMessageBox::information(0, s, "no he is not"); return 0;], qt_compile=yes, qt_compile=no) CXXFLAGS="$ac_cxxflags_save" LDFLAGS="$ac_ldflags_save" LIBS="$ac_libs_save" AC_LANG_POP(C++) if test "x$qt_compile" = "xyes" ; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) AC_MSG_ERROR([cannot compile a Qt program!]) fi ])#FUN_QT_COMPILE