Skip to content

Commit

Permalink
Support installing QXmpp with Qt 5 and Qt 6 in parallel
Browse files Browse the repository at this point in the history
Closes #540.
  • Loading branch information
lnjX committed Apr 7, 2023
1 parent 8942999 commit 7d1e74b
Show file tree
Hide file tree
Showing 15 changed files with 137 additions and 57 deletions.
52 changes: 43 additions & 9 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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}/${QXMPP_TARGET}Config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${QXMPP_TARGET}ConfigVersion.cmake
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${QXMPP_TARGET}"
COMPONENT Devel
)

# 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
${CMAKE_CURRENT_BINARY_DIR}/QXmppConfigVersion.cmake
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/qxmpp"
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 qxmpp.pc
# 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()

12 changes: 6 additions & 6 deletions QXmppConfig.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand All @@ -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)
37 changes: 37 additions & 0 deletions cmake/QXmppQtAutoConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# SPDX-FileCopyrightText: 2023 Linus Jahn <[email protected]>
#
# 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})
8 changes: 8 additions & 0 deletions cmake/QXmppQtAutoConfigVersion.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# SPDX-FileCopyrightText: 2023 Linus Jahn <[email protected]>
#
# 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)

2 changes: 1 addition & 1 deletion examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion examples/example_5_rpcInterface/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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})
2 changes: 1 addition & 1 deletion examples/example_6_rpcClient/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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})
2 changes: 1 addition & 1 deletion examples/example_9_vCard/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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})
35 changes: 18 additions & 17 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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}
Expand All @@ -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
Expand All @@ -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}
Expand All @@ -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
Expand Down
Loading

0 comments on commit 7d1e74b

Please sign in to comment.