Skip to content
59 changes: 25 additions & 34 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ project(QWebdav
LANGUAGES CXX
)

# By default, look for and support both versions of Qt, but they
# can be individually turned off with e.g. -DENABLE_QT5=OFF
option(ENABLE_QT5 "Search for Qt5 libraries and build ${PROJECT_NAME} for Qt5 if found" ON)
option(ENABLE_QT6 "Search for Qt6 libraries and build ${PROJECT_NAME} for Qt6 if found" ON)

### Find ECM up-front and complain otherwise
#
#
Expand Down Expand Up @@ -37,19 +42,29 @@ include(CMakePackageConfigHelpers)
set(QT_NO_CREATE_VERSIONLESS_TARGETS ON)
set(QT5_REQUIRED_VERSION 5.15.0)
set(QT6_REQUIRED_VERSION 6.5.0)
find_package(Qt6 ${QT6_REQUIRED_VERSION} CONFIG COMPONENTS Core Network Xml)
find_package(Qt5 ${QT5_REQUIRED_VERSION} CONFIG COMPONENTS Core Network Xml)
if(ENABLE_QT6)
find_package(Qt6 ${QT6_REQUIRED_VERSION} CONFIG COMPONENTS Core Network Xml)
endif()
if(ENABLE_QT5)
find_package(Qt5 ${QT5_REQUIRED_VERSION} CONFIG COMPONENTS Core Network Xml)
endif()

set(WITH_QT5 FALSE) # Used when creating the Config.cmake file
set(WITH_QT6 FALSE)
if(TARGET Qt5::Core)
if(ENABLE_QT5 AND TARGET Qt5::Core)
message(STATUS "Building Qt5 version of ${PROJECT_NAME}")
set(WITH_QT5 TRUE)
endif()
if(TARGET Qt6::Core)
if(ENABLE_QT5 AND NOT TARGET Qt5::Core)
message(STATUS "Qt5 enabled but not found.")
endif()
if(ENABLE_QT6 AND TARGET Qt6::Core)
message(STATUS "Building Qt6 version of ${PROJECT_NAME}")
set(WITH_QT6 TRUE)
endif()
if(ENABLE_QT6 AND NOT TARGET Qt6::Core)
message(STATUS "Qt6 enabled but not found.")
endif()
if(NOT TARGET Qt5::Core AND NOT TARGET Qt6::Core)
# If neither is found, complain about Qt5 because then the
# error message says ">= 5.15.0" which reads most naturally.
Expand All @@ -61,49 +76,25 @@ if(NOT TARGET Qt5::Core AND NOT TARGET Qt6::Core)
)
endif()

feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES)

### QWebdav version header is independent of build type
#
#
# Generate one copy in the top-level, this is installed to
# multiple locations (per-Qt-version)
ecm_setup_version(${PROJECT_VERSION}
VARIABLE_PREFIX QWebdav
VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/qwebdav_version.h"
PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/QWebdavConfigVersion.cmake"
VERSION_HEADER "${CMAKE_BINARY_DIR}/qwebdav_version.h"
PACKAGE_VERSION_FILE "${CMAKE_BINARY_DIR}/QWebdavConfigVersion.cmake"
SOVERSION 1
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/qwebdav_version.h"
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/QWebdav
COMPONENT devel
)

### Build
#
#
add_subdirectory(qwebdavlib)
add_subdirectory(qwebdavlibExample)

### CMake Configuration Files
#
#
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/QWebdavConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/QWebdavConfig.cmake"
INSTALL_DESTINATION ${KDE_INSTALL_CMAKEPACKAGEDIR}/QWebdav
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/QWebdavConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/QWebdavConfigVersion.cmake"
DESTINATION "${KDE_INSTALL_CMAKEPACKAGEDIR}/QWebdav"
COMPONENT devel
)
install(
EXPORT QWebdavTargets
DESTINATION "${KDE_INSTALL_CMAKEPACKAGEDIR}/QWebdav"
FILE QWebdavTargets.cmake
)

### PackageConfig files
#
# These are slightly different from the qmake-produced
Expand Down
77 changes: 56 additions & 21 deletions qwebdavlib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,34 +47,69 @@ function(add_qwebdav_library QT_VERSION)

install(
TARGETS qwebdav-qt${QT_VERSION}
EXPORT QWebdavTargets
EXPORT QWebdav${QT_VERSION}Targets
${KDE_INSTALL_TARGETS_DEFAULT_ARGS}
)

generate_export_header(qwebdav-qt${QT_VERSION})

