cmake: avoid de-duplication of user's CXXFLAGS
[quassel.git] / CMakeLists.txt
index 78df95c..dfdaaeb 100644 (file)
@@ -93,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
@@ -101,14 +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
+# 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)
-cmake_dependent_option(DEPLOY "Add required libs to bundle resources and create a dmg" OFF "APPLE" OFF)
 
 # List of authenticators and the cmake flags to build them
 # (currently that's just LDAP, but more can be added here).
@@ -150,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_<PkgName>=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})
@@ -174,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)
@@ -394,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
 #####################################################################