Support installing QXmpp with Qt 5 and Qt 6 in parallel

Closes #540.
This commit is contained in:
Linus Jahn 2023-03-19 01:48:29 +01:00
parent 894299926d
commit 7d1e74b514
No known key found for this signature in database
GPG Key ID: 4663231A91A1E27B
15 changed files with 138 additions and 58 deletions

View File

@ -12,8 +12,12 @@ set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/modules")
# Qt
if(NOT DEFINED QT_VERSION_MAJOR)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network Xml)
endif()
@ -26,9 +30,6 @@ if(${QT_VERSION_MAJOR} EQUAL 6)
find_package(Qt6Core5Compat)
endif()
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
include(GNUInstallDirs)
option(BUILD_SHARED "Build shared library" ON)
@ -40,6 +41,9 @@ option(BUILD_OMEMO "Build the OMEMO module" OFF)
option(WITH_GSTREAMER "Build with GStreamer support for Jingle" OFF)
option(WITH_QCA "Build with QCA for OMEMO or encrypted file sharing" ${Qca-qt${QT_VERSION_MAJOR}_FOUND})
set(QXMPP_TARGET QXmppQt${QT_VERSION_MAJOR})
set(QXMPPOMEMO_TARGET QXmppOmemoQt${QT_VERSION_MAJOR})
add_definitions(
-DQT_DISABLE_DEPRECATED_BEFORE=0x050F00
-DQURL_NO_CAST_FROM_STRING
@ -82,30 +86,60 @@ endif()
include(CMakePackageConfigHelpers)
# Normal QXmppQt5/6 package
configure_package_config_file(
QXmppConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/QXmppConfig.cmake
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/qxmpp"
${CMAKE_CURRENT_BINARY_DIR}/${QXMPP_TARGET}Config.cmake
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QXMPP_TARGET}"
)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/QXmppConfigVersion.cmake
${CMAKE_CURRENT_BINARY_DIR}/${QXMPP_TARGET}ConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/QXmppConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/QXmppConfigVersion.cmake
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/qxmpp"
FILES ${CMAKE_CURRENT_BINARY_DIR}/${QXMPP_TARGET}Config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${QXMPP_TARGET}ConfigVersion.cmake
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QXMPP_TARGET}"
COMPONENT Devel
)
# Generate qxmpp.pc
# QXmpp package with Qt version autodetect
configure_package_config_file(
cmake/QXmppQtAutoConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/QXmppConfig.cmake
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/QXmpp"
)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/QXmppConfig.cmake
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/QXmpp"
COMPONENT Devel
)
install(
FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/QXmppQtAutoConfigVersion.cmake
RENAME QXmppConfigVersion.cmake
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/QXmpp"
COMPONENT Devel
)
# Generate QXmppQt5/6.pc
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/qxmpp.pc.in ${CMAKE_CURRENT_BINARY_DIR}/qxmpp.pc @ONLY)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/qxmpp.pc
RENAME QXmppQt${QT_VERSION_MAJOR}.pc
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
COMPONENT Devel
)
# "qxmpp.pc" for backwards-compatibility
if(QT_VERSION_MAJOR EQUAL 5)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/qxmpp.pc
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
COMPONENT Devel
)
endif()

View File