# One copy of the headers per Qt-version, even though they are
# identical: this is so that you can build packages of Qt5 and Qt6
# libraries separately and they won't collide over the headers.
set(_includedir ${KDE_INSTALL_INCLUDEDIR}/qt${QT_VERSION}/qwebdav-qt${QT_VERSION})
install(
FILES
# Generated export-header isn't used (qwebdav_global contains similar
# definitions) and the naturalsort header is for internal use.
#
# ${CMAKE_CURRENT_BINARY_DIR}/qwebdav_export.h
# qnaturalsort.h
qwebdav.h
qwebdav_global.h
qwebdavdirparser.h
qwebdavitem.h
DESTINATION ${_includedir}
COMPONENT devel
)
install(
FILES
"${CMAKE_BINARY_DIR}/qwebdav_version.h"
DESTINATION ${_includedir}
COMPONENT devel
)

### CMake Configuration Files
#
#
configure_package_config_file(
"${CMAKE_SOURCE_DIR}/QWebdavConfig.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/QWebdav${QT_VERSION}Config.cmake"
INSTALL_DESTINATION ${KDE_INSTALL_CMAKEPACKAGEDIR}/QWebdav${QT_VERSION}
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/QWebdav${QT_VERSION}Config.cmake"
DESTINATION "${KDE_INSTALL_CMAKEPACKAGEDIR}/QWebdav${QT_VERSION}"
COMPONENT devel
)
install(
FILES
"${CMAKE_BINARY_DIR}/QWebdavConfigVersion.cmake"
RENAME
"QWebdav${QT_VERSION}ConfigVersion.cmake"
DESTINATION "${KDE_INSTALL_CMAKEPACKAGEDIR}/QWebdav${QT_VERSION}"
COMPONENT devel
)
install(
EXPORT QWebdav${QT_VERSION}Targets
DESTINATION "${KDE_INSTALL_CMAKEPACKAGEDIR}/QWebdav${QT_VERSION}"
FILE QWebdav${QT_VERSION}Targets.cmake
)
endfunction()

if(WITH_QT5)
add_qwebdav_library(5)
add_library(QWebdav ALIAS qwebdav-qt5)
endif()
if(WITH_QT6)
add_qwebdav_library(6)
if(NOT TARGET QWebdav)
add_library(QWebdav ALIAS qwebdav-qt6)
endif()
endif()

# Only one export header, regardless of which libraries are built
generate_export_header(QWebdav)

# Only one copy of the headers, regardless of which libraries are built
install(
FILES
${CMAKE_CURRENT_BINARY_DIR}/qwebdav_export.h
qnaturalsort.h
qwebdav.h
qwebdav_global.h
qwebdavdirparser.h
qwebdavitem.h
DESTINATION ${KDE_INSTALL_INCLUDEDIR}/QWebdav
COMPONENT devel
)
18 changes: 15 additions & 3 deletions qwebdavlibExample/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,15 @@ project(QWebdavExample
set(CMAKE_AUTOMOC ON)

# If we're building as part of the QWebDAV top-level build, we already
# have the target QWebdav available. In that case, do only the CMake-
# based build.
# have a QWebdav target available -- prefer Qt6, and give it an alias.

if(TARGET qwebdav-qt6)
add_library(QWebdav ALIAS qwebdav-qt6)
elseif(TARGET qwebdav-qt5)
add_library(QWebdav ALIAS qwebdav-qt5)
endif()

# If we have a QWebdav target, do only the CMake-based build.
if(NOT TARGET QWebdav)
# Outside of the QWebDAV top-level build, demonstrate both
# CMake and pkgconfig approaches.
Expand All @@ -28,6 +35,11 @@ if(NOT TARGET QWebdav)
if(NOT TARGET Qt5::Core AND NOT TARGET Qt6::Core)
message(FATAL_ERROR "No installed Qt version found.")
endif()
if(TARGET Qt6::Core)
set(QT_VERSION 6)
else()
set(QT_VERSION 5)
endif()

find_package(PkgConfig)
if(PkgConfig_FOUND)
Expand All @@ -39,7 +51,7 @@ if(NOT TARGET QWebdav)
endif()
endif()

find_package(QWebdav 1.0) # Works with whatever Qt versions are installed
find_package(QWebdav${QT_VERSION} 1.0) # Works with whatever Qt versions are installed

if(NOT TARGET QWebdav AND NOT TARGET PkgConfig::QWebdav)
message(FATAL_ERROR "No installed QWebDAV found.")
Expand Down