X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=CMakeLists.txt;h=dfdaaebe083aecf0ffcb004e125cabf561f17fa3;hp=b086070789dd950d5fa04c223c48a2efc2e44a01;hb=HEAD;hpb=d9c471f91a6c31863e9fe805a5575ec3a308e7bc diff --git a/CMakeLists.txt b/CMakeLists.txt index b0860707..dfdaaebe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,14 +11,8 @@ cmake_minimum_required(VERSION 3.5) # Tell CMake about or own modules set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) -# Versions -set(QUASSEL_MAJOR 0) -set(QUASSEL_MINOR 13) -set(QUASSEL_PATCH 50) -set(QUASSEL_VERSION_STRING "0.14-pre") - -# Output CMake and Quassel versions as well as build type for debug reasons -message(STATUS "Building Quassel ${QUASSEL_VERSION_STRING}...") +include(QuasselVersion) + message(STATUS "Using CMake ${CMAKE_VERSION}") # Set up build type rather early @@ -99,6 +93,10 @@ if (APPLE) find_library(CARBON_LIBRARY Carbon) mark_as_advanced(CARBON_LIBRARY) link_libraries(${CARBON_LIBRARY}) + + # Whether to enable the creation of bundles and DMG images + cmake_dependent_option(BUNDLE "Create bundles and DMG images" OFF "APPLE" OFF) + add_feature_info(BUNDLE BUNDLE "Create bundles and DMG images") endif() # Always embed on Windows or OSX; never embed when enabling KDE integration @@ -107,13 +105,13 @@ if (WIN32 OR APPLE) set(EMBED_DEFAULT ON) endif() cmake_dependent_option(EMBED_DATA "Embed icons and translations into the binaries instead of installing them" ${EMBED_DEFAULT} - "NOT WIN32;NOT WITH_KDE" ${EMBED_DEFAULT}) + "NOT WIN32;NOT WITH_KDE" ${EMBED_DEFAULT}) if (NOT EMBED_DEFAULT) add_feature_info(EMBED_DATA EMBED_DATA "Embed icons and translations in the binaries instead of installing them") endif() -# The following options are not for end-user consumption, so don't list them in the feature summary -cmake_dependent_option(DEPLOY "Add required libs to bundle resources and create a dmg" OFF "APPLE" OFF) +# The following option is not for end-user consumption, so don't list it in the feature summary +option(FATAL_WARNINGS "Make compile warnings fatal (most useful for CI builds)" OFF) # List of authenticators and the cmake flags to build them # (currently that's just LDAP, but more can be added here). @@ -155,21 +153,27 @@ endif() # Set up Qt ##################################################################### +set(QT_MIN_VERSION "5.5.0") + +# Enable Qt deprecation warnings for Qt < 5.13 (on by default in newer versions) +add_definitions(-DQT_DEPRECATED_WARNINGS) + +# Disable all Qt APIs that were deprecated in 5.5 and before +add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x050500) + # Find package dependencies # # Note that you can forcefully disable optional packages # using -DCMAKE_DISABLE_FIND_PACKAGE_=TRUE ##################################################################### -set(QT_MIN_VERSION "5.5.0") - # Required Qt components set(qt_components Core Network) if (BUILD_GUI) list(APPEND qt_components Gui Widgets) endif() if (BUILD_CORE) - list(APPEND qt_components Script Sql) + list(APPEND qt_components Sql) endif() find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS ${qt_components}) @@ -179,6 +183,49 @@ set_package_properties(Qt5 PROPERTIES TYPE REQUIRED ) message(STATUS "Found Qt ${Qt5Core_VERSION}") +# Determine minimum deployment target for macOS supported by Qt +if(APPLE) + if(NOT QMAKE_MACOSX_DEPLOYMENT_TARGET) + # qmake cannot be queried directly for QMAKE_MACOSX_DEPLOYMENT_TARGET (it is a mkspec, not a property). + # Instead, invoke qmake on an empty project file, which causes it to output the relevant keys and their values + # for subsequent parsing. + # A file named .qmake.stash is always created, so remove it (and empty.pro) afterwards. + set(qmakeEmptyProjectFile "${CMAKE_BINARY_DIR}/empty.pro") + set(qmakeStashFile "${CMAKE_BINARY_DIR}/.qmake.stash") + file(WRITE ${qmakeEmptyProjectFile} "") + get_target_property(QMAKE_EXECUTABLE Qt5::qmake IMPORTED_LOCATION) + execute_process( + COMMAND ${QMAKE_EXECUTABLE} -E ${qmakeEmptyProjectFile} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + OUTPUT_VARIABLE qmakeOutput + ) + file(REMOVE ${qmakeEmptyProjectFile} ${qmakeStashFile}) + string(REGEX MATCH "QMAKE_MACOSX_DEPLOYMENT_TARGET[ ]*=[ ]*([0-9.]+)" foo ${qmakeOutput}) + if(NOT CMAKE_MATCH_1) + message(FATAL_ERROR "Could not determine the deployment target for Qt") + endif() + set(QMAKE_MACOSX_DEPLOYMENT_TARGET ${CMAKE_MATCH_1} CACHE INTERNAL "") + mark_as_advanced(QMAKE_MACOSX_DEPLOYMENT_TARGET) + endif() + message(STATUS "Minimum macOS version supported by Qt: ${QMAKE_MACOSX_DEPLOYMENT_TARGET}") +endif() + +# Check for SSL support in Qt +cmake_push_check_state(RESET) +set(CMAKE_REQUIRED_LIBRARIES Qt5::Core) +check_cxx_source_compiles(" + #include \"qglobal.h\" + #if defined QT_NO_SSL + # error \"No SSL support\" + #endif + int main() {}" + HAVE_SSL) +cmake_pop_check_state() + +if (NOT HAVE_SSL) + message(FATAL_ERROR "Quassel requires SSL support, but Qt is built with QT_NO_SSL") +endif() + # Optional Qt components find_package(Qt5LinguistTools QUIET) @@ -212,19 +259,23 @@ if (BUILD_GUI) PURPOSE "Required for audio notifications" ) - find_package(LibsnoreQt5 0.7.0 QUIET) - set_package_properties(LibsnoreQt5 PROPERTIES TYPE OPTIONAL - URL "https://projects.kde.org/projects/playground/libs/snorenotify" - DESCRIPTION "a cross-platform notification framework" - PURPOSE "Enable support for the snorenotify framework" - ) - if (LibsnoreQt5_FOUND) - find_package(LibsnoreSettingsQt5 QUIET) - set_package_properties(LibsnoreSettingsQt5 PROPERTIES TYPE OPTIONAL + # snorenotify segfaults on startup on msys2 + # we don't check for just MSYS to support the Ninja generator + if(NOT (WIN32 AND (NOT $ENV{MSYSTEM} STREQUAL ""))) + find_package(LibsnoreQt5 0.7.0 QUIET) + set_package_properties(LibsnoreQt5 PROPERTIES TYPE OPTIONAL URL "https://projects.kde.org/projects/playground/libs/snorenotify" DESCRIPTION "a cross-platform notification framework" PURPOSE "Enable support for the snorenotify framework" ) + if (LibsnoreQt5_FOUND) + find_package(LibsnoreSettingsQt5 QUIET) + set_package_properties(LibsnoreSettingsQt5 PROPERTIES TYPE OPTIONAL + URL "https://projects.kde.org/projects/playground/libs/snorenotify" + DESCRIPTION "a cross-platform notification framework" + PURPOSE "Enable support for the snorenotify framework" + ) + endif() endif() if (WITH_WEBENGINE) @@ -335,11 +386,19 @@ endif() # Non-Qt-based packages ##################################################################### -find_package(Boost 1.56 REQUIRED) +find_package(Boost 1.54 REQUIRED) set_package_properties(Boost PROPERTIES TYPE REQUIRED URL "https://www.boost.org/" DESCRIPTION "Boost libraries for C++" ) +# Older versions don't define the imported target +if (NOT TARGET Boost::boost) + add_library(Boost::boost INTERFACE IMPORTED GLOBAL) + if (Boost_INCLUDE_DIRS) + set_target_properties(Boost::boost PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}") + endif() +endif() find_package(ZLIB REQUIRED) set_package_properties(ZLIB PROPERTIES TYPE REQUIRED @@ -357,6 +416,12 @@ if (NOT WIN32) ) endif() +# Shared library support +##################################################################### + +option(ENABLE_SHARED "Build modules as shared libraries" ON) +add_feature_info(ENABLE_SHARED ENABLE_SHARED "Build modules as shared libraries") + # Setup unit testing ##################################################################### @@ -381,25 +446,6 @@ if (BUILD_TESTING) process_cmake_cxx_flags() endif() -# Check for SSL support in Qt -##################################################################### - -cmake_push_check_state(RESET) -set(CMAKE_REQUIRED_LIBRARIES Qt5::Core) -check_cxx_source_compiles(" - #include \"qglobal.h\" - #if defined QT_NO_SSL - # error \"No SSL support\" - #endif - int main() {}" - HAVE_SSL) -cmake_pop_check_state() - -if (HAVE_SSL) - add_definitions(-DHAVE_SSL) -endif() -add_feature_info("SSL support in Qt" HAVE_SSL "Use secure network connections") - # Setup support for KDE Frameworks ##################################################################### @@ -470,43 +516,6 @@ if (WIN32) endif() endif() -# Generate version information from Git -##################################################################### - -include(GetGitRevisionDescription) -get_git_head_revision(GIT_REFSPEC GIT_HEAD) -git_describe(GIT_DESCRIBE --long) - -# If in a Git repo we can get the commit-date from a git command -if (GIT_HEAD) - execute_process( - COMMAND git -c log.showsignature=false show -s --format=%ct - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_COMMIT_DATE - OUTPUT_STRIP_TRAILING_WHITESPACE - ) -endif() - -# If not in a Git repo try to read GIT_HEAD and GIT_DESCRIBE from -# enviroment -if (NOT GIT_HEAD OR NOT GIT_DESCRIBE) - if (DEFINED ENV{GIT_HEAD}) - set(GIT_HEAD $ENV{GIT_HEAD}) - endif() - if (DEFINED ENV{GIT_DESCRIBE}) - set(GIT_DESCRIBE $ENV{GIT_DESCRIBE}) - endif() -endif() - -# Sanitize things if we're not in a Git repo -if (NOT GIT_HEAD OR NOT GIT_DESCRIBE) - set(GIT_HEAD "") - set(GIT_DESCRIBE "") - set(GIT_COMMIT_DATE 0) -endif() - -configure_file(version.h.in ${CMAKE_BINARY_DIR}/version.h @ONLY) - # Prepare the build #####################################################################