@ -5,11 +5,11 @@
@PACKAGE_INIT@
set(_QXmpp_FIND_PARTS_REQUIRED)
if(QXmpp_FIND_REQUIRED)
if(QXmppQt@QT_VERSION_MAJOR@_FIND_REQUIRED)
set(_QXmpp_FIND_PARTS_REQUIRED REQUIRED)
endif()
set(_QXmpp_FIND_PARTS_QUIET)
if(QXmpp_FIND_QUIETLY)
if(QXmppQt@QT_VERSION_MAJOR@_FIND_QUIETLY)
set(_QXmpp_FIND_PARTS_QUIET QUIET)
endif()
@ -20,13 +20,13 @@ find_dependency(Qt@QT_VERSION_MAJOR@Xml)
include("${CMAKE_CURRENT_LIST_DIR}/QXmpp.cmake")
foreach(module ${QXmpp_FIND_COMPONENTS})
find_package(QXmpp${module}
${QXmpp_FIND_VERSION}
foreach(module ${QXmppQt@QT_VERSION_MAJOR@_FIND_COMPONENTS})
find_package(QXmpp${module}Qt@QT_VERSION_MAJOR@
${QXmppQt@QT_VERSION_MAJOR@_FIND_VERSION}
${_QXmpp_FIND_PARTS_REQUIRED}
${_QXmpp_FIND_PARTS_QUIET}
)
set(QXmpp_${module}_FOUND ${QXmpp${module}_FOUND})
set(QXmppQt@QT_VERSION_MAJOR@_${module}_FOUND ${QXmpp${module}Qt@QT_VERSION_MAJOR@_FOUND})
endforeach()
check_required_components(QXmpp)

View File

@ -0,0 +1,37 @@
# SPDX-FileCopyrightText: 2023 Linus Jahn <lnj@kaidan.im>
#
# SPDX-License-Identifier: CC0-1.0
@PACKAGE_INIT@
# Detect Qt version
if(NOT DEFINED QT_VERSION_MAJOR)
if(TARGET Qt6::Core)
set(QT_VERSION_MAJOR 6)
elseif(TARGET Qt5::Core)
set(QT_VERSION_MAJOR 5)
else()
# default to Qt 6
set(QT_VERSION_MAJOR 6)
endif()
endif()
set(_QXmpp_FIND_PARTS_REQUIRED)
if(QXmpp_FIND_REQUIRED)
set(_QXmpp_FIND_PARTS_REQUIRED REQUIRED)
endif()
set(_QXmpp_FIND_PARTS_QUIET)
if(QXmpp_FIND_QUIETLY)
set(_QXmpp_FIND_PARTS_QUIET QUIET)
endif()
# Pass through arguments to QXmppQt5/6
include(CMakeFindDependencyMacro)
find_package(QXmppQt${QT_VERSION_MAJOR}
${QXmpp_FIND_VERSION}
${_QXmpp_FIND_PARTS_REQUIRED}
${_QXmpp_FIND_PARTS_QUIET}
COMPONENTS ${QXmpp_FIND_COMPONENTS}
)
set(QXmpp_FOUND ${QXmppQt${QT_VERSION_MAJOR}_FOUND})

View File

@ -0,0 +1,8 @@
# SPDX-FileCopyrightText: 2023 Linus Jahn <lnj@kaidan.im>
#
# SPDX-License-Identifier: CC0-1.0
set(PACKAGE_VERSION "")
# Allow all requested versions here, the actual check is going to be done in QXmppQt5/6.
set(PACKAGE_VERSION_COMPATIBLE TRUE)

View File

@ -4,7 +4,7 @@
macro(add_simple_example EXAMPLE_NAME)
add_executable(${EXAMPLE_NAME} example_${EXAMPLE_NAME}/example_${EXAMPLE_NAME}.cpp)
target_link_libraries(${EXAMPLE_NAME} qxmpp)
target_link_libraries(${EXAMPLE_NAME} ${QXMPP_TARGET})
endmacro()
include_directories(${PROJECT_SOURCE_DIR}/src/base)

View File

@ -3,4 +3,4 @@
# SPDX-License-Identifier: CC0-1.0
add_executable(5_rpcInterface main.cpp remoteinterface.cpp)
target_link_libraries(5_rpcInterface qxmpp)
target_link_libraries(5_rpcInterface ${QXMPP_TARGET})

View File

@ -3,4 +3,4 @@
# SPDX-License-Identifier: CC0-1.0
add_executable(6_rpcClient main.cpp rpcClient.cpp)
target_link_libraries(6_rpcClient qxmpp)
target_link_libraries(6_rpcClient ${QXMPP_TARGET})

View File

@ -5,4 +5,4 @@
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Gui)
add_executable(9_vCard example_9_vCard.cpp)
target_link_libraries(9_vCard Qt${QT_VERSION_MAJOR}::Gui qxmpp)
target_link_libraries(9_vCard Qt${QT_VERSION_MAJOR}::Gui ${QXMPP_TARGET})

View File

