From 8d019bbb8d40de2cbed7ad6d3367c6a46a561fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= Date: Tue, 11 Oct 2022 10:14:53 +0200 Subject: [PATCH] build,qt: Allow building QGpgME for Qt 6 * configure.ac: Look for Qt 5 and/or Qt 6. Require C++17 if Qt 6 binding is built. Build cmake files QGpgmeConfig* for Qt 5 and QGpgmeQt6Config* for Qt 6. (available_languages): Add "qt5" and "qt6". (WANT_QT5, WANT_QT6): New conditionals. * lang/qt/src/Makefile.am: Keep building libqgpgme for Qt 5. Build libqgpgmeqt6 for Qt 6. * lang/qt/tests/Makefile.am: Build tests for Qt 5 or Qt 6. * lang/qt/src/QGpgmeQt6Config-w32.cmake.in.in, lang/qt/src/QGpgmeQt6Config.cmake.in.in, lang/qt/src/QGpgmeQt6ConfigVersion.cmake.in, m4/qt6.m4: New. -- This makes it possible to build QGpgME optionally for Qt 6.4.0 or later. By default or if the language "qt" is enabled, then QGpgME is built either for Qt 5 (if found) or Qt 6. A build for Qt 5 or Qt 6 can be requested by explicitly enabling the language "qt5" or "qt6". Building QGpgME for Qt 5 and Qt 6 simultaneously is not supported. --- configure.ac | 201 ++++++++++++++------ lang/qt/src/Makefile.am | 75 +++++++- lang/qt/src/QGpgmeQt6Config-w32.cmake.in.in | 105 ++++++++++ lang/qt/src/QGpgmeQt6Config.cmake.in.in | 101 ++++++++++ lang/qt/src/QGpgmeQt6ConfigVersion.cmake.in | 31 +++ lang/qt/tests/Makefile.am | 13 ++ m4/qt6.m4 | 82 ++++++++ 7 files changed, 545 insertions(+), 63 deletions(-) create mode 100644 lang/qt/src/QGpgmeQt6Config-w32.cmake.in.in create mode 100644 lang/qt/src/QGpgmeQt6Config.cmake.in.in create mode 100644 lang/qt/src/QGpgmeQt6ConfigVersion.cmake.in create mode 100644 m4/qt6.m4 diff --git a/configure.ac b/configure.ac index 8fcf14f6..cee1781d 100644 --- a/configure.ac +++ b/configure.ac @@ -218,7 +218,7 @@ have_w64_system=no have_macos_system=no build_w32_glib=no build_w32_qt=no -available_languages="cl cpp python qt" +available_languages="cl cpp python qt qt5 qt6" default_languages="cl cpp python qt" case "${host}" in x86_64-*mingw32*) @@ -305,7 +305,9 @@ fi # lang/Makefile.am's DIST_SUBDIRS. AC_ARG_ENABLE([languages], AS_HELP_STRING([--enable-languages=languages], - [enable only specific language bindings]), + [enable only specific language bindings: + cl cpp python qt qt5 qt6 (qt selects qt5 or qt6, + and qt5 and qt6 exclude each other)]), [enabled_languages=`echo $enableval | \ tr ',:' ' ' | tr '[A-Z]' '[a-z]' | \ sed 's/c++/cpp/'`], @@ -331,84 +333,160 @@ for language in $enabled_languages; do fi done -# Enable C++ 11 if cpp language is requested -LIST_MEMBER("cpp", $enabled_languages) +# Check whether Qt5 and/or Qt6 are enabled explicitly +want_qt5="no"; +LIST_MEMBER("qt5", $enabled_languages) if test "$found" = "1"; then + want_qt5="yes"; + # Remove qt5; further down qt will be added + enabled_languages=$(echo $enabled_languages | sed 's/qt5//') +fi +want_qt6="no"; +LIST_MEMBER("qt6", $enabled_languages) +if test "$found" = "1"; then + want_qt6="yes"; + # Remove qt6; further down qt will be added + enabled_languages=$(echo $enabled_languages | sed 's/qt6//') +fi +if test "$want_qt5" = "yes" -a "$want_qt6" = "yes"; then + AC_MSG_ERROR([[ +*** +*** The bindings for Qt5 and Qt6 cannot be built simultaneously. +***]]) +fi + +# Ensure that pkg-config is available for all calls of FIND_QT5/FIND_QT6 +PKG_PROG_PKG_CONFIG + +# If the generic qt is enabled, then check for Qt5 or Qt6 (in this order) +LIST_MEMBER("qt", $enabled_languages) +if test "$found" = "1"; then + # Remove the generic qt (qt5 and qt6 have already been removed) + enabled_languages=$(echo $enabled_languages | sed 's/qt//') + FIND_QT5 + if test "$have_qt5_libs" = "yes"; then + want_qt5="yes"; + else + FIND_QT6 + if test "$have_qt6_libs" = "yes"; then + want_qt6="yes"; + else + if test "$explicit_languages" = "1"; then + AC_MSG_ERROR([[ +*** +*** Qt5 (Qt5Core) or Qt6 (Qt6Core) is required for the Qt binding. +***]]) + else + AC_MSG_WARN([[ +*** +*** Qt5 (Qt5Core) and Qt6 (Qt6Core) not found. Qt Binding will be disabled. +***]]) + fi + fi + fi +elif test "$want_qt5" = "yes"; then + FIND_QT5 + if test "$have_qt5_libs" != "yes"; then + AC_MSG_ERROR([[ +*** +*** Qt5 (Qt5Core) is required for the Qt 5 binding. +***]]) + fi +elif test "$want_qt6" = "yes"; then + FIND_QT6 + if test "$have_qt6_libs" != "yes"; then + AC_MSG_ERROR([[ +*** +*** Qt6 (Qt6Core) is required for the Qt 6 binding. +***]]) + fi +fi + +# Check that cpp is enabled if qt5 or qt6 is enabled +if test "$want_qt5" = "yes" -o "$want_qt6" = "yes"; then + LIST_MEMBER("cpp", $enabled_languages) + if test "$found" = "0"; then + AC_MSG_ERROR([[ +*** +*** The Qt bindings depend on the C++ binding. +***]]) + fi +fi + +# Enable C++ 17 if qt6 is requested +if test "$want_qt6" = "yes"; then + AX_CXX_COMPILE_STDCXX(17, noext, optional) + if test "$HAVE_CXX17" != "1"; then + if test "$explicit_languages" = "1"; then + AC_MSG_ERROR([[ +*** +*** A compiler with c++17 support is required for the Qt 6 binding. +***]]) + else + want_qt6="no" + AC_MSG_WARN([[ +*** +*** No c++17 support detected. Qt 6 binding will be disabled. +***]]) + fi + fi +fi + +# Enable C++ 11 if cpp is requested (unless C++ 17 was already enabled) +LIST_MEMBER("cpp", $enabled_languages) +if test "$found" = "1" -a "$HAVE_CXX17" != "1"; then AX_CXX_COMPILE_STDCXX(11, noext, optional) if test "$HAVE_CXX11" != "1"; then if test "$explicit_languages" = "1"; then AC_MSG_ERROR([[ *** -*** A compiler with c++11 support is required for the c++ binding. +*** A compiler with c++11 support is required for the C++ binding. ***]]) else enabled_languages=$(echo $enabled_languages | sed 's/cpp//') - enabled_languages=$(echo $enabled_languages | sed 's/qt//') + want_qt5="no" AC_MSG_WARN([[ *** -*** No c++11 support detected. C++ and Qt bindings will be disabled. +*** No c++11 support detected. C++ and Qt 5 bindings will be disabled. ***]]) fi fi fi +# Now append qt to the list of language bindings +if test "$want_qt5" = "yes" -o "$want_qt6" = "yes"; then + enabled_languages=$(echo $enabled_languages qt) +fi + # Check whether compiler supports visibility attribute (if cpp language is enabled) LIST_MEMBER("cpp", $enabled_languages) if test "$found" = "1"; then AX_GCC_FUNC_ATTRIBUTE(visibility) if test "$ax_cv_have_func_attribute_visibility" = "yes"; then GPGME_CPP_CFLAGS="$GPGME_CPP_CFLAGS -fvisibility=hidden" + if test "$want_qt5" = "yes"; then + GPGME_QT5_CFLAGS="$GPGME_QT5_CFLAGS -fvisibility=hidden" + fi + if test "$want_qt6" = "yes"; then + GPGME_QT6_CFLAGS="$GPGME_QT6_CFLAGS -fvisibility=hidden" + fi fi fi AC_SUBST(GPGME_CPP_CFLAGS) -# Check that if qt is enabled cpp also is enabled -LIST_MEMBER("qt", $enabled_languages) -if test "$found" = "1"; then - # We need to ensure that in the language order qt comes after cpp - # so we remove qt first and explicitly add it as last list member. - enabled_languages=$(echo $enabled_languages | sed 's/qt//') - LIST_MEMBER("cpp", $enabled_languages) - if test "$found" = "0"; then - AC_MSG_ERROR([[ -*** -*** Qt language binding depends on cpp binding. -***]]) - fi - FIND_QT5 - if test "$have_qt5_libs" != "yes"; then - if test "$explicit_languages" = "1"; then - AC_MSG_ERROR([[ -*** -*** Qt5 (Qt5Core) is required for Qt binding. -***]]) - else - AC_MSG_WARN([[ -*** -*** Qt5 (Qt5Core) not found Qt Binding will be disabled. -***]]) - fi - else - enabled_languages=`echo $enabled_languages qt` +AM_CONDITIONAL(WANT_QT5, test "$want_qt5" = yes) +AM_CONDITIONAL(WANT_QT6, test "$want_qt6" = yes) - AC_CHECK_PROGS([DOXYGEN], [doxygen]) - if test -z "$DOXYGEN"; - # This is not highlighted because it's not really important. - then AC_MSG_WARN([Doxygen not found - Qt binding doc will not be built.]) - fi - AC_CHECK_PROGS([GRAPHVIZ], [dot]) - if test -z "$GRAPHVIZ"; - then AC_MSG_WARN([Graphviz not found - Qt binding doc will not have diagrams.]) - fi +# Check for tools for building the Qt binding docs +if test "$want_qt5" = "yes" -o "$want_qt6" = "yes"; then + AC_CHECK_PROGS([DOXYGEN], [doxygen]) + if test -z "$DOXYGEN"; then + # This is not highlighted because it's not really important. + AC_MSG_WARN([Doxygen not found - Qt binding doc will not be built.]) fi -fi - -# Check if compiler supports visibility attribute (if qt is enabled) -LIST_MEMBER("qt", $enabled_languages) -if test "$found" = "1"; then - AX_GCC_FUNC_ATTRIBUTE(visibility) - if test "$ax_cv_have_func_attribute_visibility" = "yes"; then - GPGME_QT5_CFLAGS="$GPGME_QT5_CFLAGS -fvisibility=hidden" + AC_CHECK_PROGS([GRAPHVIZ], [dot]) + if test -z "$GRAPHVIZ"; then + AC_MSG_WARN([Graphviz not found - Qt binding doc will not have diagrams.]) fi fi @@ -967,9 +1045,16 @@ AC_CONFIG_FILES(lang/cpp/src/GpgmeppConfig.cmake.in) AC_CONFIG_FILES(lang/cpp/src/GpgmeppConfigVersion.cmake) AC_CONFIG_FILES(lang/cpp/src/gpgmepp_version.h) AC_CONFIG_FILES(lang/qt/Makefile lang/qt/src/Makefile) -AC_CONFIG_FILES(lang/qt/src/QGpgmeConfig-w32.cmake.in) -AC_CONFIG_FILES(lang/qt/src/QGpgmeConfig.cmake.in) -AC_CONFIG_FILES(lang/qt/src/QGpgmeConfigVersion.cmake) +if test "$want_qt5" = "yes"; then + AC_CONFIG_FILES(lang/qt/src/QGpgmeConfig-w32.cmake.in) + AC_CONFIG_FILES(lang/qt/src/QGpgmeConfig.cmake.in) + AC_CONFIG_FILES(lang/qt/src/QGpgmeConfigVersion.cmake) +fi +if test "$want_qt6" = "yes"; then + AC_CONFIG_FILES(lang/qt/src/QGpgmeQt6Config-w32.cmake.in) + AC_CONFIG_FILES(lang/qt/src/QGpgmeQt6Config.cmake.in) + AC_CONFIG_FILES(lang/qt/src/QGpgmeQt6ConfigVersion.cmake) +fi AC_CONFIG_FILES(lang/qt/tests/Makefile) AC_CONFIG_FILES(lang/qt/src/qgpgme_version.h) AC_CONFIG_FILES([lang/Makefile lang/cl/Makefile lang/cl/gpgme.asd]) @@ -987,6 +1072,12 @@ AC_CONFIG_FILES([lang/python/Makefile AC_CONFIG_FILES([lang/python/setup.py], [chmod a+x lang/python/setup.py]) AC_OUTPUT +if test "$want_qt5" = "yes"; then + enabled_languages_v=$(echo ${enabled_languages_v:-$enabled_languages} | sed "s/qt/qt (Qt 5)/") +elif test "$want_qt6" = "yes"; then + enabled_languages_v=$(echo ${enabled_languages_v:-$enabled_languages} | sed "s/qt/qt (Qt 6)/") +fi + echo " GPGME v${VERSION} has been configured as follows: diff --git a/lang/qt/src/Makefile.am b/lang/qt/src/Makefile.am index aa03cc72..9ad826e9 100644 --- a/lang/qt/src/Makefile.am +++ b/lang/qt/src/Makefile.am @@ -18,10 +18,18 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA + +if WANT_QT5 lib_LTLIBRARIES = libqgpgme.la +endif +if WANT_QT6 +lib_LTLIBRARIES = libqgpgmeqt6.la +endif + EXTRA_DIST = QGpgmeConfig.cmake.in.in QGpgmeConfigVersion.cmake.in \ qgpgme_debug.h qgpgme_version.h.in \ - QGpgmeConfig-w32.cmake.in.in + QGpgmeConfig-w32.cmake.in.in QGpgmeQt6Config.cmake.in.in \ + QGpgmeQt6Config-w32.cmake.in.in QGpgmeQt6ConfigVersion.cmake.in qgpgme_sources = \ dataprovider.cpp \ @@ -258,17 +266,32 @@ camelcaseincludedir = $(includedir)/QGpgME camelcaseinclude_HEADERS = $(camelcase_headers) nodist_qgpgmeinclude_HEADERS = qgpgme_version.h -libqgpgme_la_SOURCES = $(qgpgme_sources) $(qgpgme_headers) $(private_qgpgme_headers) - +if WANT_QT5 AM_CPPFLAGS = -I$(top_srcdir)/lang/cpp/src -I$(top_builddir)/src \ @GPGME_QT5_CFLAGS@ @GPG_ERROR_CFLAGS@ @LIBASSUAN_CFLAGS@ \ -DBUILDING_QGPGME -Wsuggest-override \ -Wzero-as-null-pointer-constant +libqgpgme_la_SOURCES = $(qgpgme_sources) $(qgpgme_headers) $(private_qgpgme_headers) + libqgpgme_la_LIBADD = ../../cpp/src/libgpgmepp.la ../../../src/libgpgme.la \ - @LIBASSUAN_LIBS@ @GPG_ERROR_LIBS@ @GPGME_QT5_LIBS@ + @LIBASSUAN_LIBS@ @GPG_ERROR_LIBS@ @GPGME_QT5_LIBS@ libqgpgme_la_LDFLAGS = -no-undefined -version-info \ - @LIBQGPGME_LT_CURRENT@:@LIBQGPGME_LT_REVISION@:@LIBQGPGME_LT_AGE@ + @LIBQGPGME_LT_CURRENT@:@LIBQGPGME_LT_REVISION@:@LIBQGPGME_LT_AGE@ +endif +if WANT_QT6 +AM_CPPFLAGS = -I$(top_srcdir)/lang/cpp/src -I$(top_builddir)/src \ + @GPGME_QT6_CFLAGS@ @GPG_ERROR_CFLAGS@ @LIBASSUAN_CFLAGS@ \ + -DBUILDING_QGPGME -Wsuggest-override \ + -Wzero-as-null-pointer-constant + +libqgpgmeqt6_la_SOURCES = $(qgpgme_sources) $(qgpgme_headers) $(private_qgpgme_headers) + +libqgpgmeqt6_la_LIBADD = ../../cpp/src/libgpgmepp.la ../../../src/libgpgme.la \ + @LIBASSUAN_LIBS@ @GPG_ERROR_LIBS@ @GPGME_QT6_LIBS@ +libqgpgmeqt6_la_LDFLAGS = -no-undefined -version-info \ + @LIBQGPGME_LT_CURRENT@:@LIBQGPGME_LT_REVISION@:@LIBQGPGME_LT_AGE@ +endif if HAVE_MACOS_SYSTEM libsuffix=.dylib @@ -276,6 +299,7 @@ else libsuffix=.so endif +if WANT_QT5 if HAVE_W32_SYSTEM QGpgmeConfig.cmake: QGpgmeConfig-w32.cmake.in sed -e 's|[@]resolved_bindir@|$(bindir)|g' < "$<" | \ @@ -287,23 +311,52 @@ QGpgmeConfig.cmake: QGpgmeConfig.cmake.in sed -e 's|[@]libsuffix@|$(libsuffix)|g' | \ sed -e 's|[@]resolved_includedir@|$(includedir)|g' > $@ endif +endif +if WANT_QT6 +if HAVE_W32_SYSTEM +QGpgmeQt6Config.cmake: QGpgmeQt6Config-w32.cmake.in + sed -e 's|[@]resolved_bindir@|$(bindir)|g' < "$<" | \ + sed -e 's|[@]resolved_libdir@|$(libdir)|g' | \ + sed -e 's|[@]resolved_includedir@|$(includedir)|g' > $@ +else +QGpgmeQt6Config.cmake: QGpgmeQt6Config.cmake.in + sed -e 's|[@]resolved_libdir@|$(libdir)|g' < "$<" | \ + sed -e 's|[@]libsuffix@|$(libsuffix)|g' | \ + sed -e 's|[@]resolved_includedir@|$(includedir)|g' > $@ +endif +endif $(camelcase_headers): Makefile.am echo -n "#include \"qgpgme/" > "$@" echo -n "$@" | tr '[:upper:]' '[:lower:]' >> "$@" echo ".h\"" >> "$@" +if WANT_QT5 install-cmake-files: QGpgmeConfig.cmake QGpgmeConfigVersion.cmake -$(INSTALL) -d $(DESTDIR)$(libdir)/cmake/QGpgme $(INSTALL) -m 644 QGpgmeConfig.cmake \ - $(DESTDIR)$(libdir)/cmake/QGpgme/QGpgmeConfig.cmake + $(DESTDIR)$(libdir)/cmake/QGpgme/QGpgmeConfig.cmake $(INSTALL) -m 644 QGpgmeConfigVersion.cmake \ - $(DESTDIR)$(libdir)/cmake/QGpgme/QGpgmeConfigVersion.cmake + $(DESTDIR)$(libdir)/cmake/QGpgme/QGpgmeConfigVersion.cmake uninstall-cmake-files: -rm $(DESTDIR)$(libdir)/cmake/QGpgme/QGpgmeConfigVersion.cmake -rm $(DESTDIR)$(libdir)/cmake/QGpgme/QGpgmeConfig.cmake -rmdir $(DESTDIR)$(libdir)/cmake/QGpgme/ +endif +if WANT_QT6 +install-cmake-files: QGpgmeQt6Config.cmake QGpgmeQt6ConfigVersion.cmake + -$(INSTALL) -d $(DESTDIR)$(libdir)/cmake/QGpgmeQt6 + $(INSTALL) -m 644 QGpgmeQt6Config.cmake \ + $(DESTDIR)$(libdir)/cmake/QGpgmeQt6/QGpgmeQt6Config.cmake + $(INSTALL) -m 644 QGpgmeQt6ConfigVersion.cmake \ + $(DESTDIR)$(libdir)/cmake/QGpgmeQt6/QGpgmeQt6ConfigVersion.cmake + +uninstall-cmake-files: + -rm $(DESTDIR)$(libdir)/cmake/QGpgmeQt6/QGpgmeQt6ConfigVersion.cmake + -rm $(DESTDIR)$(libdir)/cmake/QGpgmeQt6/QGpgmeQt6Config.cmake + -rmdir $(DESTDIR)$(libdir)/cmake/QGpgmeQt6/ +endif install-data-local: install-cmake-files @@ -313,9 +366,15 @@ BUILT_SOURCES = $(qgpgme_moc_sources) $(camelcase_headers) CLEANFILES = $(qgpgme_moc_sources) $(camelcase_headers) QGpgmeConfig.cmake \ qgpgme_version.h QGpgmeConfig.cmake.in \ - QGpgmeConfigVersion.cmake + QGpgmeConfigVersion.cmake QGpgmeQt6Config.cmake.in \ + QGpgmeQt6Config.cmake QGpgmeQt6ConfigVersion.cmake +if WANT_QT5 nodist_libqgpgme_la_SOURCES = $(qgpgme_moc_sources) +endif +if WANT_QT6 +nodist_libqgpgmeqt6_la_SOURCES = $(qgpgme_moc_sources) +endif .h.moc: $(MOC) `test -f '$<' || echo '$(srcdir)/'`$< -o $@ diff --git a/lang/qt/src/QGpgmeQt6Config-w32.cmake.in.in b/lang/qt/src/QGpgmeQt6Config-w32.cmake.in.in new file mode 100644 index 00000000..6cb8af40 --- /dev/null +++ b/lang/qt/src/QGpgmeQt6Config-w32.cmake.in.in @@ -0,0 +1,105 @@ +# CMake Config file for QGpgME for Qt 6 +# Copyright (C) 2016 Intevation GmbH +# +# This file is part of GPGME. +# +# QGpgME is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# QGpgME is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA + +# based on a generated file from cmake. +# Generated by CMake 3.0.2 + +if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5) + message(FATAL_ERROR "CMake >= 2.6.0 required") +endif() +cmake_policy(PUSH) +cmake_policy(VERSION 2.6) +#---------------------------------------------------------------- +# Generated CMake target import file. +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Protect against multiple inclusion, which would fail when already imported targets are added once more. +set(_targetsDefined) +set(_targetsNotDefined) +set(_expectedTargets) +foreach(_expectedTarget QGpgmeQt6) + list(APPEND _expectedTargets ${_expectedTarget}) + if(NOT TARGET ${_expectedTarget}) + list(APPEND _targetsNotDefined ${_expectedTarget}) + endif() + if(TARGET ${_expectedTarget}) + list(APPEND _targetsDefined ${_expectedTarget}) + endif() +endforeach() +if("${_targetsDefined}" STREQUAL "${_expectedTargets}") + set(CMAKE_IMPORT_FILE_VERSION) + cmake_policy(POP) + return() +endif() +if(NOT "${_targetsDefined}" STREQUAL "") + message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") +endif() +unset(_targetsDefined) +unset(_targetsNotDefined) +unset(_expectedTargets) + +# Create imported target QGpgmeQt6 +add_library(QGpgmeQt6 SHARED IMPORTED) + +set_target_properties(QGpgmeQt6 PROPERTIES + IMPORTED_IMPLIB_RELEASE "@resolved_libdir@/libqgpgmeqt6.dll.a" + INTERFACE_INCLUDE_DIRECTORIES "@resolved_includedir@/qgpgme;@resolved_includedir@" + INTERFACE_LINK_LIBRARIES "Gpgmepp;Qt6::Core" + IMPORTED_LOCATION "@resolved_libdir@/libqgpgmeqt6-7.dll" +) + +list(APPEND _IMPORT_CHECK_TARGETS QGpgmeQt6 ) +list(APPEND _IMPORT_CHECK_FILES_FOR_QGpgmeQt6 "@resolved_libdir@/libqgpgmeqt6.dll.a" "@resolved_bindir@/libqgpgmeqt6-7.dll" ) + +if(CMAKE_VERSION VERSION_LESS 2.8.12) + message(FATAL_ERROR "This file relies on consumers using CMake 2.8.12 or greater.") +endif() + +# Loop over all imported files and verify that they actually exist +foreach(target ${_IMPORT_CHECK_TARGETS} ) + foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) + if(NOT EXISTS "${file}" ) + message(FATAL_ERROR "The imported target \"${target}\" references the file + \"${file}\" +but this file does not exist. Possible reasons include: +* The file was deleted, renamed, or moved to another location. +* An install or uninstall procedure did not complete successfully. +* The installation package was faulty and contained + \"${CMAKE_CURRENT_LIST_FILE}\" +but not all the files it references. +") + endif() + endforeach() + unset(_IMPORT_CHECK_FILES_FOR_${target}) +endforeach() +unset(_IMPORT_CHECK_TARGETS) + +# This file does not depend on other imported targets which have +# been exported from the same project but in a separate export set. + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) +cmake_policy(POP) + +# Gpgmepp is a requirement for QGpgME +find_package(Gpgmepp CONFIG REQUIRED) diff --git a/lang/qt/src/QGpgmeQt6Config.cmake.in.in b/lang/qt/src/QGpgmeQt6Config.cmake.in.in new file mode 100644 index 00000000..b539922f --- /dev/null +++ b/lang/qt/src/QGpgmeQt6Config.cmake.in.in @@ -0,0 +1,101 @@ +# CMake Config file for QGpgME for Qt 6 +# Copyright (C) 2016 Intevation GmbH +# +# This file is part of GPGME. +# +# QGpgME is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# QGpgME is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA + +# based on a generated file from cmake. +# Generated by CMake 3.0.2 + +if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5) + message(FATAL_ERROR "CMake >= 2.6.0 required") +endif() +cmake_policy(PUSH) +cmake_policy(VERSION 2.6) +#---------------------------------------------------------------- +# Generated CMake target import file. +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Protect against multiple inclusion, which would fail when already imported targets are added once more. +set(_targetsDefined) +set(_targetsNotDefined) +set(_expectedTargets) +foreach(_expectedTarget QGpgmeQt6) + list(APPEND _expectedTargets ${_expectedTarget}) + if(NOT TARGET ${_expectedTarget}) + list(APPEND _targetsNotDefined ${_expectedTarget}) + endif() + if(TARGET ${_expectedTarget}) + list(APPEND _targetsDefined ${_expectedTarget}) + endif() +endforeach() +if("${_targetsDefined}" STREQUAL "${_expectedTargets}") + set(CMAKE_IMPORT_FILE_VERSION) + cmake_policy(POP) + return() +endif() +if(NOT "${_targetsDefined}" STREQUAL "") + message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") +endif() +unset(_targetsDefined) +unset(_targetsNotDefined) +unset(_expectedTargets) + +# Create imported target QGpgmeQt6 +add_library(QGpgmeQt6 SHARED IMPORTED) + +set_target_properties(QGpgmeQt6 PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "@resolved_includedir@/qgpgme;@resolved_includedir@" + INTERFACE_LINK_LIBRARIES "Gpgmepp;Qt6::Core" + IMPORTED_LOCATION "@resolved_libdir@/libqgpgmeqt6@libsuffix@" +) + +if(CMAKE_VERSION VERSION_LESS 2.8.12) + message(FATAL_ERROR "This file relies on consumers using CMake 2.8.12 or greater.") +endif() + +# Loop over all imported files and verify that they actually exist +foreach(target ${_IMPORT_CHECK_TARGETS} ) + foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) + if(NOT EXISTS "${file}" ) + message(FATAL_ERROR "The imported target \"${target}\" references the file + \"${file}\" +but this file does not exist. Possible reasons include: +* The file was deleted, renamed, or moved to another location. +* An install or uninstall procedure did not complete successfully. +* The installation package was faulty and contained + \"${CMAKE_CURRENT_LIST_FILE}\" +but not all the files it references. +") + endif() + endforeach() + unset(_IMPORT_CHECK_FILES_FOR_${target}) +endforeach() +unset(_IMPORT_CHECK_TARGETS) + +# This file does not depend on other imported targets which have +# been exported from the same project but in a separate export set. + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) +cmake_policy(POP) + +# Gpgmepp is a requirement for QGpgME +find_package(Gpgmepp CONFIG REQUIRED) diff --git a/lang/qt/src/QGpgmeQt6ConfigVersion.cmake.in b/lang/qt/src/QGpgmeQt6ConfigVersion.cmake.in new file mode 100644 index 00000000..eaa60dc8 --- /dev/null +++ b/lang/qt/src/QGpgmeQt6ConfigVersion.cmake.in @@ -0,0 +1,31 @@ +# CMake Version file for QGpgME for Qt 6 +# Copyright (C) 2016 Intevation GmbH +# +# This file is part of GPGME. +# +# QGpgME is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# QGpgME is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA + +# based on a generated file from cmake. +set(PACKAGE_VERSION "@VERSION_MAJOR@.@VERSION_MINOR@.@VERSION_MICRO@") + +if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" ) + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if("${PACKAGE_FIND_VERSION}" STREQUAL "${PACKAGE_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() diff --git a/lang/qt/tests/Makefile.am b/lang/qt/tests/Makefile.am index a1d1b82f..564a9ff7 100644 --- a/lang/qt/tests/Makefile.am +++ b/lang/qt/tests/Makefile.am @@ -44,6 +44,7 @@ moc_files = \ AM_LDFLAGS = -no-install +if WANT_QT5 LDADD = ../../cpp/src/libgpgmepp.la ../src/libqgpgme.la \ ../../../src/libgpgme.la @GPGME_QT5_LIBS@ @GPG_ERROR_LIBS@ \ @GPGME_QT5TEST_LIBS@ @LDADD_FOR_TESTS_KLUDGE@ -lstdc++ @@ -53,6 +54,18 @@ AM_CPPFLAGS = -I$(top_srcdir)/lang/cpp/src -I$(top_builddir)/src \ @LIBASSUAN_CFLAGS@ @GPGME_QT5TEST_CFLAGS@ -DBUILDING_QGPGME \ -I$(top_srcdir)/lang/qt/src \ -DTOP_SRCDIR="$(top_srcdir)" +endif +if WANT_QT6 +LDADD = ../../cpp/src/libgpgmepp.la ../src/libqgpgmeqt6.la \ + ../../../src/libgpgme.la @GPGME_QT6_LIBS@ @GPG_ERROR_LIBS@ \ + @GPGME_QT6TEST_LIBS@ @LDADD_FOR_TESTS_KLUDGE@ -lstdc++ + +AM_CPPFLAGS = -I$(top_srcdir)/lang/cpp/src -I$(top_builddir)/src \ + @GPG_ERROR_CFLAGS@ @GPGME_QT6_CFLAGS@ @GPG_ERROR_CFLAGS@ \ + @LIBASSUAN_CFLAGS@ @GPGME_QT6TEST_CFLAGS@ -DBUILDING_QGPGME \ + -I$(top_srcdir)/lang/qt/src \ + -DTOP_SRCDIR="$(top_srcdir)" +endif support_src = t-support.h t-support.cpp diff --git a/m4/qt6.m4 b/m4/qt6.m4 new file mode 100644 index 00000000..6e864fb1 --- /dev/null +++ b/m4/qt6.m4 @@ -0,0 +1,82 @@ +dnl qt6.m4 +dnl Copyright (C) 2016 Intevation GmbH +dnl +dnl This file is part of gpgme and is provided under the same license as gpgme + +dnl Autoconf macro to find Qt6 +dnl +dnl sets GPGME_QT6_LIBS and GPGME_QT6_CFLAGS +dnl +dnl if QT6 was found have_qt6_libs is set to yes + +AC_DEFUN([FIND_QT6], +[ + have_qt6_libs="no"; + + PKG_CHECK_MODULES(GPGME_QT6, + Qt6Core >= 6.4.0, + [have_qt6_libs="yes"], + [have_qt6_libs="no"]) + + PKG_CHECK_MODULES(GPGME_QT6TEST, + Qt6Test >= 6.4.0, + [have_qt6test_libs="yes"], + [have_qt6test_libs="no"]) + + if ! test "$have_w32_system" = yes; then + if "$PKG_CONFIG" --variable qt_config Qt6Core | grep -q "reduce_relocations"; then + GPGME_QT6_CFLAGS="$GPGME_QT6_CFLAGS -fpic" + fi + fi + if test "$have_qt6_libs" = "yes"; then + # Qt6 moved moc to libexec + qt6libexecdir=$($PKG_CONFIG --variable=libexecdir 'Qt6Core >= 6.4.0') + AC_PATH_TOOL(MOC, moc, [], [$qt6libexecdir]) + AC_MSG_CHECKING([moc version]) + mocversion=`$MOC -v 2>&1` + mocversiongrep=`echo $mocversion | grep -E "Qt 6|moc 6"` + if test x"$mocversiongrep" != x"$mocversion"; then + AC_MSG_RESULT([no]) + # moc was not the qt6 one, try with moc-qt6 + AC_CHECK_TOOL(MOC2, moc-qt6) + mocversion=`$MOC2 -v 2>&1` + mocversiongrep=`echo $mocversion | grep -E "Qt 6|moc-qt6 6|moc 6"` + if test x"$mocversiongrep" != x"$mocversion"; then + AC_CHECK_TOOL(QTCHOOSER, qtchooser) + qt6tooldir=`QT_SELECT=qt6 qtchooser -print-env | grep QTTOOLDIR | cut -d '=' -f 2 | cut -d \" -f 2` + mocversion=`$qt6tooldir/moc -v 2>&1` + mocversiongrep=`echo $mocversion | grep -E "Qt 6|moc 6"` + if test x"$mocversiongrep" != x"$mocversion"; then + # no valid moc found + have_qt6_libs="no"; + else + MOC=$qt6tooldir/moc + fi + else + MOC=$MOC2 + fi + fi + AC_MSG_RESULT([$mocversion]) + dnl Check that a binary can actually be build with this qt. + dnl pkg-config may be set up in a way that it looks also for libraries + dnl of the build system and not only for the host system. In that case + dnl we check here that we can actually compile / link a qt application + dnl for host. + OLDCPPFLAGS=$CPPFLAGS + CPPFLAGS=$GPGME_QT6_CFLAGS + OLDLIBS=$LIBS + LIBS=$GPGME_QT6_LIBS + AC_LANG_PUSH(C++) + AC_MSG_CHECKING([whether a simple qt program can be built]) + AC_LINK_IFELSE([AC_LANG_SOURCE([ + #include + int main (int argc, char **argv) { + QCoreApplication app(argc, argv); + app.exec(); + }])], [have_qt6_libs='yes'], [have_qt6_libs='no']) + AC_MSG_RESULT([$have_qt6_libs]) + AC_LANG_POP() + CPPFLAGS=$OLDCPPFLAGS + LIBS=$OLDLIBS + fi +])