Hello community, here is the log from the commit of package extra-cmake-modules for openSUSE:Factory checked in at 2019-09-23 12:20:33 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/extra-cmake-modules (Old) and /work/SRC/openSUSE:Factory/.extra-cmake-modules.new.7948 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "extra-cmake-modules" Mon Sep 23 12:20:33 2019 rev:69 rq:730901 version:5.62.0 Changes: -------- --- /work/SRC/openSUSE:Factory/extra-cmake-modules/extra-cmake-modules.changes 2019-08-19 21:02:40.596918152 +0200 +++ /work/SRC/openSUSE:Factory/.extra-cmake-modules.new.7948/extra-cmake-modules.changes 2019-09-23 12:21:34.293765916 +0200 @@ -1,0 +2,15 @@ +Sat Sep 7 20:36:25 UTC 2019 - Christophe Giboudeaux <christo...@krop.fr> + +- Update to 5.62.0 + * New feature release + * For more details please see: + * https://www.kde.org/announcements/kde-frameworks-5.62.0.php +- Changes since 5.61.0: + * ECMAddQtDesignerPlugin: pass code sample indirectly via variable name arg + * Keep 'lib' as default LIBDIR on Arch Linux based systems + * disable autouic again - it breaks builds + * set autorcc and autouic by default + * Define install location for JAR/AAR files for Android + * Add ECMAddQtDesignerPlugin + +------------------------------------------------------------------- Old: ---- extra-cmake-modules-5.61.0.tar.xz extra-cmake-modules-5.61.0.tar.xz.sig New: ---- extra-cmake-modules-5.62.0.tar.xz extra-cmake-modules-5.62.0.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ extra-cmake-modules.spec ++++++ --- /var/tmp/diff_new_pack.0r3L90/_old 2019-09-23 12:21:34.733765844 +0200 +++ /var/tmp/diff_new_pack.0r3L90/_new 2019-09-23 12:21:34.737765843 +0200 @@ -16,7 +16,7 @@ # -%define _tar_path 5.61 +%define _tar_path 5.62 # Full KF5 version (e.g. 5.33.0) %{!?_kf5_version: %global _kf5_version %{version}} # Last major and minor KF5 version (e.g. 5.33) @@ -29,7 +29,7 @@ # Only needed for the package signature condition %bcond_without lang Name: extra-cmake-modules -Version: 5.61.0 +Version: 5.62.0 Release: 0 Summary: CMake modules License: BSD-3-Clause ++++++ extra-cmake-modules-5.61.0.tar.xz -> extra-cmake-modules-5.62.0.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extra-cmake-modules-5.61.0/CMakeLists.txt new/extra-cmake-modules-5.62.0/CMakeLists.txt --- old/extra-cmake-modules-5.61.0/CMakeLists.txt 2019-07-29 02:50:36.000000000 +0200 +++ new/extra-cmake-modules-5.62.0/CMakeLists.txt 2019-09-06 21:41:19.000000000 +0200 @@ -32,7 +32,7 @@ # Preliminary setup # -set(VERSION "5.61.0") # handled by release scripts +set(VERSION "5.62.0") # handled by release scripts if (POLICY CMP0048) cmake_policy(SET CMP0048 NEW) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extra-cmake-modules-5.61.0/docs/module/ECMAddQtDesignerPlugin.rst new/extra-cmake-modules-5.62.0/docs/module/ECMAddQtDesignerPlugin.rst --- old/extra-cmake-modules-5.61.0/docs/module/ECMAddQtDesignerPlugin.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/extra-cmake-modules-5.62.0/docs/module/ECMAddQtDesignerPlugin.rst 2019-09-06 21:41:19.000000000 +0200 @@ -0,0 +1 @@ +.. ecm-module:: ../../modules/ECMAddQtDesignerPlugin.cmake diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extra-cmake-modules-5.61.0/kde-modules/KDECMakeSettings.cmake new/extra-cmake-modules-5.62.0/kde-modules/KDECMakeSettings.cmake --- old/extra-cmake-modules-5.61.0/kde-modules/KDECMakeSettings.cmake 2019-07-29 02:50:36.000000000 +0200 +++ new/extra-cmake-modules-5.62.0/kde-modules/KDECMakeSettings.cmake 2019-09-06 21:41:19.000000000 +0200 @@ -78,6 +78,7 @@ # - Uninstall target functionality since 1.7.0. # - ``APPLE_FORCE_X11`` option since 5.14.0 (detecting X11 was previously the default behavior) # - ``APPLE_SUPPRESS_X11_WARNING`` option since 5.14.0 +# - CMAKE_AUTORCC enabled by default when supported by cmake (>= 3.0) since 5.62.0 # # Translations # ~~~~~~~~~~~~ @@ -238,6 +239,14 @@ # Since CMake 2.8.6 set(CMAKE_AUTOMOC ON) + # Enable autorcc and in cmake so qrc files get generated. + # Since CMake 3.0 + # TODO KF6: discuss enabling AUTOUIC and note porting requirements. autouic + # acts on all #include "ui_*.h" assuming *.ui exists + if(NOT CMAKE_VERSION VERSION_LESS 3.0) + set(CMAKE_AUTORCC ON) + endif() + # By default, create 'GUI' executables. This can be reverted on a per-target basis # using ECMMarkNonGuiExecutable # Since CMake 2.8.8 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extra-cmake-modules-5.61.0/kde-modules/KDEInstallDirs.cmake new/extra-cmake-modules-5.62.0/kde-modules/KDEInstallDirs.cmake --- old/extra-cmake-modules-5.61.0/kde-modules/KDEInstallDirs.cmake 2019-07-29 02:50:36.000000000 +0200 +++ new/extra-cmake-modules-5.62.0/kde-modules/KDEInstallDirs.cmake 2019-09-06 21:41:19.000000000 +0200 @@ -130,6 +130,8 @@ # autostart files (``CONFDIR/autostart``) [``AUTOSTART_INSTALL_DIR``] # ``LOGGINGCATEGORIESDIR`` # Qt logging categories files directory (``DATAROOTDIR/qlogging-categories5``) Since 5.59.0 +# ``JARDIR`` +# Java AAR/JAR files for Android. Since 5.62.0 # # If ``KDE_INSTALL_USE_QT_SYS_PATHS`` is set to TRUE before including this # module, the default values for some variables are instead queried from @@ -245,6 +247,7 @@ # See https://wiki.debian.org/Multiarch if((CMAKE_SYSTEM_NAME MATCHES "Linux|kFreeBSD" OR CMAKE_SYSTEM_NAME STREQUAL "GNU") AND NOT CMAKE_CROSSCOMPILING + AND NOT EXISTS "/etc/arch-release" AND NOT DEFINED ENV{FLATPAK_ID}) if (EXISTS "/etc/debian_version") # is this a debian system ? if(CMAKE_LIBRARY_ARCHITECTURE) @@ -589,6 +592,8 @@ "Kapptemplate and Kdevelop templates") _define_relative(LOGGINGCATEGORIESDIR DATAROOTDIR "qlogging-categories5" "Qt Logging categories files") +_define_relative(JARDIR "" "jar" + "Java AAR/JAR files for Android") # Cross-desktop or other system things _define_relative(ICONDIR DATAROOTDIR "icons" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/extra-cmake-modules-5.61.0/modules/ECMAddQtDesignerPlugin.cmake new/extra-cmake-modules-5.62.0/modules/ECMAddQtDesignerPlugin.cmake --- old/extra-cmake-modules-5.61.0/modules/ECMAddQtDesignerPlugin.cmake 1970-01-01 01:00:00.000000000 +0100 +++ new/extra-cmake-modules-5.62.0/modules/ECMAddQtDesignerPlugin.cmake 2019-09-06 21:41:19.000000000 +0200 @@ -0,0 +1,675 @@ +#.rst: +# ECMAddQtDesignerPlugin +# ---------------------- +# +# This module provides the ``ecm_add_qtdesignerplugin`` function for generating +# Qt Designer plugins for custom widgets. Each of those widgets is described +# using a second function ``ecm_qtdesignerplugin_widget``. +# +# :: +# +# ecm_add_qtdesignerplugin(<target_name> +# NAME <name> +# WIDGETS <widgetid> [<widgetid2> [...]] +# LINK_LIBRARIES <lib> [<lib2> [...]] +# INSTALL_DESTINATION <install_path> +# [OUTPUT_NAME <output_name>] +# [DEFAULT_GROUP <group>] +# [DEFAULT_HEADER_CASE <SAME_CASE|LOWER_CASE|UPPER_CASE>] +# [DEFAULT_HEADER_EXTENSION <header_extension>] +# [DEFAULT_ICON_DIR <icon_dir>] +# [INCLUDE_FILES <include_file> [<include_file2> [...]]] +# [SOURCES <src> [<src2> [...]]] +# [COMPONENT <component>] +# ) +# +# ``NAME`` specifies the base name to use in the generated sources. +# The default is <target_name>. +# +# ``WIDGETS`` specifies the widgets the plugin should support. Each widget has +# to be defined before by a call of ``ecm_qtdesignerplugin_widget`` with the +# respective <widgetid>, in a scope including the current call. +# +# ``LINK_LIBRARIES`` specifies the libraries to link against. This will be at +# least the library providing the widget class(es). +# +# ``INSTALL_DESTINATION`` specifies where the generated plugin binary will be +# installed. +# +# ``OUTPUT_NAME`` specifies the name of the plugin binary. The default is +# "<target_name>". +# +# ``DEFAULT_GROUP`` specifies the default group in Qt Designer where the +# widgets will be placed. The default is "Custom". +# +# ``DEFAULT_HEADER_CASE`` specifies how the name of the header is derived from +# the widget class name. The default is "LOWER_CASE". +# +# ``DEFAULT_HEADER_EXTENSION`` specifies what file name extension is used for +# the header file derived from the class name. The default is "h". +# +# ``DEFAULT_ICON_DIR`` specifies what file name extension is used for +# the header file derived from the class name. The default is "pics". +# +# ``INCLUDE_FILES`` specifies additional include files to include with the +# generated source file. This can be needed for custom code used in +# initializing or creating widgets. +# +# ``SOURCES`` specifies additional source files to build the plugin from. +# This can be needed to support custom code used in initializing or +# creating widgets. +# +# ``COMPONENT`` specifies the installation component name with which the install +# rules for the generated plugin are associated. +# +# :: +# +# ecm_qtdesignerplugin_widget(<widgetid> +# [CLASS_NAME <class_name>] +# [INCLUDE_FILE <include_file>] +# [CONTAINER] +# [ICON <iconfile>] +# [TOOLTIP <tooltip>] +# [WHATSTHIS <whatsthis>] +# [GROUP <group>] +# [CREATE_WIDGET_CODE_FROM_VARIABLE <create_widget_code_variable>] +# [INITIALIZE_CODE_FROM_VARIABLE <initialize_code_variable] +# [DOM_XML_FROM_VARIABLE <dom_xml_variable>] +# [IMPL_CLASS_NAME <impl_class_name>] +# [CONSTRUCTOR_ARGS_CODE <constructor_args_code>] +# [CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE <constructor_args_code_variable>] +# ) +# +# ``CLASS_NAME`` specifies the name of the widget class, including namespaces. +# The default is "<widgetid>". +# +# ``INCLUDE_FILE`` specifies the include file to use for the class of this +# widget. The default is derived from <class_name> as configured by the +# ``DEFAULT_HEADER_*`` options of ``ecm_add_qtdesignerplugin``, also replacing +# any namespace separators with "/". +# +# ``CONTAINER`` specifies, if set, that this widget is a container +# for other widgets. +# +# ``ICON`` specifies the icon file to use as symbol for this widget. +# The default is "{lowercased <class_name>}.png" in the default icons dir as +# configured by the ``DEFAULT_ICON_DIR`` option of +# ``ecm_add_qtdesignerplugin``, if such a file exists. +# +# ``TOOLTIP`` specifies the tooltip text to use for this widget. Default is +# "<class_name> Widget". +# +# ``WHATSTHIS`` specifies the What's-This text to use for this widget. +# Defaults to the tooltip. +# +# ``GROUP`` specifies the group in Qt Designer where the widget will be placed. +# The default is set as configured by the ``DEFAULT_GROUP`` option of +# ``ecm_add_qtdesignerplugin``. +# +# ``CREATE_WIDGET_CODE_FROM_VARIABLE`` specifies the variable to get from the +# C++ code to use as factory code to create an instance of the widget, +# for the override of +# ``QDesignerCustomWidgetInterface::createWidget(QWidget* parent)``. +# The default is "return new <impl_class_name><constructor_args_code>;". +# +# ``INITIALIZE_CODE_FROM_VARIABLE`` specifies the variable to get from the C++ +# code to use with the override of +# ``QDesignerCustomWidgetInterface::initialize(QDesignerFormEditorInterface* core)``. +# The code has to use the present class member ``m_initialized`` to track and +# update the state. The default code simply sets ``m_initialized`` to +# ``true``, if it was not before. +# +# ``DOM_XML_FROM_VARIABLE`` specifies the variable to get from the string to +# use with the optional override of +# ``QDesignerCustomWidgetInterface::domXml()``. +# Default does not override. +# +# ``IMPL_CLASS_NAME`` specifies the name of the widget class to use for the +# widget instance with Qt Designer. The default is "<class_name>". +# +# ``CONSTRUCTOR_ARGS_CODE`` specifies the C++ code to use for the constructor +# arguments with the default of ``CREATE_WIDGET_CODE_FROM_VARIABLE``. Note +# that the parentheses are required. The default is "(parent)". +# +# ``CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE`` specifies the variable to get from +# the C++ code instead of passing it directly via ``CONSTRUCTOR_ARGS_CODE``. +# This can be needed if the code is more complex and e.g. includes ";" chars. +# +# +# +# Example usage: +# +# .. code-block:: cmake +# +# ecm_qtdesignerplugin_widget(FooWidget +# TOOLTIP "Enables to browse foo." +# GROUP "Views (Foo)" +# ) +# +# set(BarWidget_CREATE_WIDGET_CODE +# " +# auto* widget = new BarWidget(parent); +# widget->setBar("Example bar"); +# return widget; +# ") +# +# ecm_qtdesignerplugin_widget(BarWidget +# TOOLTIP "Displays bars." +# GROUP "Display (Foo)" +# CREATE_WIDGET_CODE_FROM_VARIABLE BarWidget_CREATE_WIDGET_CODE +# ) +# +# ecm_add_qtdesignerplugin(foowidgets +# NAME FooWidgets +# OUTPUT_NAME foo2widgets +# WIDGETS +# FooWidget +# BarWidget +# LINK_LIBRARIES +# Foo::Widgets +# INSTALL_DESTINATION "${KDE_INSTALL_QTPLUGINDIR}/designer" +# COMPONENT Devel +# ) +# +# Since 5.62.0. + +#============================================================================= +# Copyright 2019 Friedrich W. H. Kossebau <kosse...@kde.org> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +include(CMakeParseArguments) + +# helper method +# escapes string for C++ code +function(_ecm_qtdesignerplugin_escape_cpp_string _varName input) + string(REPLACE "\"" "\\\"" _string ${input}) + set(${_varName} "${_string}" PARENT_SCOPE) +endfunction() + +# To make the data about the widgets available to the function ecm_add_qtdesignerplugin, +# variables are created in the scope of the caller of this method, protected by +# a namespace for this macro file, and otherwise from the widget id and the property id: +# ECM_QTDESIGNERPLUGIN_${widget}_${property} +function(ecm_qtdesignerplugin_widget widget) + set(options + CONTAINER + ) + set(oneValueArgs + CLASS_NAME + INCLUDE_FILE + ICON + TOOLTIP + WHATSTHIS + GROUP + CREATE_WIDGET_CODE_FROM_VARIABLE + INITIALIZE_CODE_FROM_VARIABLE + DOM_XML_FROM_VARIABLE + IMPL_CLASS_NAME + CONSTRUCTOR_ARGS_CODE + CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE + ) + set(multiValueArgs + ) + cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if(NOT ARGS_CLASS_NAME) + set(ARGS_CLASS_NAME "${widget}") + endif() + if(NOT ARGS_TOOLTIP) + set(ARGS_TOOLTIP "${ARGS_CLASS_NAME} Widget") + endif() + if(NOT ARGS_WHATSTHIS) + set(ARGS_WHATSTHIS "${ARGS_TOOLTIP}") + endif() + if(ARGS_CONTAINER) + set(_is_container TRUE) + else() + set(_is_container FALSE) + endif() + if(ARGS_CONSTRUCTOR_ARGS_CODE AND ARGS_CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE) + message(FATAL_ERROR "Either CONSTRUCTOR_ARGS_CODE or CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE can be passed when calling ecm_qtdesignerplugin_widget().") + endif() + if(NOT ARGS_CREATE_WIDGET_CODE_FROM_VARIABLE) + if(NOT ARGS_IMPL_CLASS_NAME) + set(ARGS_IMPL_CLASS_NAME "${ARGS_CLASS_NAME}") + endif() + if(ARGS_CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE) + set(_constructor_args "${${ARGS_CONSTRUCTOR_ARGS_CODE_FROM_VARIABLE}}") + elseif(ARGS_CONSTRUCTOR_ARGS_CODE) + set(_constructor_args "${ARGS_CONSTRUCTOR_ARGS_CODE}") + else() + set(_constructor_args "(parent)") + endif() + set(_create_widget_code " return new ${ARGS_IMPL_CLASS_NAME}${_constructor_args};") + else() + set(_create_widget_code "${${ARGS_CREATE_WIDGET_CODE_FROM_VARIABLE}}") + endif() + if(ARGS_ICON) + if (NOT IS_ABSOLUTE ${ARGS_ICON}) + set(ARGS_ICON "${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_ICON}") + endif() + if(NOT EXISTS "${ARGS_ICON}") + message(FATAL_ERROR "No such file as passed with ICON when calling ecm_qtdesignerplugin_widget(): ${ARGS_ICON}") + endif() + endif() + + # store data about widget, so ecm_add_qtdesignerplugin can access it + set(ECM_QTDESIGNERPLUGIN_${widget}_CLASS_NAME "${ARGS_CLASS_NAME}" PARENT_SCOPE) + set(ECM_QTDESIGNERPLUGIN_${widget}_INCLUDE_FILE "${ARGS_INCLUDE_FILE}" PARENT_SCOPE) + set(ECM_QTDESIGNERPLUGIN_${widget}_TOOLTIP "${ARGS_TOOLTIP}" PARENT_SCOPE) + set(ECM_QTDESIGNERPLUGIN_${widget}_WHATSTHIS "${ARGS_WHATSTHIS}" PARENT_SCOPE) + set(ECM_QTDESIGNERPLUGIN_${widget}_GROUP "${ARGS_GROUP}" PARENT_SCOPE) + set(ECM_QTDESIGNERPLUGIN_${widget}_ICON "${ARGS_ICON}" PARENT_SCOPE) + set(ECM_QTDESIGNERPLUGIN_${widget}_IS_CONTAINER "${_is_container}" PARENT_SCOPE) + set(ECM_QTDESIGNERPLUGIN_${widget}_CREATE_WIDGET_CODE "${_create_widget_code}" PARENT_SCOPE) + set(ECM_QTDESIGNERPLUGIN_${widget}_INITIALIZE_CODE "${${INITIALIZE_CODE_FROM_VARIABLE}}" PARENT_SCOPE) + set(ECM_QTDESIGNERPLUGIN_${widget}_DOM_XML "${${ARGS_DOM_XML_FROM_VARIABLE}}" PARENT_SCOPE) +endfunction() + +# helper method +function(_ecm_qtdesignerplugin_write_widget designer_src_file widget default_group rc_icon_dir) + # prepare data + set(_classname "${ECM_QTDESIGNERPLUGIN_${widget}_CLASS_NAME}") + set(_factory_classname "${_classname}QtDesignerWidgetFactory") + string(REPLACE "::" "__" _factory_classname "${_factory_classname}") + set(ECM_QTDESIGNERPLUGIN_${widget}_FACTORY_CLASS_NAME "${_factory_classname}" PARENT_SCOPE) + if(ECM_QTDESIGNERPLUGIN_${widget}_IS_CONTAINER) + set(_is_container "true") + else() + set(_is_container "false") + endif() + _ecm_qtdesignerplugin_escape_cpp_string(_tooltip "${ECM_QTDESIGNERPLUGIN_${widget}_TOOLTIP}") + _ecm_qtdesignerplugin_escape_cpp_string(_whatsthis "${ECM_QTDESIGNERPLUGIN_${widget}_WHATSTHIS}") + set(_group ${ECM_QTDESIGNERPLUGIN_${widget}_GROUP}) + if(NOT _group) + set(_group "${default_group}") + endif() + _ecm_qtdesignerplugin_escape_cpp_string(_group "${_group}") + set(_dom_xml "${ECM_QTDESIGNERPLUGIN_${widget}_DOM_XML}") + if(_dom_xml) + string(REPLACE "\"" "\\\"" _dom_xml "${_dom_xml}") + set(_dom_xml_method " QString domXml() const override { return QStringLiteral(\"${_dom_xml}\"); }") + else() + set(_dom_xml_method) + endif() + set(_icon "${ECM_QTDESIGNERPLUGIN_${widget}_ICON}") + if(_icon) + get_filename_component(_icon_filename ${_icon} NAME) + set(_icon_construct "QIcon(QStringLiteral(\":${rc_icon_dir}/${_icon_filename}\"))") + else() + set(_icon_construct "QIcon()") + endif() + set(_initialize_code "${ECM_QTDESIGNERPLUGIN_${widget}_INITIALIZE_CODE}") + if(NOT _initialize_code) + set(_initialize_code +" Q_UNUSED(core); + + if (m_initialized) return; + + m_initialized = true;" + ) + endif() + + # write code + file(APPEND ${designer_src_file} " +class ${_factory_classname} + : public QObject + , public QDesignerCustomWidgetInterface +{ + Q_OBJECT + Q_INTERFACES(QDesignerCustomWidgetInterface) + +public: + explicit ${_factory_classname}(QObject *parent = nullptr) + : QObject(parent) + , m_initialized(false) + {} + + ~${_factory_classname}() override {} + +public: // QDesignerCustomWidgetInterface API + bool isInitialized() const override { return m_initialized; } +${_dom_xml_method} + bool isContainer() const override { return ${_is_container}; } + QIcon icon() const override { return ${_icon_construct}; } + QString group() const override { return QStringLiteral(\"${_group}\"); } + QString includeFile() const override { return QStringLiteral(\"${ECM_QTDESIGNERPLUGIN_${widget}_INCLUDE_FILE}\"); } + QString name() const override { return QStringLiteral(\"${_classname}\"); } + QString toolTip() const override { return QStringLiteral(\"${_tooltip}\"); } + QString whatsThis() const override { return QStringLiteral(\"${_whatsthis}\"); } + + QWidget* createWidget(QWidget* parent) override + { +${ECM_QTDESIGNERPLUGIN_${widget}_CREATE_WIDGET_CODE} + } + + void initialize(QDesignerFormEditorInterface* core) override + { +${_initialize_code} + } + +private: + bool m_initialized; +}; +" + ) +endfunction() + +# helper method +function(_ecm_qtdesignerplugin_write_icon_qrc_file rc_file rc_icon_dir) + set(_icons ${ARGN}) + file(WRITE ${rc_file} +"<!DOCTYPE RCC><RCC version=\"1.0\"> +<!-- DO NOT EDIT! Generated from ecm_add_qtdesignerplugin() --> +<qresource prefix=\"${rc_icon_dir}\"> +" + ) + foreach(_icon ${_icons}) + get_filename_component(_icon_filename ${_icon} NAME) + file(APPEND ${rc_file} "<file alias=\"${_icon_filename}\">${_icon}</file>\n") + endforeach() + file(APPEND ${rc_file} +"</qresource> +</RCC> +" + ) +endfunction() + +# This needs to be a macro not a function because of the nested +# find_package() call, which will set some variables. +macro(ecm_add_qtdesignerplugin target) + set(options + ) + set(oneValueArgs + NAME + OUTPUT_NAME + INSTALL_DESTINATION + DEFAULT_GROUP + COMPONENT + DEFAULT_HEADER_CASE + DEFAULT_HEADER_EXTENSION + DEFAULT_ICON_DIR + ) + set(multiValueArgs + WIDGETS + LINK_LIBRARIES + INCLUDE_FILES + SOURCES + ) + cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + # args sanity check + if (NOT ARGS_WIDGETS) + message(FATAL_ERROR "No WIDGETS passed when calling ecm_add_qtdesignerplugin().") + endif() + foreach(_widget ${ARGS_WIDGETS}) + # using _CLASS_NAME as sample property to find if defined + if (NOT ECM_QTDESIGNERPLUGIN_${_widget}_CLASS_NAME) + message(FATAL_ERROR "Undefined widget passed when calling ecm_add_qtdesignerplugin(): ${_widget}") + endif() + endforeach() + + if(NOT ARGS_NAME) + set(ARGS_NAME "${target}") + endif() + if(NOT ARGS_DEFAULT_GROUP) + set(ARGS_DEFAULT_GROUP "Custom") + endif() + if(NOT ARGS_DEFAULT_HEADER_EXTENSION) + set(ARGS_DEFAULT_HEADER_EXTENSION "h") + endif() + if(NOT ARGS_DEFAULT_HEADER_CASE) + set(ARGS_DEFAULT_HEADER_CASE "LOWER_CASE") + else() + set(_allowed_values "LOWER_CASE" "UPPER_CASE" "SAME_CASE") + list(FIND _allowed_values "${ARGS_DEFAULT_HEADER_CASE}" _index) + if(_index EQUAL "-1") + message(FATAL_ERROR "Unexpected value for DEFAULT_HEADER_CASE argument to ecm_add_qtdesignerplugin(): ${ARGS_DEFAULT_HEADER_CASE}") + endif() + endif() + if(NOT ARGS_DEFAULT_ICON_DIR) + set(ARGS_DEFAULT_ICON_DIR "${CMAKE_CURRENT_SOURCE_DIR}/pics") + else() + if (NOT IS_ABSOLUTE ${ARGS_DEFAULT_ICON_DIR}) + set(ARGS_DEFAULT_ICON_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_DEFAULT_ICON_DIR}") + endif() + if(NOT EXISTS "${ARGS_DEFAULT_ICON_DIR}") + message(FATAL_ERROR "No such directory as passed with DEFAULT_ICON_DIR when calling ecm_add_qtdesignerplugin(): ${ARGS_DEFAULT_ICON_DIR}") + endif() + endif() + + # Check deps + # peek at Qt5Core to learn about the version to decide whether Qt5UiPlugin is enough + if(NOT Qt5Core_FOUND) + find_package(Qt5Core QUIET CONFIG) + endif() + if(Qt5Core_VERSION VERSION_LESS "5.5.0") + set(_qtdesigner_tobefound TRUE) + elseif(Qt5Core_VERSION VERSION_LESS "5.9.0") + set(_qtdesigner_tobefound TRUE) + set(_qtuiplugin_tobefound TRUE) + else() + # Since Qt 5.9 only Qt5UiPlugin is needed + set(_qtuiplugin_tobefound TRUE) + endif() + if(NOT Qt5Designer_FOUND AND _qtdesigner_tobefound) + find_package(Qt5Designer QUIET CONFIG) + set_package_properties(Qt5Designer PROPERTIES + PURPOSE "Required to build Qt Designer plugins" + TYPE REQUIRED + ) + endif() + if(NOT Qt5UiPlugin_FOUND AND _qtuiplugin_tobefound) + find_package(Qt5UiPlugin QUIET CONFIG) + set_package_properties(Qt5UiPlugin PROPERTIES + PURPOSE "Required to build Qt Designer plugins" + TYPE REQUIRED + ) + endif() + if (Qt5Designer_FOUND) + set(_qtdesigner_tobefound FALSE) + endif() + if (Qt5UiPlugin_FOUND) + set(_qtuiplugin_tobefound FALSE) + # in some old versions Qt5UiPlugin does not set its _INCLUDE_DIRS variable. Fill it manually + get_target_property(Qt5UiPlugin_INCLUDE_DIRS Qt5::UiPlugin INTERFACE_INCLUDE_DIRECTORIES) + endif() + + # setup plugin only if designer/uiplugin libs were found, as we do not abort hard the cmake run otherwise + if(NOT _qtdesigner_tobefound AND NOT _qtuiplugin_tobefound) + set(_generation_dir "${CMAKE_CURRENT_BINARY_DIR}/${target}_ECMQtDesignerPlugin") + file(MAKE_DIRECTORY "${_generation_dir}") + set(_rc_icon_dir "/${ARGS_NAME}/designer") + + # process defaults for widgets + foreach(_widget ${ARGS_WIDGETS}) + set(_class_name "${ECM_QTDESIGNERPLUGIN_${_widget}_CLASS_NAME}") + # include file + set(_include_file "${ECM_QTDESIGNERPLUGIN_${_widget}_INCLUDE_FILE}") + if(NOT _include_file) + set(_include_file "${_class_name}") + if (ARGS_DEFAULT_HEADER_CASE STREQUAL "LOWER_CASE") + string(TOLOWER "${_include_file}" _include_file) + elseif(ARGS_DEFAULT_HEADER_CASE STREQUAL "UPPER_CASE") + string(TOUPPER "${_include_file}" _include_file) + endif() + # turn any namespaces into dir levels + string(REPLACE "::" "/" _include_file ${_include_file}) + set(ECM_QTDESIGNERPLUGIN_${_widget}_INCLUDE_FILE "${_include_file}.${ARGS_DEFAULT_HEADER_EXTENSION}") + endif() + # icon + set(_icon "${ECM_QTDESIGNERPLUGIN_${_widget}_ICON}") + if(NOT _icon) + string(TOLOWER "${_class_name}" _icon) + # handle any namespaces + string(REPLACE "::" "_" _icon "${_icon}") + set(_icon "${ARGS_DEFAULT_ICON_DIR}/${_icon}.png") + if(EXISTS "${_icon}") + set(ECM_QTDESIGNERPLUGIN_${_widget}_ICON "${_icon}") + endif() + endif() + endforeach() + + set(_plugin_src_file "${_generation_dir}/designerplugin.cpp") + set(_srcs + ${ARGS_SOURCES} + ${_plugin_src_file} + ) + + set(_icons) + foreach(_widget ${ARGS_WIDGETS}) + list(APPEND _icons "${ECM_QTDESIGNERPLUGIN_${_widget}_ICON}") + endforeach() + + # generate qrc file with icons + if (_icons) + set(_rc_file "${_generation_dir}/designerplugin.rc") + set(_rc_work_file "${_rc_file}.work") + + _ecm_qtdesignerplugin_write_icon_qrc_file("${_rc_work_file}" "${_rc_icon_dir}" ${_icons}) + # avoid rebuilding if there was no change + execute_process( + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_rc_work_file}" "${_rc_file}" + ) + file(REMOVE "${_rc_work_file}") + + qt5_add_resources(_srcs ${_rc_file}) + endif() + + # generate source file + set(_collection_classname "${ARGS_NAME}QtDesignerWidgetCollection") + + set(_include_files + # classes inherited + QDesignerCustomWidgetCollectionInterface + QDesignerCustomWidgetInterface + QObject + # classes used + QIcon + QString + ${ARGS_INCLUDE_FILES} + ) + foreach(_widget ${ARGS_WIDGETS}) + list(APPEND _include_files ${ECM_QTDESIGNERPLUGIN_${_widget}_INCLUDE_FILE}) + endforeach() + list(REMOVE_DUPLICATES _include_files) + + set(_plugin_src_work_file "${_plugin_src_file}.work") + file(WRITE ${_plugin_src_work_file} "// DO NOT EDIT! Generated from ecm_add_qtdesignerplugin()\n\n") + foreach(_include_file ${_include_files}) + if (NOT ${_include_file} MATCHES "^[\"<]") + set(_include_file "<${_include_file}>") + endif() + file(APPEND ${_plugin_src_work_file} "#include ${_include_file}\n") + endforeach() + foreach(_widget ${ARGS_WIDGETS}) + _ecm_qtdesignerplugin_write_widget(${_plugin_src_work_file} ${_widget} ${ARGS_DEFAULT_GROUP} ${_rc_icon_dir}) + endforeach() + file(APPEND ${_plugin_src_work_file} " +class ${_collection_classname} + : public QObject + , public QDesignerCustomWidgetCollectionInterface +{ + Q_OBJECT + Q_INTERFACES( + QDesignerCustomWidgetCollectionInterface + ) + + Q_PLUGIN_METADATA(IID \"org.qt-project.Qt.QDesignerCustomWidgetInterface\") + +public: + explicit ${_collection_classname}(QObject* parent = nullptr); + +public: // QDesignerCustomWidgetCollectionInterface API + QList<QDesignerCustomWidgetInterface*> customWidgets() const override; + +private: + QList<QDesignerCustomWidgetInterface*> m_widgetFactories; +}; + +${_collection_classname}::${_collection_classname}(QObject* parent) + : QObject(parent) +{ + m_widgetFactories = QList<QDesignerCustomWidgetInterface*>{ +" + ) + foreach(_widget ${ARGS_WIDGETS}) + file(APPEND ${_plugin_src_work_file} " new ${ECM_QTDESIGNERPLUGIN_${_widget}_FACTORY_CLASS_NAME}(this),\n") + endforeach() + file(APPEND ${_plugin_src_work_file} +" }; +} + +QList<QDesignerCustomWidgetInterface*> ${_collection_classname}::customWidgets() const +{ + return m_widgetFactories; +} + +#include \"designerplugin.moc\" +" + ) + + # avoid rebuilding if there was no change + execute_process( + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_plugin_src_work_file}" "${_plugin_src_file}" + ) + file(REMOVE "${_plugin_src_work_file}") + + # setup plugin binary + add_library(${target} MODULE ${_srcs}) + if(Qt5UiPlugin_VERSION AND NOT Qt5UiPlugin_VERSION VERSION_LESS "5.9.0") + list(APPEND ARGS_LINK_LIBRARIES Qt5::UiPlugin) + else() + # For Qt <5.9 include dir variables needed + target_include_directories(${target} + PRIVATE ${Qt5UiPlugin_INCLUDE_DIRS} + PRIVATE ${Qt5Designer_INCLUDE_DIRS} + ) + endif() + if(NOT WIN32) + # Since there are no libraries provided by this module, + # there is no point including the build tree in RPath, + # and then having to edit it at install time. + set_target_properties(${target} PROPERTIES + SKIP_BUILD_RPATH TRUE + BUILD_WITH_INSTALL_RPATH TRUE + ) + endif() + if (ARGS_OUTPUT_NAME) + set_target_properties(${target} PROPERTIES + OUTPUT_NAME ${ARGS_OUTPUT_NAME} + ) + endif() + target_link_libraries(${target} ${ARGS_LINK_LIBRARIES}) + + if (DEFINED ARGS_COMPONENT) + set(_component COMPONENT ${ARGS_COMPONENT}) + else() + set(_component) + endif() + + install(TARGETS ${target} DESTINATION ${ARGS_INSTALL_DESTINATION} ${_component}) + endif() +endmacro()