diff options
| -rw-r--r-- | kde-modules/KDECompilerSettings.cmake | 245 | ||||
| -rw-r--r-- | kde-modules/KDEFrameworkCompilerSettings.cmake | 1 | 
2 files changed, 243 insertions, 3 deletions
| diff --git a/kde-modules/KDECompilerSettings.cmake b/kde-modules/KDECompilerSettings.cmake index aa5b3e15..1c3b3715 100644 --- a/kde-modules/KDECompilerSettings.cmake +++ b/kde-modules/KDECompilerSettings.cmake @@ -4,6 +4,7 @@  # SPDX-FileCopyrightText: 2007 Matthias Kretz <kretz@kde.org>  # SPDX-FileCopyrightText: 2006-2007 Laurent Montel <montel@kde.org>  # SPDX-FileCopyrightText: 2006-2013 Alex Neundorf <neundorf@kde.org> +# SPDX-FileCopyrightText: 2021 Friedrich W. H. Kossebau <kossebau@kde.org>  #  # SPDX-License-Identifier: BSD-3-Clause @@ -21,6 +22,98 @@ specific target.  NB: it is recommended to include this module with the NO_POLICY_SCOPE  flag, otherwise you may get spurious warnings with some versions of CMake. +Since 5.85 newer settings are controlled by a variable +``KDE_COMPILERSETTINGS_LEVEL``, taking an ECM version as value. That +version can not be greater than the minimum required ECM version. +The settings which are default at that version will then be used, +but can be overriden by more fine-grained controls (see respective settings). +This variable needs to be set before including this module, otherwise +defaults to the minimum required ECM version. + +Modern code +~~~~~~~~~~~ + +The following CMake C standard default variables are set: + +For ``KDE_COMPILERSETTINGS_LEVEL`` >= 5.85: + +- ``CMAKE_C_STANDARD``: ``99`` +- ``CMAKE_C_STANDARD_REQUIRED``: ``TRUE`` +- ``CMAKE_C_EXTENSIONS``: ``OFF`` + +Otherwise: + +- ``CMAKE_C_STANDARD``: ``90`` +- ``CMAKE_C_STANDARD_REQUIRED``: not modified +- ``CMAKE_C_EXTENSIONS``: not modified + +If the variable ``CMAKE_C_STANDARD`` is already set when including this module, +none of the above variables will be modifed. + +The following CMake C++ standard default variables are set: + +For ``KDE_COMPILERSETTINGS_LEVEL`` >= 5.85: + +- ``CMAKE_CXX_STANDARD``: ``17`` +- ``CMAKE_CXX_STANDARD_REQUIRED``: ``TRUE`` +- ``CMAKE_CXX_EXTENSIONS``: ``OFF`` + +Otherwise: + +- ``CMAKE_CXX_STANDARD``: ``11`` +- ``CMAKE_CXX_STANDARD_REQUIRED``: ``TRUE`` +- ``CMAKE_CXX_EXTENSIONS``: not modified. + +If the variable ``CMAKE_CXX_STANDARD`` is already set when including this module, +none of the above variables will be modifed. + + +The following C++ compiler flags are set: + +- ``-pedantic`` (GNU and Clang compilers, since 5.85) + +  Can be disabled by setting ``KDE_SKIP_PEDANTIC_WARNINGS_SETTINGS`` to ``TRUE`` +  before including this module (default is ``FALSE`` for +  ``KDE_COMPILERSETTINGS_LEVEL`` >= 5.85, ``TRUE`` otherwise). + +- ``-Wmissing-include-dirs`` (GNU compilers, since 5.85) + +  Can be disabled by setting ``KDE_SKIP_MISSING_INCLUDE_DIRS_WARNINGS_SETTINGS`` to ``TRUE`` +  before including this module (default is ``FALSE`` for +  ``KDE_COMPILERSETTINGS_LEVEL`` >= 5.85, ``TRUE`` otherwise). + +- ``-Wzero-as-null-pointer-constant`` (GNU and Clang compilers, since 5.85) + +  Can be disabled by setting ``KDE_SKIP_NULLPTR_WARNINGS_SETTINGS`` to ``TRUE`` +  before including this module (default is ``FALSE`` for +  ``KDE_COMPILERSETTINGS_LEVEL`` >= 5.85, ``TRUE`` otherwise). + +- Qt related preprocessor definitions (since 5.85.0): + +  - ``-DQT_NO_CAST_TO_ASCII`` +  - ``-DQT_NO_CAST_FROM_ASCII`` +  - ``-DQT_NO_URL_CAST_FROM_STRING`` +  - ``-DQT_NO_CAST_FROM_BYTEARRAY`` +  - ``-DQT_USE_QSTRINGBUILDER`` +  - ``-DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT`` +  - ``-DQT_NO_KEYWORDS`` +  - ``-DQT_NO_FOREACH`` +  - ``-DQT_STRICT_ITERATORS`` + +    Strict iterators are not enabled on Windows, because they lead +    to a link error when application code iterates over a QVector<QPoint> for +    instance, unless Qt itself was also built with strict iterators. +    See example at https://bugreports.qt.io/browse/AUTOSUITE-946 + +  Can be controlled by setting ``KDE_QT_MODERNCODE_DEFINITIONS_LEVEL`` to the +  version of ECM where the wanted set of definitions has been added +  before including this module (default is ``KDE_COMPILERSETTINGS_LEVEL``). +  To disable individual definitions instead use ``remove_definitions()`` directly +  after including this module. + +Functions +~~~~~~~~~ +  This module provides the following functions::    kde_source_files_enable_exceptions([file1 [file2 [...]]]) @@ -42,9 +135,75 @@ on a target that has source files in a language other than C++.  Enables exceptions for C++ source files compiled for the  CMakeLists.txt file in the current directory and all subdirectories. + +Example usages: + +.. code-block:: cmake + +  # needing some macro/feature only available with ECM 5.80.0 +  find_package(ECM 5.80.0 NO_MODULE) + +  # requiring ECM 5.80.0 above will default KDE_COMPILERSETTINGS_LEVEL also to 5.80.0, +  # thus not activate any newer settings +  include(KDECompilerSettings NO_POLICY_SCOPE) + +.. code-block:: cmake + +  # needing some macro/feature only available with ECM 5.87.0 +  find_package(ECM 5.87.0 NO_MODULE) + +  # project uses settings default as of KDECompilerSettings in ECM 5.85.0 +  set(KDE_COMPILERSETTINGS_LEVEL 5.85.0) +  include(KDECompilerSettings NO_POLICY_SCOPE) + +.. code-block:: cmake + +  # needing some macro/feature only available with ECM 5.87.0 +  find_package(ECM 5.87.0 NO_MODULE) + +  # project mainly uses settings default as of KDECompilerSettings in ECM 5.85.0 +  # with some small twisting +  set(KDE_COMPILERSETTINGS_LEVEL 5.85.0) +  # not ready yet for pedantic compilers +  set(KDE_SKIP_PEDANTIC_WARNINGS_SETTINGS TRUE) +  # avoid any Qt definitions +  set(KDE_QT_MODERNCODE_DEFINITIONS_LEVEL 5.84.0) +  include(KDECompilerSettings NO_POLICY_SCOPE) + +.. code-block:: cmake + +  # needing some macro/feature only available with ECM 5.85.0 +  find_package(ECM 5.85.0 NO_MODULE) + +  # requiring ECM 5.85.0 above will default KDE_COMPILERSETTINGS_LEVEL also to 5.85.0, +  # which again defaults KDE_QT_MODERNCODE_DEFINITIONS_LEVEL also to 5.85.0 +  include(KDECompilerSettings NO_POLICY_SCOPE) +  # project is fine with almost all added Qt definitions as of 5.85.0, but not these ones: +  remove_definitions( +      -DQT_NO_KEYWORDS +      -DQT_NO_FOREACH +  ) +  Since pre-1.0.0.  #]=======================================================================] +############################################################ +# Select and check KDE_COMPILERSETTINGS_LEVEL +# For a specified version of KDE_COMPILERSETTINGS_LEVEL always the same set +# of settings needs to be used, to give that version a meaning, even more as +# the settings are usually more strict and can break builds which build fine +# without the setting. +# As at the time of version x it is usually unknown what future versions x+y +# will offer as settings, the minimum required version of ECM sets the upper +# limit then for the level version. +if(NOT DEFINED KDE_COMPILERSETTINGS_LEVEL) +    set(KDE_COMPILERSETTINGS_LEVEL ${ECM_GLOBAL_FIND_VERSION}) +else() +    if(KDE_COMPILERSETTINGS_LEVEL VERSION_GREATER ${ECM_GLOBAL_FIND_VERSION}) +        message(FATAL "KDE_COMPILERSETTINGS_LEVEL cannot be newer than the min. required ECM version.") +    endif() +endif() +  include("${ECM_MODULE_DIR}/ECMSourceVersionControl.cmake")  ############################################################ @@ -184,11 +343,22 @@ endif()  # Pick sensible versions of the C and C++ standards.  if (NOT CMAKE_C_STANDARD) -    set(CMAKE_C_STANDARD 90) +    if (KDE_COMPILERSETTINGS_LEVEL VERSION_GREATER_EQUAL 5.85.0) +        set(CMAKE_C_STANDARD 99) +        set(CMAKE_C_STANDARD_REQUIRED TRUE) +        set(CMAKE_C_EXTENSIONS OFF) +    else() +        set(CMAKE_C_STANDARD 90) +    endif()  endif()  if (NOT CMAKE_CXX_STANDARD) -    set(CMAKE_CXX_STANDARD 11) -    set(CMAKE_CXX_STANDARD_REQUIRED True) +    if (KDE_COMPILERSETTINGS_LEVEL VERSION_GREATER_EQUAL 5.85.0) +        set(CMAKE_CXX_STANDARD 17) +        set(CMAKE_CXX_EXTENSIONS OFF) +    else() +        set(CMAKE_CXX_STANDARD 11) +    endif() +    set(CMAKE_CXX_STANDARD_REQUIRED TRUE)  endif()  # Do not merge uninitialized global variables. @@ -431,6 +601,75 @@ if (APPLE)      _kde_add_platform_definitions(-DQT_MAC_USE_COCOA)  endif() +############################################################ +# Modern code +############################################################ + +function(_kde_set_default_skip_variable_by_min_ecm _var_name _ecm_version) +    if(NOT DEFINED ${_var_name}) +        if (KDE_COMPILERSETTINGS_LEVEL VERSION_LESS ${_ecm_version}) +            set(${_var_name} TRUE PARENT_SCOPE) +        else() +            set(${_var_name} FALSE PARENT_SCOPE) +        endif() +    endif() +endfunction() + +if(NOT DEFINED KDE_QT_MODERNCODE_DEFINITIONS_LEVEL) +    set(KDE_QT_MODERNCODE_DEFINITIONS_LEVEL ${KDE_COMPILERSETTINGS_LEVEL}) +endif() + +if (KDE_QT_MODERNCODE_DEFINITIONS_LEVEL VERSION_GREATER_EQUAL "5.85.0") +    add_definitions( +        -DQT_NO_CAST_TO_ASCII +        -DQT_NO_CAST_FROM_ASCII +        -DQT_NO_URL_CAST_FROM_STRING +        -DQT_NO_CAST_FROM_BYTEARRAY +        -DQT_USE_QSTRINGBUILDER +        -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT +        -DQT_NO_KEYWORDS +        -DQT_NO_FOREACH +    ) +    if (NOT WIN32) +        # Strict iterators can't be used on Windows, they lead to a link error +        # when application code iterates over a QVector<QPoint> for instance, unless +        # Qt itself was also built with strict iterators. +        # See example at https://bugreports.qt.io/browse/AUTOSUITE-946 +        add_definitions(-DQT_STRICT_ITERATORS) +    endif() +endif() + +_kde_set_default_skip_variable_by_min_ecm(KDE_SKIP_PEDANTIC_WARNINGS_SETTINGS "5.85.0") + +if (NOT KDE_SKIP_PEDANTIC_WARNINGS_SETTINGS) +    if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") +        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic") +    endif() +endif() + +_kde_set_default_skip_variable_by_min_ecm(KDE_SKIP_NULLPTR_WARNINGS_SETTINGS "5.85.0") + +if (NOT KDE_SKIP_NULLPTR_WARNINGS_SETTINGS) +    if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") +        if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0.0") +            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wzero-as-null-pointer-constant" ) +        endif() +    endif() + +    if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") +        if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0.0") +            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wzero-as-null-pointer-constant" ) +        endif() +    endif() +endif() + +_kde_set_default_skip_variable_by_min_ecm(KDE_SKIP_MISSING_INCLUDE_DIRS_WARNINGS_SETTINGS "5.85.0") + +if (NOT KDE_SKIP_MISSING_INCLUDE_DIRS_WARNINGS_SETTINGS) +    if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") +        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wmissing-include-dirs") +    endif() +endif()  ############################################################  # Hacks diff --git a/kde-modules/KDEFrameworkCompilerSettings.cmake b/kde-modules/KDEFrameworkCompilerSettings.cmake index 264e715c..d7165f57 100644 --- a/kde-modules/KDEFrameworkCompilerSettings.cmake +++ b/kde-modules/KDEFrameworkCompilerSettings.cmake @@ -37,6 +37,7 @@ if (NOT CMAKE_CXX_STANDARD)      endif()  endif() +set(KDE_COMPILERSETTINGS_LEVEL 5.84.0)  include(KDECompilerSettings NO_POLICY_SCOPE)  add_definitions(-DQT_NO_CAST_TO_ASCII | 
