1dnl
2dnl Check for Qt 6
3dnl
4
5qt_min_ver=6.1.0
6
7check_qt6() {
8  AC_ARG_WITH(qmake6,
9    AC_HELP_STRING([--with-qmake6=prog],[use prog instead of looking for qmake6]),
10    [ QMAKE6="$with_qmake6" ],)
11
12  if ! test -z "$QMAKE6"; then
13    AC_MSG_CHECKING(for qmake6)
14    AC_MSG_RESULT(using supplied $QMAKE6)
15  else
16    AC_PATH_TOOL(QMAKE6, qmake6,, $PATH)
17  fi
18
19  if test x"$QMAKE6" = x; then
20    AC_MSG_CHECKING(for Qt 6)
21    AC_MSG_RESULT(no: qmake6 not found)
22    return
23  fi
24
25  qmake_dir="`mktemp -d`"
26
27  touch "$qmake_dir/configure.cpp" "$qmake_dir/configure.h"
28
29  cat > "$qmake_dir/configure.ui" <<EOT
30<?xml version="1.0" encoding="UTF-8"?>
31<ui version="4.0">
32</ui>
33EOT
34
35  cat > "$qmake_dir/configure.qrc" <<EOT
36<?xml version='1.0' encoding='UTF-8'?>
37<!DOCTYPE RCC>
38<RCC version='1.0'>
39 <qresource>
40  <file>configure.pro</file>
41 </qresource>
42</RCC>
43EOT
44
45  cat > "$qmake_dir/configure_non_gui.pro" <<EOT
46QT = core
47
48HEADERS = configure.h
49SOURCES = configure.cpp
50EOT
51
52  cat > "$qmake_dir/configure.pro" <<EOT
53QT = core dbus gui widgets network concurrent
54
55FORMS = configure.ui
56RESOURCES = configure.qrc
57HEADERS = configure.h
58SOURCES = configure.cpp
59EOT
60
61  old_wd="$PWD"
62  cd "$qmake_dir"
63
64  "$QMAKE6" -makefile -nocache configure_non_gui.pro > /dev/null
65  result=$?
66
67  if test $result = 0; then
68    mv Makefile Makefile.non_gui
69  fi
70
71  "$QMAKE6" -makefile -nocache configure.pro > /dev/null
72  result2=$?
73
74  "$QMAKE6" -query > "$qmake_dir/configure.properties"
75  result3=$?
76
77  cd "$old_wd"
78
79  if test $result != 0 -o $result2 != 0 -o $result3 != 0; then
80    AC_MSG_CHECKING(for Qt 6)
81    AC_MSG_RESULT(no: qmake6 couldn't be run for a dummy project)
82
83    rm -rf "$qmake_dir"
84
85    return
86  fi
87
88  dnl Check its version.
89  qmake6_ver="`$ac_cv_path_EGREP '^QT_VERSION:' "$qmake_dir/configure.properties" | sed 's/^QT_VERSION://'`"
90
91  AC_MSG_CHECKING(for qmake6's version)
92  if test -z "qmake6_ver"; then
93    AC_MSG_RESULT(unknown; please contact the author)
94    return
95  elif ! check_version $qt_min_ver $qmake6_ver; then
96    AC_MSG_RESULT(too old: $qmake6_ver, neet at least $qt_mIN-ver)
97    return
98  else
99    AC_MSG_RESULT($qmake6_ver)
100  fi
101
102  qt_bindir="`$ac_cv_path_EGREP '^QT_INSTALL_BINS:' "$qmake_dir/configure.properties" | sed 's/^QT_INSTALL_BINS://'`"
103  qt_libexecdir="`$ac_cv_path_EGREP '^QT_INSTALL_LIBEXECS:' "$qmake_dir/configure.properties" | sed 's/^QT_INSTALL_LIBEXECS://'`"
104  qt_searchpath="$qt_libexecdir:$qt_bindir:$PATH"
105
106  QT_CFLAGS="`$ac_cv_path_EGREP '^DEFINES *=' "$qmake_dir/Makefile" | sed 's/^DEFINES *= *//'`"
107  QT_CFLAGS="$QT_CFLAGS `$ac_cv_path_EGREP '^CXXFLAGS *=' "$qmake_dir/Makefile" | sed -e 's/^CXXFLAGS *= *//' -e 's/-pipe//g' -e 's/-O.//g' -e 's/ -W[[^ ]]*//g' -e 's/-std=[[^ ]]*//g' -e 's/\$(DEFINES)//g'`"
108  QT_CFLAGS="$QT_CFLAGS `$ac_cv_path_EGREP '^INCPATH *=' "$qmake_dir/Makefile" | sed -e 's/^INCPATH *= *//' -e 's:-I[[^/]][[^ ]]*::g'`"
109  QT_CFLAGS="`echo $QT_CFLAGS | sed -e 's/\$(EXPORT_ARCH_ARGS)//'`"
110  QT_LIBS="`$ac_cv_path_EGREP '^LFLAGS *=' "$qmake_dir/Makefile" | sed -e 's/^LFLAGS *= *//' -e 's/-Wl,-O[[^ ]]*//g'`"
111  QT_LIBS="$QT_LIBS `$ac_cv_path_EGREP '^LIBS *=' "$qmake_dir/Makefile" | sed -e 's/^LIBS *= *//' -e 's/\$(SUBLIBS)//g' -e 's:-L[[^/]][[^ ]]*::g'`"
112  QT_LIBS="`echo $QT_LIBS | sed -e 's/\$(EXPORT_ARCH_ARGS)//'`"
113  QT_LIBS_NON_GUI="`$ac_cv_path_EGREP '^LFLAGS *=' "$qmake_dir/Makefile.non_gui" | sed -e 's/^LFLAGS *= *//' -e 's/-Wl,-O[[^ ]]*//g'`"
114  QT_LIBS_NON_GUI="$QT_LIBS_NON_GUI `$ac_cv_path_EGREP '^LIBS *=' "$qmake_dir/Makefile.non_gui" | sed -e 's/^LIBS *= *//' -e 's/\$(SUBLIBS)//g' -e 's:-L[[^/]][[^ ]]*::g'`"
115  QT_LIBS_NON_GUI="`echo $QT_LIBS_NON_GUI | sed -e 's/\$(EXPORT_ARCH_ARGS)//'`"
116
117  rm -rf "$qmake_dir"
118
119  if test x"$QT_CFLAGS" = x -o x"$QT_LIBS" = x -o x"$QT_LIBS_NON_GUI" = x; then
120    AC_MSG_CHECKING(for Qt 6)
121    AC_MSG_RESULT(no: could not extract one or more compiler flags from Makefile generated by qmake6)
122    return
123  fi
124
125  AC_PATH_PROG(LCONVERT, lconvert,, [$qt_searchpath])
126  AC_PATH_PROG(MOC, moc,, [$qt_searchpath])
127  AC_PATH_PROG(RCC, rcc,, [$qt_searchpath])
128  AC_PATH_PROG(UIC, uic,, [$qt_searchpath])
129
130  if test x"$MOC" = x; then
131    AC_MSG_CHECKING(for Qt 6)
132    AC_MSG_RESULT(no: could not find the moc executable)
133    return
134
135  elif test x"$RCC" = x; then
136    AC_MSG_CHECKING(for Qt 6)
137    AC_MSG_RESULT(no: could not find the rcc executable)
138    return
139
140  elif test x"$UIC" = x; then
141    AC_MSG_CHECKING(for Qt 6)
142    AC_MSG_RESULT(no: could not find the uic executable)
143    return
144  fi
145
146  dnl compile test program
147  AC_LANG_PUSH(C++)
148  AC_CACHE_VAL(am_cv_qt6_compilation, [
149    ac_save_CXXFLAGS="$CXXFLAGS"
150    ac_save_LIBS="$LIBS"
151    CXXFLAGS="$STD_CXX $CXXFLAGS $QT_CFLAGS -fPIC"
152    LIBS="$LDFLAGS $QT_LIBS"
153    unset ac_cv_qt_compilation
154
155    AC_TRY_LINK([
156#include <QtCore>
157#include <QCoreApplication>
158class Config : public QCoreApplication {
159public:
160Config(int &argc, char **argv);
161};
162Config::Config(int &argc, char **argv)
163: QCoreApplication(argc,argv) {setApplicationName("config");}
164      ], [
165int ai = 0;
166char **ac = 0;
167Config app(ai,ac);
168return 0;
169      ], [ am_cv_qt6_compilation=1 ], [ am_cv_qt6_compilation=0 ])
170
171    CXXFLAGS="$ac_save_CXXFLAGS"
172    LIBS="$ac_save_LIBS"
173  ])
174  AC_LANG_POP()
175
176  if test x"$am_cv_qt6_compilation" != x1; then
177    AC_MSG_CHECKING(for Qt 6)
178    AC_MSG_RESULT(no: could not compile a test program)
179    return
180  fi
181
182  AC_DEFINE(HAVE_QT, 1, [Define if Qt is present])
183  AC_MSG_CHECKING(for Qt 6)
184  AC_MSG_RESULT(yes)
185  have_qt6=yes
186}
187
188AC_ARG_ENABLE([gui],
189  AC_HELP_STRING([--enable-gui],[compile the Qt-based GUI (yes)]),
190  [],[enable_gui=yes])
191AC_ARG_ENABLE([qt6],
192  AC_HELP_STRING([--enable-qt6],[compile with Qt 6 (yes)]),
193  [],[enable_qt6=yes])
194
195have_qt6=no
196
197if test x"$enable_qt6" != "xyes"; then
198  AC_MSG_CHECKING(for Qt 6)
199  AC_MSG_RESULT(no: disabled by user request)
200
201else
202  check_qt6
203
204  unset qmake_dir qt_bindir qt_libdir qt_searchpath
205
206  if test $have_qt6 != yes; then
207    unset QT_CFLAGS QT_LIBS QT_LIBS_NON_GUI LCONVERT MOC RCC UIC ac_cv_path_LCONVERT ac_cv_path_MOC ac_cv_path_RCC ac_cv_path_UIC
208  fi
209fi
210