@ -271,28 +271,28 @@ set(SOURCE_FILES
)
if(BUILD_SHARED)
add_library(qxmpp SHARED ${SOURCE_FILES})
add_library(${QXMPP_TARGET} SHARED ${SOURCE_FILES})
else()
add_library(qxmpp STATIC ${SOURCE_FILES})
add_library(${QXMPP_TARGET} STATIC ${SOURCE_FILES})
endif()
set_target_properties(qxmpp PROPERTIES
set_target_properties(${QXMPP_TARGET} PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${SO_VERSION}
EXPORT_NAME QXmpp
)
target_include_directories(qxmpp
target_include_directories(${QXMPP_TARGET}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/base>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/client>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/server>
$<INSTALL_INTERFACE:include/qxmpp>
$<INSTALL_INTERFACE:include/${QXMPP_TARGET}>
PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
)
target_link_libraries(qxmpp
target_link_libraries(${QXMPP_TARGET}
PUBLIC
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Network
@ -311,21 +311,21 @@ if(WITH_GSTREAMER)
client/QXmppCallStream.h
)
target_sources(qxmpp
target_sources(${QXMPP_TARGET}
PRIVATE
client/QXmppCall.cpp
client/QXmppCallManager.cpp
client/QXmppCallStream.cpp
)
target_link_libraries(qxmpp
target_link_libraries(${QXMPP_TARGET}
PRIVATE
${GLIB2_LIBRARIES}
${GOBJECT_LIBRARIES}
${GSTREAMER_LIBRARY}
)
target_include_directories(qxmpp
target_include_directories(${QXMPP_TARGET}
PRIVATE
${GLIB2_INCLUDE_DIR}
${GOBJECT_INCLUDE_DIR}
@ -335,13 +335,13 @@ endif()
if(BUILD_OMEMO)
# required to be used in QXmppMessage
target_sources(qxmpp PRIVATE base/QXmppOmemoDataBase.cpp)
target_sources(${QXMPP_TARGET} PRIVATE base/QXmppOmemoDataBase.cpp)
endif()
if(WITH_QCA)
target_sources(qxmpp PRIVATE client/QXmppEncryptedFileSharingProvider.cpp client/QXmppFileEncryption.cpp client/QcaInitializer.cpp)
target_sources(${QXMPP_TARGET} PRIVATE client/QXmppEncryptedFileSharingProvider.cpp client/QXmppFileEncryption.cpp client/QcaInitializer.cpp)
set(INSTALL_HEADER_FILES ${INSTALL_HEADER_FILES} client/QXmppEncryptedFileSharingProvider.h)
target_link_libraries(qxmpp PRIVATE qca-qt${QT_VERSION_MAJOR})
target_link_libraries(${QXMPP_TARGET} PRIVATE qca-qt${QT_VERSION_MAJOR})
endif()
# qxmpp_export.h generation
@ -358,12 +358,13 @@ set(QXMPP_CUSTOM_EXPORT_CONTENT "
#define QXMPP_VERSION_PATCH ${PROJECT_VERSION_PATCH}
")
generate_export_header(qxmpp
generate_export_header(${QXMPP_TARGET}
BASE_NAME qxmpp
CUSTOM_CONTENT_FROM_VARIABLE QXMPP_CUSTOM_EXPORT_CONTENT
)
install(
TARGETS qxmpp
TARGETS ${QXMPP_TARGET}
EXPORT QXmppTarget
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
@ -372,20 +373,20 @@ install(
install(
EXPORT QXmppTarget
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/qxmpp"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QXMPP_TARGET}"
FILE QXmpp.cmake
NAMESPACE QXmpp::
COMPONENT Devel
)
export(
TARGETS qxmpp
TARGETS ${QXMPP_TARGET}
FILE QXmpp.cmake
)
install(
FILES ${INSTALL_HEADER_FILES} ${CMAKE_CURRENT_BINARY_DIR}/qxmpp_export.h
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/qxmpp"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${QXMPP_TARGET}"
)
# submodules

View File

@ -4,8 +4,8 @@
include(CMakePackageConfigHelpers)
set(OMEMO_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/QXmppOmemo")
set(OMEMO_HEADER_DIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}/qxmpp/omemo")
set(OMEMO_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${QXMPPOMEMO_TARGET}")
set(OMEMO_HEADER_DIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}/${QXMPP_TARGET}/Omemo")
set(OMEMO_INSTALL_HEADER_FILES
QXmppOmemoManager.h
QXmppOmemoMemoryStorage.h
@ -20,17 +20,17 @@ set(OMEMO_SOURCE_FILES
QXmppOmemoStorage.cpp
)
add_library(QXmppOmemo SHARED ${OMEMO_SOURCE_FILES})
add_library(${QXMPPOMEMO_TARGET} SHARED ${OMEMO_SOURCE_FILES})
target_link_libraries(QXmppOmemo
target_link_libraries(${QXMPPOMEMO_TARGET}
PUBLIC
qxmpp
${QXMPP_TARGET}
Qt${QT_VERSION_MAJOR}::Core
PRIVATE
PkgConfig::OmemoC
qca-qt${QT_VERSION_MAJOR}
)
target_include_directories(QXmppOmemo
target_include_directories(${QXMPPOMEMO_TARGET}
PUBLIC
${OMEMO_HEADER_DIR}
PRIVATE
@ -39,21 +39,21 @@ target_include_directories(QXmppOmemo
${PROJECT_BINARY_DIR}/src
)
generate_export_header(QXmppOmemo)
generate_export_header(${QXMPPOMEMO_TARGET} BASE_NAME qxmppomemo)
install(
FILES ${OMEMO_INSTALL_HEADER_FILES} ${CMAKE_CURRENT_BINARY_DIR}/qxmppomemo_export.h
DESTINATION ${OMEMO_HEADER_DIR}
)
set_target_properties(QXmppOmemo PROPERTIES
set_target_properties(${QXMPPOMEMO_TARGET} PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${SO_VERSION}
EXPORT_NAME Omemo
)
install(
TARGETS QXmppOmemo
TARGETS ${QXMPPOMEMO_TARGET}
EXPORT QXmppOmemoTargets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
@ -69,25 +69,25 @@ install(
)
export(
TARGETS QXmppOmemo
TARGETS ${QXMPPOMEMO_TARGET}
FILE QXmppOmemo.cmake
)
configure_package_config_file(
QXmppOmemoConfig.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/QXmppOmemoConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/${QXMPPOMEMO_TARGET}Config.cmake
INSTALL_DESTINATION ${OMEMO_CMAKE_DIR}
)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/QXmppOmemoConfigVersion.cmake
${CMAKE_CURRENT_BINARY_DIR}/${QXMPPOMEMO_TARGET}ConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion
)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/QXmppOmemoConfig.cmake
${CMAKE_CURRENT_BINARY_DIR}/QXmppOmemoConfigVersion.cmake
FILES ${CMAKE_CURRENT_BINARY_DIR}/${QXMPPOMEMO_TARGET}Config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${QXMPPOMEMO_TARGET}ConfigVersion.cmake
DESTINATION ${OMEMO_CMAKE_DIR}
COMPONENT Devel
)

View File

@ -5,8 +5,8 @@
@PACKAGE_INIT@
include(CMakeFindDependencyMacro)
find_dependency(QXmpp)
find_dependency(QXmppQt@QT_VERSION_MAJOR@)
include("${CMAKE_CURRENT_LIST_DIR}/QXmppOmemo.cmake")
check_required_components(QXmppOmemo)
check_required_components(QXmppOmemoQt@QT_VERSION_MAJOR@)

View File

@ -9,9 +9,9 @@ find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Test)
macro(add_simple_test TEST_NAME)
add_executable(tst_${TEST_NAME} ${TEST_NAME}/tst_${TEST_NAME}.cpp ${ARGN})
add_test(tst_${TEST_NAME} tst_${TEST_NAME})
target_link_libraries(tst_${TEST_NAME} Qt${QT_VERSION_MAJOR}::Test qxmpp)
target_link_libraries(tst_${TEST_NAME} Qt${QT_VERSION_MAJOR}::Test ${QXMPP_TARGET})
if(BUILD_OMEMO)
target_link_libraries(tst_${TEST_NAME} QXmppOmemo)
target_link_libraries(tst_${TEST_NAME} ${QXMPPOMEMO_TARGET})
endif()
endmacro()

View File

@ -5,4 +5,4 @@
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_executable(tst_qxmpphttpuploadmanager tst_qxmpphttpuploadmanager.cpp tst_qxmpphttpuploadmanager.qrc ../TestClient.h)
add_test(tst_qxmpphttpuploadmanager tst_qxmpphttpuploadmanager)
target_link_libraries(tst_qxmpphttpuploadmanager Qt${QT_VERSION_MAJOR}::Test qxmpp)
target_link_libraries(tst_qxmpphttpuploadmanager Qt${QT_VERSION_MAJOR}::Test ${QXMPP_TARGET})

View File

@ -5,4 +5,4 @@
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_executable(tst_qxmpptransfermanager tst_qxmpptransfermanager.cpp tst_qxmpptransfermanager.qrc)
add_test(tst_qxmpptransfermanager tst_qxmpptransfermanager)
target_link_libraries(tst_qxmpptransfermanager Qt${QT_VERSION_MAJOR}::Test qxmpp)
target_link_libraries(tst_qxmpptransfermanager Qt${QT_VERSION_MAJOR}::Test ${QXMPP_TARGET})

View File

@ -5,4 +5,4 @@
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_executable(tst_qxmpputils tst_qxmpputils.cpp tst_qxmpputils.qrc)
add_test(tst_qxmpputils tst_qxmpputils)
target_link_libraries(tst_qxmpputils Qt${QT_VERSION_MAJOR}::Test qxmpp)
target_link_libraries(tst_qxmpputils Qt${QT_VERSION_MAJOR}::Test ${QXMPP_TARGET})