Adapted from https://github.com/bitcoin/bitcoin/pull/24798 diff --git a/build-aux/m4/bitcoin_qt.m4 b/build-aux/m4/bitcoin_qt.m4 index 7498127860..bd95aff2a8 100644 --- a/build-aux/m4/bitcoin_qt.m4 +++ b/build-aux/m4/bitcoin_qt.m4 @@ -5,7 +5,7 @@ dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. dnl Helper for cases where a qt dependency is not met. dnl Output: If qt version is auto, set bitcoin_enable_qt to false. Else, exit. AC_DEFUN([BITCOIN_QT_FAIL],[ - if test "$bitcoin_qt_want_version" = "auto" && test "$bitcoin_qt_force" != "yes"; then + if test "$bitcoin_qt_want_version" = "auto"; then if test "$bitcoin_enable_qt" != "no"; then AC_MSG_WARN([$1; bitcoin-qt frontend will not be built]) fi @@ -53,15 +53,9 @@ dnl CAUTION: Do not use this inside of a conditional. AC_DEFUN([BITCOIN_QT_INIT],[ dnl enable qt support AC_ARG_WITH([gui], - [AS_HELP_STRING([--with-gui@<:@=no|qt5|auto@:>@], + [AS_HELP_STRING([--with-gui@<:@=no|qt5|qt6|auto@:>@], [build bitcoin-qt GUI (default=auto)])], - [ - bitcoin_qt_want_version=$withval - if test "$bitcoin_qt_want_version" = "yes"; then - bitcoin_qt_force=yes - bitcoin_qt_want_version=auto - fi - ], + [bitcoin_qt_want_version=$withval], [bitcoin_qt_want_version=auto]) AS_IF([test "$with_gui" = "qt5_debug"], @@ -70,6 +64,12 @@ AC_DEFUN([BITCOIN_QT_INIT],[ [qt_lib_suffix= ]); bitcoin_qt_want_version=qt5], [qt_lib_suffix= ]) + AS_IF([test "$with_gui" = "qt6_debug"], + [AS_CASE([$host], + [*darwin*], [qt_lib_suffix=_debug], + [qt_lib_suffix= ]); bitcoin_qt_want_version=qt6], + [qt_lib_suffix= ]) + AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) @@ -95,6 +95,57 @@ dnl Outputs: bitcoin_enable_qt, bitcoin_enable_qt_dbus, bitcoin_enable_qt_test AC_DEFUN([BITCOIN_QT_CONFIGURE],[ qt_version=">= $1" qt_lib_prefix="Qt5" + if test "$bitcoin_qt_want_version" = "qt6"; then + qt_lib_prefix="Qt6" + fi + + if test "$use_hardening" != "no"; then + BITCOIN_QT_CHECK([ + AC_MSG_CHECKING([whether -fPIE can be used with this Qt config]) + TEMP_CPPFLAGS=$CPPFLAGS + TEMP_CXXFLAGS=$CXXFLAGS + CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS" + CXXFLAGS="$PIE_FLAGS $CORE_CXXFLAGS $CXXFLAGS" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #ifndef QT_VERSION + # include + #endif + ]], + [[ + #if defined(QT_REDUCE_RELOCATIONS) + choke + #endif + ]])], + [ AC_MSG_RESULT([yes]); QT_PIE_FLAGS=$PIE_FLAGS ], + [ AC_MSG_RESULT([no]); QT_PIE_FLAGS=$PIC_FLAGS] + ) + CPPFLAGS=$TEMP_CPPFLAGS + CXXFLAGS=$TEMP_CXXFLAGS + ]) + else + BITCOIN_QT_CHECK([ + AC_MSG_CHECKING([whether -fPIC is needed with this Qt config]) + TEMP_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #ifndef QT_VERSION + # include + #endif + ]], + [[ + #if defined(QT_REDUCE_RELOCATIONS) + choke + #endif + ]])], + [ AC_MSG_RESULT([no])], + [ AC_MSG_RESULT([yes]); QT_PIE_FLAGS=$PIC_FLAGS] + ) + CPPFLAGS=$TEMP_CPPFLAGS + ]) + fi + BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS]) dnl This is ugly and complicated. Yuck. Works as follows: @@ -153,53 +204,6 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ qt_bin_path="`$PKG_CONFIG --variable=host_bins ${qt_lib_prefix}Core 2>/dev/null`" fi - if test "$use_hardening" != "no"; then - BITCOIN_QT_CHECK([ - AC_MSG_CHECKING([whether -fPIE can be used with this Qt config]) - TEMP_CPPFLAGS=$CPPFLAGS - TEMP_CXXFLAGS=$CXXFLAGS - CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS" - CXXFLAGS="$PIE_FLAGS $CORE_CXXFLAGS $CXXFLAGS" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #ifndef QT_VERSION - # include - #endif - ]], - [[ - #if defined(QT_REDUCE_RELOCATIONS) - choke - #endif - ]])], - [ AC_MSG_RESULT([yes]); QT_PIE_FLAGS=$PIE_FLAGS ], - [ AC_MSG_RESULT([no]); QT_PIE_FLAGS=$PIC_FLAGS] - ) - CPPFLAGS=$TEMP_CPPFLAGS - CXXFLAGS=$TEMP_CXXFLAGS - ]) - else - BITCOIN_QT_CHECK([ - AC_MSG_CHECKING([whether -fPIC is needed with this Qt config]) - TEMP_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include - #ifndef QT_VERSION - # include - #endif - ]], - [[ - #if defined(QT_REDUCE_RELOCATIONS) - choke - #endif - ]])], - [ AC_MSG_RESULT([no])], - [ AC_MSG_RESULT([yes]); QT_PIE_FLAGS=$PIC_FLAGS] - ) - CPPFLAGS=$TEMP_CPPFLAGS - ]) - fi - BITCOIN_QT_PATH_PROGS([MOC], [moc-qt5 moc5 moc], $qt_bin_path) BITCOIN_QT_PATH_PROGS([UIC], [uic-qt5 uic5 uic], $qt_bin_path) BITCOIN_QT_PATH_PROGS([RCC], [rcc-qt5 rcc5 rcc], $qt_bin_path) @@ -340,6 +344,36 @@ AC_DEFUN([_BITCOIN_QT_CHECK_STATIC_LIBS], [ fi ]) +dnl Internal. Check whether Qt application can be initialized. +dnl +dnl _BITCOIN_QT_CHECK_APP(APPLICATION_CLASS) +dnl ---------------------------------------- +dnl +dnl dnl Requires: QT_INCLUDES and QT_LIBS must be populated as necessary. +dnl Inputs: $1: QCoreApplication, QGuiApplication, or QApplication. +AC_DEFUN([_BITCOIN_QT_CHECK_APP], [ + AC_MSG_CHECKING([for $1 initialization]) + TEMP_CPPFLAGS="$CPPFLAGS" + TEMP_CXXFLAGS="$CXXFLAGS" + TEMP_LIBS="$LIBS" + CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS" + CXXFLAGS="$QT_PIE_FLAGS $CORE_CXXFLAGS $CXXFLAGS" + LIBS="$QT_LIBS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + #include <$1> + ]], + [[ + int argc = 1; + const char* argv = "core"; + $1 app(argc, const_cast(&argv)); + ]])], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]); BITCOIN_QT_FAIL([$1 failed to initialize.])]) + CXXFLAGS="$TEMP_CXXFLAGS" + LIBS="$TEMP_LIBS" + CPPFLAGS="$TEMP_CPPFLAGS" +]) + dnl Internal. Find Qt libraries using pkg-config. dnl dnl _BITCOIN_QT_FIND_LIBS @@ -349,16 +383,25 @@ dnl Outputs: All necessary QT_* variables are set. dnl Outputs: have_qt_test and have_qt_dbus are set (if applicable) to yes|no. AC_DEFUN([_BITCOIN_QT_FIND_LIBS],[ BITCOIN_QT_CHECK([ - PKG_CHECK_MODULES([QT_CORE], [${qt_lib_prefix}Core${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_CORE_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_CORE_LIBS $QT_LIBS"], + PKG_CHECK_MODULES([QT_CORE], [${qt_lib_prefix}Core${qt_lib_suffix} $qt_version], [], [BITCOIN_QT_FAIL([${qt_lib_prefix}Core${qt_lib_suffix} $qt_version not found])]) + QT_INCLUDES="$QT_CORE_CFLAGS $QT_INCLUDES" + QT_LIBS="$QT_CORE_LIBS $QT_LIBS" + _BITCOIN_QT_CHECK_APP([QCoreApplication]) ]) BITCOIN_QT_CHECK([ - PKG_CHECK_MODULES([QT_GUI], [${qt_lib_prefix}Gui${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_GUI_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_GUI_LIBS $QT_LIBS"], + PKG_CHECK_MODULES([QT_GUI], [${qt_lib_prefix}Gui${qt_lib_suffix} $qt_version], [], [BITCOIN_QT_FAIL([${qt_lib_prefix}Gui${qt_lib_suffix} $qt_version not found])]) + QT_INCLUDES="$QT_GUI_CFLAGS $QT_INCLUDES" + QT_LIBS="$QT_GUI_LIBS $QT_LIBS" + _BITCOIN_QT_CHECK_APP([QGuiApplication]) ]) BITCOIN_QT_CHECK([ - PKG_CHECK_MODULES([QT_WIDGETS], [${qt_lib_prefix}Widgets${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_WIDGETS_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_WIDGETS_LIBS $QT_LIBS"], + PKG_CHECK_MODULES([QT_WIDGETS], [${qt_lib_prefix}Widgets${qt_lib_suffix} $qt_version], [], [BITCOIN_QT_FAIL([${qt_lib_prefix}Widgets${qt_lib_suffix} $qt_version not found])]) + QT_INCLUDES="$QT_WIDGETS_CFLAGS $QT_INCLUDES" + QT_LIBS="$QT_WIDGETS_LIBS $QT_LIBS" + _BITCOIN_QT_CHECK_APP([QApplication]) ]) BITCOIN_QT_CHECK([ PKG_CHECK_MODULES([QT_NETWORK], [${qt_lib_prefix}Network${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_NETWORK_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_NETWORK_LIBS $QT_LIBS"], @@ -368,7 +411,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS],[ BITCOIN_QT_CHECK([ PKG_CHECK_MODULES([QT_TEST], [${qt_lib_prefix}Test${qt_lib_suffix} $qt_version], [QT_TEST_INCLUDES="$QT_TEST_CFLAGS"; have_qt_test=yes], [have_qt_test=no]) if test "$use_dbus" != "no"; then - PKG_CHECK_MODULES([QT_DBUS], [${qt_lib_prefix}DBus $qt_version], [QT_DBUS_INCLUDES="$QT_DBUS_CFLAGS"; have_qt_dbus=yes], [have_qt_dbus=no]) + PKG_CHECK_MODULES([QT_DBUS], [${qt_lib_prefix}DBus $qt_version], [QT_INCLUDES="$QT_DBUS_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_LIBS $QT_DBUS_LIBS" QT_DBUS_INCLUDES="$QT_DBUS_CFLAGS"; have_qt_dbus=yes], [have_qt_dbus=no]) fi ]) ]) diff --git a/configure.ac b/configure.ac index 86d5e5e214..af5e7c06c9 100644 --- a/configure.ac +++ b/configure.ac @@ -1726,9 +1726,11 @@ if test "$enable_wallet" != "no"; then echo " with sqlite = $use_sqlite" echo " with bdb = $use_bdb" fi -echo " with gui / qt = $bitcoin_enable_qt" if test $bitcoin_enable_qt != "no"; then + echo " with gui / qt = $bitcoin_enable_qt, $qt_lib_prefix" echo " with qr = $use_qr" +else + echo " with gui / qt = $bitcoin_enable_qt" fi echo " with zmq = $use_zmq" if test $enable_fuzz = "no"; then diff --git a/depends/config.site.in b/depends/config.site.in index f6bed6a9d4..c1c0a8448d 100644 --- a/depends/config.site.in +++ b/depends/config.site.in @@ -17,6 +17,10 @@ ac_tool_prefix="${host_alias}-" if test -z "$with_boost"; then with_boost="$depends_prefix" fi + +if test -z "$with_qt_libdir"; then + with_qt_libdir="${depends_prefix}/lib" +fi if test -z "$with_qt_plugindir"; then with_qt_plugindir="${depends_prefix}/plugins" fi diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index ae3f9aa686..2aaf6baa75 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -16,7 +16,6 @@ #include #include #include -#include #include #include #include @@ -26,6 +25,10 @@ #include +#ifdef ENABLE_WALLET +#include +#endif + #include #include #include