Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
ECM-MODULES(7)		       Extra CMake Modules		  ECM-MODULES(7)

NAME
     ecm-modules - ECM Modules Reference

INTRODUCTION
     Extra  CMake  Modules  (ECM)  provides  various modules that provide useful
     functions for CMake scripts. ECM actually provides three types  of  modules
     that can be used from CMake scripts: those that extend the functionality of
     the  find_package command are documented in ecm-find-modules(7); those that
     provide standard settings for software produced by the  KDE  community  are
     documented  in  ecm-kde-modules(7).   The rest provide macros and functions
     for general use by CMake scripts and are documented here.

     To use these modules, you need to tell CMake to find the ECM  package,  and
     then  add	either ${ECM_MODULE_PATH} or ${ECM_MODULE_DIR} to the CMAKE_MOD-
     ULE_PATH variable:

	find_package(ECM REQUIRED NO_MODULE)
	set(CMAKE_MODULE_PATH ${ECM_MODULE_DIR})

     Using ${ECM_MODULE_PATH} will also make the find modules  and  KDE  modules
     available.

     Note    that    there   are   also   toolchain   modules,	 documented   in
     ecm-toolchains(7), but these are used by users building the software rather
     than developers writing CMake scripts.

ALL MODULES
   CheckAtomic
     Check if the compiler supports std:atomic out of the box or if libatomic is
     needed for atomic support. If it is needed libatomicis added  to  CMAKE_RE-
     QUIRED_LIBRARIES. So after running CheckAtomic you can use std:atomic.

     Since 5.75.0.

   ECMAddAndroidApk
     Functions	for  creating  Android	APK packages using Qt6as androiddeployqt
     tool as well as the associated Fastlane metadata.

	ecm_add_android_apk(<target>
	    [ANDROID_DIR <dir>]
	    [PACKAGE_NAME <name>]
	    # TODO extra args?
	)

     Creates an Android APK for the given target.

     If ANDROID_DIR is given, the Android manifest file as well as any potential
     Gradle build system files or Java/Kotlin source files are taken  from  that
     directory.   If  not  set,  the standard template shipped with Qt6 is used,
     which in usually not what you want for production applications.

     If PACKAGE_NAME is given, it is used as name for the Android APK.	 If  not
     set, the target name is used. Since 6.10.0

     The  use of this function creates a build target called create-apk-<target>
     which will run androiddeployqt to produce an (unsigned)  APK,  as	well  as
     convert  Appstream application metadata (if present) into the Fastlane for-
     mat used by F-Droid and Play store automation.

     Thereas also a create-apk convenience target being created that will  build
     all APKs defined in a project.

     When  building  for another platform than Android, this function does noth-
     ing.

     The following variables impact the behavior: ECM_ADDITIONAL_FIND_ROOT_PATH
	See documentation in the Android toolchain file.

     ECM_APK_STAGING_ROOT_PATH
	    For use with Craftas image directory. If set this  is  used  as  the
	    source  for all content of the APK rather than the search paths used
	    for building.  This allows to separate e.g. development  files  from
	    what ends up in the APK.

     Since 6.0.0

     For  automatically deriving APK versions from CMake this creates a ecm-ver-
     sion.gradle file which defines the following variables: ecmVersionName: Set
     to PROJECT_VERSION ecmVersionCode: Derived from the current time  in  local
     builds, and from CI_PIPELINE_CREATED_AT
	in builds from Gitlab pipelines. This ensures a strictly increasing ver-
	sion code as well as synchronized version codes for APKs of multiple ar-
	chitectures when build in a Gitlab pipeline.

     This  can be included by calling apply from: '../ecm-version.gradle' in the
     projectas build.gradle file and is typically used in manifest placeholders:

     ``
     ` defaultConfig {
	versionName ecmVersionName versionCode ecmVersionCode manifestPlacehold-
	ers = [versionName: ecmVersionName, versionCode: ecmVersionCode] a|

   }
     Since 6.12.0

   ECMAddAppIcon
     Add icons to executable files and packages.

	ecm_add_app_icon(<sources_var_name(|target (since 5.83))>
			 ICONS <icon> [<icon> [...]]
			 [SIDEBAR_ICONS <icon> [<icon> [...]] # Since 5.49
			 [OUTFILE_BASENAME <name>]) # Since 5.49
			 )

     The given icons, whose names must match the pattern:

	<size>-<other_text>.png

     will be added as platform-specific application icons to the variable  named
     <sources_var_name>  or,  if the first argument is a target (since 5.83), to
     the SOURCES property of <target>.	Any target must be created with add_exe-
     cutable() and not be an alias.

     Other icon files are ignored but on macOS SVG files can be supported and it
     is thus possible to mix those with png files in a single macro call.

     The platforms currently supported are Windows and macOS, on all others  the
     call has no effect and is ignored.

     <size>  is  a  numeric  pixel  size (typically 16, 32, 48, 64, 128 or 256).
     <other_text> can be any other text. See the platform notes  below	for  any
     recommendations about icon sizes.

     SIDEBAR_ICONS can be used to add macOS sidebar icons to the generated icon-
     set.  They  are  used when a folder monitored by the application is dragged
     into Finderas sidebar. Since 5.49.

     OUTFILE_BASENAME will be used as the basename for the  icon  file.  If  you
     specify  it,  the icon file will be called <OUTFILE_BASENAME>.icns on macOS
     and <OUTFILE_BASENAME>.ico on Windows. If you donat specify it, it defaults
     to <sources_var_name>.<ext>. Since 5.49.

     Windows notes

	    * Icons are compiled into the executable using a resource file.

	    * Icons may not show up in Windows Explorer if the executable target
	      does not have the WIN32_EXECUTABLE property set.

	    * Icotool (see FindIcoTool) is required.

	    * Supported sizes: 16, 24, 32, 48, 64, 128, 256, 512 and 1024.

     macOS notes

	    * The executable target must have the MACOSX_BUNDLE property set.

	    * Icons are added to the bundle.

	    * If the ksvg2icns tool from  KIconThemes  is  available,  .svg  and
	      .svgz files are accepted; the first that is converted successfully
	      to  .icns will provide the application icon. SVG files are ignored
	      otherwise.

	    * The tool iconutil (provided  by  Apple)  is  required  for  bitmap
	      icons.

	    * Supported  sizes:  16,  32, 64, 128, 256 (and 512, 1024 after OS X
	      10.9).

	    * At least a 128x128px (or an SVG) icon is required.

	    * Larger sizes are automatically  used  to	substitute  for  smaller
	      sizes  on aRetinaa (high-resolution) displays. For example, a 32px
	      icon, if provided, will be used as a 32px icon on standard-resolu-
	      tion displays, and as a 16px-equivalent icon (with an  a@2xa  tag)
	      on  high-resolution  displays. That is why you should provide 64px
	      and 1024px icons although they are not supported anymore directly.
	      Instead they will be used as 32px@2x and 512px@2x. If an SVG  icon
	      is  provided,  ksvg2icns	will be used internally to automatically
	      generate all  appropriate  sizes,  including  the  high-resolution
	      ones.

	    * This  function  sets  the  MACOSX_BUNDLE_ICON_FILE variable to the
	      name of the generated icns file, so that it will be  used  as  the
	      MACOSX_BUNDLE_ICON_FILE  target  property  when  you call add_exe-
	      cutable.

	    * Sidebar icons should typically provided in 16,  32,  64,	128  and
	      256px.

     Since 1.7.0.

   ECMAddQch
     This module provides the ecm_add_qch function for generating API documenta-
     tion  files  in the QCH format, and the ecm_install_qch_export function for
     generating and installing exported CMake targets  for  such  generated  QCH
     files  to	enable	builds of other software with generation of QCH files to
     create links into the given QCH files.

	ecm_add_qch(<target_name>
	    NAME <name>
	    VERSION <version>
	    QCH_INSTALL_DESTINATION <qchfile_install_path>
	    TAGFILE_INSTALL_DESTINATION <tagsfile_install_path>
	    [COMPONENT <component>]
	    [BASE_NAME <basename>]
	    [SOURCE_DIRS <dir> [<dir2> [...]]]
	    [SOURCES <file> [<file2> [...]]]
	    |MD_MAINPAGE <md_file>]
	    [INCLUDE_DIRS <incdir> [<incdir2> [...]]]
	    [IMAGE_DIRS <idir> [<idir2> [...]]]
	    [EXAMPLE_DIRS <edir> [<edir2> [...]]]
	    [ORG_DOMAIN <domain>]
	    [NAMESPACE <namespace>]
	    [LINK_QCHS <qch> [<qch2> [...]]]
	    [PREDEFINED_MACROS <macro[=content]> [<macro2[=content]> [...]]]
	    [BLANK_MACROS <macro> [<macro2> [...]]]
	    [CONFIG_TEMPLATE <configtemplate_file>]
	    [VERBOSE]
	)

     This macro adds a target called <target_name> for the creation  of  an  API
     documentation  manual  in	the  QCH format from the given sources.  It cur-
     rently uses doxygen, future versions  might  optionally  also  allow  other
     tools.  Next to the QCH file the target will generate a corresponding doxy-
     gen  tag  file,  which enables creating links from other documentation into
     the generated QCH file.

     It is recommended to make the use of this macro optional, by depending  the
     call to ecm_add_qch on a CMake option being set, with a name like BUILD_QCH
     and  being  TRUE  by  default.  This will allow the developers to saves re-
     sources on normal source development build cycles by setting this option to
     FALSE.

     The macro will set the target  properties	DOXYGEN_TAGFILE,  QHP_NAMESPACE,
     QHP_NAMESPACE_VERSIONED,  QHP_VIRTUALFOLDER and LINK_QCHS to the respective
     values, to allow  other  code  access  to	them,  e.g.  the  macro  ecm_in-
     stall_qch_export.	 To  enable  the use of the target <target_name> as item
     for LINK_QCHS in further ecm_add_qch calls in the current build,  addition-
     ally  a  target property DOXYGEN_TAGFILE_BUILD is set, with the path of the
     created doxygen tag file in the build dir.  If existing,  ecm_add_qch  will
     use this property instead of DOXYGEN_TAGFILE for access to the tags file.

     NAME specifies the name for the generated documentation.

     VERSION specifies the version of the library for which the documentation is
     created.

     BASE_NAME	specifies  the	base  name for the generated files.  The default
     basename is <name>.

     SOURCE_DIRS specifies the dirs (incl. subdirs) with the  source  files  for
     which  the  API documentation should be generated.  Dirs can be relative to
     the current source dir. Dependencies to the  files  in  the  dirs	are  not
     tracked  currently, other than with the SOURCES argument. So do not use for
     sources generated during the build.  Needs to be used when SOURCES or  CON-
     FIG_TEMPLATE are not used.

     SOURCES  specifies  the source files for which the API documentation should
     be generated.  Needs to be used when SOURCE_DIRS or CONFIG_TEMPLATE are not
     used.

     MD_MAINPAGE specifies a file in Markdown format that should be used as main
     page. This page  will  overrule  any  \mainpage  command  in  the	included
     sources.

     INCLUDE_DIRS specifies the dirs which should be searched for included head-
     ers. Dirs can be relative to the current source dir. Since 5.63.

     IMAGE_DIRS specifies the dirs which contain images that are included in the
     documentation. Dirs can be relative to the current source dir.

     EXAMPLE_DIRS specifies the dirs which contain examples that are included in
     the documentation. Dirs can be relative to the current source dir.

     QCH_INSTALL_DESTINATION  specifies where the generated QCH file will be in-
     stalled.

     TAGFILE_INSTALL_DESTINATION specifies where the generated tag file will  be
     installed.

     COMPONENT	specifies the installation component name with which the install
     rules for the generated QCH file and tag file are associated.

     NAMESPACE can be used to set a custom namespace <namespace> of  the  gener-
     ated QCH file. The namepspace is used as the unique id by QHelpEngine (cmp.
     https://doc.qt.io/qt-5/qthelpproject.html#namespace).   The  default  name-
     space is <domain>.<name>.	Needs to be used when ORG_DOMAIN is not used.

     ORG_DOMAIN can be used to define the organization domain prefix for the de-
     fault namespace of the generated QCH file.  Needs to be used when NAMESPACE
     is not used.

     LINK_QCHS specifies a list of other QCH targets which should  be  used  for
     creating  references  to  API  documentation of code in external libraries.
     For each target <qch> in the list these target properties are  expected  to
     be  defined:  DOXYGEN_TAGFILE, QHP_NAMESPACE and QHP_VIRTUALFOLDER.  If any
     of these is not existing, <qch> will be ignored.	Use  the  macro  ecm_in-
     stall_qch_export  for  exporting  a  target  with these properties with the
     CMake config of a library.  Any target <qch> can also be one created before
     in the same buildsystem by another call of ecm_add_qch.

     PREDEFINED_MACROS specifies a list of C/C++ macros which should be  handled
     as  given by the API dox generation tool.	Examples are macros only defined
     in generated files, so whose definition might be not available to the tool.

     BLANK_MACROS specifies a list of C/C++ macro names which should be  ignored
     by  the  API  dox	generation  tool and handled as if they resolve to empty
     strings.  Examples are export macros only defined in  generated  files,  so
     whose definition might be not available to the tool.

     CONFIG_TEMPLATE  specifies a custom cmake template file for the config file
     that is created to control the execution of the API  dox  generation  tool.
     The  following CMake variables need to be used: - ECM_QCH_DOXYGEN_QHELPGEN-
     ERATOR_EXECUTABLE - ECM_QCH_DOXYGEN_FILEPATH,  ECM_QCH_DOXYGEN_TAGFILE  The
     following	CMake  variables  can  be  used: - ECM_QCH_DOXYGEN_PROJECTNAME -
     ECM_QCH_DOXYGEN_PROJECTVERSION    -     ECM_QCH_DOXYGEN_VIRTUALFOLDER     -
     ECM_QCH_DOXYGEN_FULLNAMESPACE  -  ECM_QCH_DOXYGEN_TAGFILES  - ECM_QCH_DOXY-
     GEN_WARN_LOGFILE - ECM_QCH_DOXYGEN_QUIET There is	no  guarantue  that  the
     other  CMake  variables  currently used in the default config file template
     will also be present with the same semantics in  future  versions	of  this
     macro.

     VERBOSE  tells the API dox generation tool to be more verbose about its ac-
     tivity.

     The default config file for the API dox generation tool, so  the  one  when
     not  using  CONFIG_TEMPLATE,  allows  code  to  handle  the  case	of being
     processed by the tool by defining the C/C++  preprocessor	macro  K_DOXYGEN
     when  run	(since	v5.67.0). For backward-compatibility also the definition
     DOXYGEN_SHOULD_SKIP_THIS is set, but its usage is deprecated.

     Example usage:

	ecm_add_qch(
	    MyLib_QCH
	    NAME MyLib
	    VERSION "0.42.0"
	    ORG_DOMAIN org.myorg
	    SOURCE_DIRS
		src
	    LINK_QCHS
		Qt5Core_QCH
		Qt5Xml_QCH
		Qt5Gui_QCH
		Qt5Widgets_QCH
	    BLANK_MACROS
		MyLib_EXPORT
		MyLib_DEPRECATED
	    TAGFILE_INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/share/docs/tags
	    QCH_INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/share/docs/qch
	    COMPONENT Devel
	)

     Example usage (with two QCH files, second linking first):

	ecm_add_qch(
	    MyLib_QCH
	    NAME MyLib
	    VERSION ${MyLib_VERSION}
	    ORG_DOMAIN org.myorg
	    SOURCES ${MyLib_PUBLIC_HEADERS}
	    MD_MAINPAGE src/mylib/README.md
	    LINK_QCHS Qt5Core_QCH
	    TAGFILE_INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/share/docs/tags
	    QCH_INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/share/docs/qch
	    COMPONENT Devel
	)
	ecm_add_qch(
	    MyOtherLib_QCH
	    NAME MyOtherLib
	    VERSION ${MyOtherLib_VERSION}
	    ORG_DOMAIN org.myorg
	    SOURCES ${MyOtherLib_PUBLIC_HEADERS}
	    MD_MAINPAGE src/myotherlib/README.md
	    LINK_QCHS Qt5Core_QCH MyLib_QCH
	    TAGFILE_INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/share/docs/tags
	    QCH_INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/share/docs/qch
	    COMPONENT Devel
	)

	ecm_install_qch_export(
	    TARGETS [<name> [<name2> [...]]]
	    FILE <file>
	    DESTINATION <dest>
	    [COMPONENT <component>]
	)

     This macro creates and installs a CMake file <file> which exports the given
     QCH targets <name> etc., so they can be picked up by CMake-based builds  of
     other  software  that also generate QCH files (using ecm_add_qch) and which
     should include links to the QCH files created by the  given  targets.   The
     installed	CMake file <file> is expected to be included by the CMake config
     file created for the software the related QCH files are documenting.

     TARGETS specifies the QCH targets which should be	exported.  If  a  target
     does  not	exist  or does not have all needed properties, a warning will be
     generated and the target skipped.	This behaviour might  change  in  future
     versions to result in a fail instead.

     FILE  specifies the name of the created CMake file, typically with a .cmake
     extension.

     DESTINATION specifies the directory on disk to which the file will  be  in-
     stalled. It usually is the same as the one where the CMake config files for
     this software are installed.

     COMPONENT	specifies the installation component name with which the install
     rule is associated.

     Example usage:

	ecm_install_qch_export(
	    TARGETS MyLib_QCH
	    FILE MyLibQCHTargets.cmake
	    DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/MyLib"
	    COMPONENT Devel
	)

     Since 5.36.0.

   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 respec-
     tive <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 in-
     stalled.

     OUTPUT_NAME specifies the name of the plugin binary. The default is  a<tar-
     get_name>a.

     DEFAULT_GROUP  specifies the default group in Qt Designer where the widgets
     will be placed. The default is aCustoma.

     DEFAULT_HEADER_CASE specifies how the name of the header  is  derived  from
     the widget class name.  The default is aLOWER_CASEa.

     DEFAULT_HEADER_EXTENSION specifies what file name extension is used for the
     header file derived from the class name.  The default is aha.

     DEFAULT_ICON_DIR  specifies what file name extension is used for the header
     file derived from the class name.	The default is apicsa.

     INCLUDE_FILES specifies additional include files to include with the gener-
     ated 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  wid-
     gets.

     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 a<widgetid>a.

     INCLUDE_FILE  specifies  the include file to use for the class of this wid-
     get. The default is derived from <class_name>  as	configured  by	the  DE-
     FAULT_HEADER_*  options  of  ecm_add_qtdesignerplugin,  also  replacing any
     namespace separators with a/a.

     CONTAINER specifies, if set, that this widget is a container for other wid-
     gets.

     ICON specifies the icon file to use as symbol for this widget.  The default
     is a{lowercased <class_name>}.pnga 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
     a<class_name> Widgeta.

     WHATSTHIS	specifies the Whatas-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_qt-
     designerplugin.

     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 areturn new <impl_class_name><constructor_args_code>;a.

     INITIALIZE_CODE_FROM_VARIABLE  specifies  the  variable to get from the C++
     code to use with the override  of	QDesignerCustomWidgetInterface::initial-
     ize(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 wid-
     get instance with Qt Designer. The default is a<class_name>a.

     CONSTRUCTOR_ARGS_CODE specifies the C++ code to use for the constructor ar-
     guments with the default of CREATE_WIDGET_CODE_FROM_VARIABLE. Note that the
     parentheses are required. The default is a(parent)a.

     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 a;a chars.

     Example usage:

	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.

   ECMAddTests
     Convenience functions for adding tests.

	ecm_add_tests(<sources>
	    [COMPILE_DEFINITIONS <definition> [<definition> [...]]] # Since 6.13.0
	    [ENVIRONMENT <list>]  # Since 6.13.0
	    LINK_LIBRARIES <library> [<library> [...]]
	    [NAME_PREFIX <prefix> (| NO_NAME_PREFIX] # Since 6.22.0)
	    [GUI]
	    [TARGET_NAMES_VAR <target_names_var>]
	    [TEST_NAMES_VAR <test_names_var>]
	    [WORKING_DIRECTORY <dir>] #  Since 5.111
	)

     A convenience function for adding multiple tests, each consisting of a sin-
     gle source file. For each file in <sources>, an executable target	is  cre-
     ated (whose name is the base name of the source file) with the compiler de-
     finitions	passed with COMPILE_DEFINITIONS. This will be linked against the
     libraries given with LINK_LIBRARIES. Each executable will	be  added  as  a
     test  with  the  same name and can have an environment provided by ENVIRON-
     MENT.

     If NAME_PREFIX is given, this prefix will be prepended to the  test  names,
     but  not the target names. As a result, it will not prevent clashes between
     tests with the same name in different parts of the project, but it  can  be
     used  to  give  an  indication  of  where	to  look for a failing test.  If
     NAME_PREFIX is not set, it will default to a value depending on the  strat-
     egy  as controlled by the variable ECM_TEST_NAME_PREFIX_STRATEGY, if set in
     the current scope and NO_NAME_PREFIX is not set (since 6.22).

     If the flag GUI is passed the test binaries will be GUI executables, other-
     wise the resulting binaries will be console applications (regardless of the
     value of CMAKE_WIN32_EXECUTABLE or CMAKE_MACOSX_BUNDLE). Be aware that this
     changes the executable entry point on Windows  (although  some  frameworks,
     such as Qt, abstract this difference away).

     The tests will be build with -DQT_FORCE_ASSERTS to enable assertions in the
     test executable even for release builds.

     The TARGET_NAMES_VAR and TEST_NAMES_VAR arguments, if given, should specify
     a variable name to receive the list of generated target and test names, re-
     spectively.  This	makes  it  convenient  to  apply properties to them as a
     whole, for example,  using  set_target_properties()  or   set_tests_proper-
     ties().

     The    generated	 target   executables	will   have   the   effects   of
     ecm_mark_as_test() (from the ECMMarkAsTest module) applied to it.

     WORKING_DIRECTORY sets the test property WORKING_DIRECTORY in which to exe-
     cute the test. By default the  test  will	be  run  in  ${CMAKE_CURRENT_BI-
     NARY_DIR}.  The  working directory can be specified using generator expres-
     sions. Since 5.111.

	ecm_add_test(
	    <sources>
	    [COMPILE_DEFINITIONS <definition> [<definition> [...]]] # Since 6.13.0
	    [ENVIRONMENT <list>]  # Since 6.13.0
	    LINK_LIBRARIES <library> [<library> [...]]
	    [TEST_NAME <name>]
	    [NAME_PREFIX <prefix> (| NO_NAME_PREFIX] # Since 6.22.0)
	    [GUI]
	    [TARGET_NAME_VAR <target_name_var>]
	    [TEST_NAME_VAR <test_name_var>]
	    [WORKING_DIRECTORY <dir>] #  Since 5.111
	)

     This is a single-test form of ecm_add_tests  that	allows	multiple  source
     files  to	be  used  for  a  single  test.  If using multiple source files,
     TEST_NAME must be given; this will be used for both  the  target  and  test
     names.

     As  with ecm_add_tests(), the NAME_PREFIX argument will be prepended to the
     test name.  If NAME_PREFIX is not set, it will default to a value depending
     on the strategy as controlled by the  variable  ECM_TEST_NAME_PREFIX_STRAT-
     EGY,  if  set  in	the  current  scope and NO_NAME_PREFIX is not set (since
     6.22).

     The TARGET_NAME_VAR and TEST_NAME_VAR arguments, if given, should specify a
     variable name to receive the generated target and test name,  respectively.
     This  makes it convenient to apply properties to them as a whole, for exam-
     ple, using set_target_properties() or  set_tests_properties().

     WORKING_DIRECTORY sets the test property WORKING_DIRECTORY in which to exe-
     cute the test. By default the  test  will	be  run  in  ${CMAKE_CURRENT_BI-
     NARY_DIR}.  The  working directory can be specified using generator expres-
     sions. Since 5.111.

	ecm_test_set_dir_properties( # Since 6.22.0
	    [DIR <dir>]
	    [PREFIX_NAME <name>]
	    [PREFIX_NAME_IGNORE | PREFIX_NAME_NOT_IGNORE]
	    [FIRST_PREFIX_NAME]
	    [LAST_PREFIX_NAME]
	)

     The function can be used to set properties to individual directories to in-
     fluence the behaviour of the test functions. The properties will be set  to
     the  current  source  directory. For source directories which themselves do
     not  have	a  CMakeLists.txt  file  and  thus  are  not  added  by  any   -
     add_subdirectory()  calls,  the DIR argument can be used to instead set the
     property to any such subdirectory <dir>.

     PREFIX_NAME can be used to override by <name> the	name  derived  from  the
     given directory.

     PREFIX_NAME_IGNORE  or  PREFIX_NAME_NOT_IGNORE  can be used to override the
     filtering done by ECM_TEST_NAME_PREFIX_IGNORE_DIRS  for  the  name  of  the
     given directory.

     FIRST_PREFIX_NAME	and  LAST_PREFIX_NAME  can be used to limit the range of
     directories in the path used for deriving the prefix name.

	ecm_test_get_name_prefix( # Since 6.22.0
	    <name_prefix_var>
	)

     The name_prefix_var argument should specify a variable name to receive  the
     default  test  prefix  name  for  the  current scope, based on the value of
     ECM_TEST_NAME_PREFIX_STRATEGY and the respective further setup.

	ECM_TEST_NAME_PREFIX_STRATEGY # Since 6.22.0

     This variable is specifying the strategy to use when estimating the default
     test name prefix to use by the macros  ecm_add_tests()  and  ecm_add_test()
     when no explicit NAME_PREFIX argument is passed. The supported values are:

	* VARIABLE: The default name prefix is taken from the value of the vari-
	  able ECM_TEST_NAME_PREFIX in the scope where the macros are called.

	* PATH: The default name prefix is derived from the relative path of the
	  current source directory where the macros are called, by replacing the
	  dir  separators  with  a-a.  See also ECM_TEST_NAME_PREFIX_IGNORE_DIRS
	  for skipping some directory names.

     When unset, the VARIABLE strategy is used.

	ECM_TEST_NAME_PREFIX # Since 6.22.0

     When ECM_TEST_NAME_PREFIX_STRATEGY is set to VARIABLE, the current value of
     the variable is used as default for the test name prefix.

	ECM_TEST_NAME_PREFIX_IGNORE_DIRS # Since 6.22.0

     When ECM_TEST_NAME_PREFIX_STRATEGY is set to PATH, this variable is used to
     filter out directory names in the relative path of the current  source  di-
     rectory  when  deriving  the name prefix. By default the variable is set to
     asrca, atesta, atestsa, aautotesta, aautotestsa when including  the  ECMAd-
     dTest module, if not already defined.

     Example usage:

	set(ECM_TEST_NAME_PREFIX_STRATEGY "PATH")
	list(APPEND ECM_TEST_NAME_PREFIX_IGNORE_DIRS "plugins")

	# Being in subdir "src/plugins/foo" this test will get
	# the test name prefix set to "foo-", next to base name "mytest":
	ecm_add_test(
	    mytest.cpp
	    LINK_LIBRARIES mylib
	)

     Since pre-1.0.0.

   ECMCheckOutboundLicense
     Assert that source file licenses are compatible with a desired outbound li-
     cense of a compiled binary artifact (e.g., library, plugin or application).

     This module provides the ecm_check_outbound_license function that generates
     unit  tests  for checking the compatibility of license statements.  The li-
     cense statements in all tested files are required to be added by using  the
     SPDX marker SPDX-License-Identifier.

     During  the CMake configuration of the project, a temporary license bill of
     materials (BOM) in SPDX format is generated by calling the REUSE tool  (see
     <https://reuse.software>).  That  BOM  is	parsed	and license computations
     based on an internal compatibility matrix are performed.

     Preconditions for using this module:

	    * All tested input source files must contain the  SPDX-License-Iden-
	      tifier tag.

	    * Python3 must be available.

	    * The  REUSE tool must be available, which generates the bill-of-ma-
	      terials by running reuse spdx on the tested directory.

     When this module is included, a SKIP_LICENSE_TESTS option is added (default
     OFF). Turning this option on skips the generation of license  tests,  which
     might be convenient if licenses shall not be tested in all build configura-
     tions.

	ecm_check_outbound_license(LICENSES <outbound-licenses>
				   FILES <source-files>
				   [TEST_NAME <name>]
				   [WILL_FAIL])

     This  method  adds  a custom unit test to ensure the specified outbound li-
     cense to be compatible with the specified license headers. Note that a con-
     venient way is to use the CMake GLOB argument of the FILE function.

     LICENSES (List of one or multiple outbound license regarding which the com-
     patibility of the source code files shall be tested.)

	    Currently, the following values are supported (values are SPDX reg-
	    istry identifiers):

		   * MIT

		   * BSD-2-Clause

		   * BSD-3-Clause

		   * LGPL-2.0-only

		   * LGPL-2.1-only

		   * LGPL-3.0-only

		   * GPL-2.0-only

		   * GPL-3.0-only

     FILES: (List of source files that contain valid SPDX-License-Identifier
     markers.)
	    The paths can be relative to the CMake file that generates the  test
	    case or be absolute paths.

     TEST_NAME (Optional parameter that defines the name of the generated test
     case.)
	    If	no name is defined, the relative path to the test directory with
	    appended license name is used. Every test has licensecheck_ as  pre-
	    fix.

     WILL_FAIL (Optional parameter that inverts the test result. This parameter
     is usually only)
	    used for tests of the module.

     Since 5.75.0

   ECMConfiguredInstall
     Takes  a list of files, runs configure_file on each and installs the resul-
     tant configured files in the given location.

     Any suffix of a.ina in the passed file names will be stripped from the file
     name at the installed location.

	ecm_install_configured_files(
	    INPUT <file> [<file2> [...]]
	    DESTINATION <INSTALL_DIRECTORY>
	    [COPYONLY]
	    [ESCAPE_QUOTES]
	    [@ONLY]
	    [COMPONENT <component>])

     Example usage:

	ecm_install_configured_files(INPUT foo.txt.in DESTINATION ${KDE_INSTALL_DATADIR} @ONLY)

     This will install the file as foo.txt with any cmake variable  replacements
     made into the data directory.

     Since 5.73.0.

   ECMCoverageOption
     Allow users to easily enable GCov code coverage support.

     Code  coverage  allows you to check how much of your codebase is covered by
     your tests. This module makes it easy to build with support for GCov.

     When this module is included, a BUILD_COVERAGE  option  is  added	(default
     OFF).  Turning  this  option on enables GCCas coverage instrumentation, and
     links against libgcov.

     NOTE:
	This will probably break the build if you are not using GCC.

     Since 1.3.0.

   ECMCreateQmFromPoFiles
     WARNING:
	This  module  is  deprecated  and  will  be  removed  by  ECM  1.0.  Use
	ECMPoQmTools instead.

     Generate QTranslator (.qm) catalogs from Gettext (.po) catalogs.

	ecm_create_qm_from_po_files(PO_FILES <file1>... <fileN>
				    [CATALOG_NAME <catalog_name>]
				    [INSTALL_DESTINATION <install_destination>])

     Creates  the  necessary  rules to compile .po files into .qm files, and in-
     stall them.

     The .qm files are	installed  in  <install_destination>/<lang>/LC_MESSAGES,
     where  <install_destination> is the INSTALL_DESTINATION argument and <lang>
     is extracted from the aLanguagea field inside the .po file.

     INSTALL_DESTINATION defaults to ${LOCALE_INSTALL_DIR} if defined, otherwise
     it uses ${CMAKE_INSTALL_LOCALEDIR} if that is defined,  otherwise	it  uses
     share/locale.

     CATALOG_NAME defines the name of the installed .qm files. If set, .qm files
     will  be installed as <catalog_name>.qm. If not set .qm files will be named
     after the name of their source .po file.

     Setting the catalog name is useful when all .po files for a target are kept
     in a single source directory. For example, the amyliba probject might  keep
     all its translations in a apoa directory, like this:

	po/
	    es.po
	    fr.po

     Without  setting  CATALOG_NAME,  those  .po will be turned into .qm and in-
     stalled as:

	share/locale/fr/LC_MESSAGES/fr.qm
	share/locale/es/LC_MESSAGES/es.qm

     If CATALOG_NAME is set to amyliba, they will be installed as:

	share/locale/fr/LC_MESSAGES/mylib.qm
	share/locale/es/LC_MESSAGES/mylib.qm

     Which is what the loader created by ecm_create_qm_loader() expects.

     ecm_create_qm_from_po_files() creates a atranslationa target.  This  target
     builds all .po files into .qm files.

	ecm_create_qm_loader(<source_files_var> <catalog_name>)

     ecm_create_qm_loader()  generates a C++ file which ensures translations are
     automatically loaded at startup. The path of the .cpp file is  appended  to
     <source_files_var>.  Typical usage is like:

	set(mylib_SRCS foo.cpp bar.cpp)
	ecm_create_qm_loader(mylib_SRCS mylib)
	add_library(mylib ${mylib_SRCS})

     This  generates  a  C++ file which loads amylib.qma at startup, assuming it
     has been installed by ecm_create_qm_from_po_files(), and compiles	it  into
     mylib.

     Since pre-1.0.0.

   ECMDeprecationSettings
     This  module  provides  the  ecm_set_disabled_deprecation_versions function
     setting the excluding deprecated API for Qt and KF projects.

     This method expects pairs of the identifier and deprecation  version.   For
     the  identifier  QT  this	functions  adds the definition QT_DISABLE_DEPRE-
     CATED_BEFORE with the given version in a hexadecimal format.  Otherwise the
     name for the definition  is  generated  using  ${IDENTIFIER}_DISABLE_DEPRE-
     CATED_BEFORE_AND_AT,   following  the  naming  of	the  generated	code  in
     ECMGenerateExportHeader.  The version for the definition can  be  overwrit-
     ten, by passing definition name and the deprecation version as a CMake def-
     inition. This allows one to exclude deprecations without having to edit the
     CMakeLists.txt file.

     This module provides the following function:

	ecm_set_disabled_deprecation_versions(
	    [DISABLE_NEWER_WARNINGS] # since 5.96
	    [<identifier> <deprecation_version>]
	    [<identifier2> <deprecation_version2>]
	)

     DISABLE_NEWER_WARNINGS  disables additionally the compiler warnings for API
     deprecated in newer versions of the same major version.

     Example usage:

	set(QT_MIN_VERSION "5.15.2")
	set(KF5_MIN_VERSION "5.90")

	ecm_set_disabled_deprecation_versions(
	  QT ${QT_MIN_VERSION}
	  KF ${KF5_MIN_VERSION}
	  KCOREADDONS 5.89.0 # In case we depend on deprecated KCoreAddons API
	)

     Since 5.91

   ECMEnableSanitizers
     Enable compiler sanitizer flags.

     The following sanitizers are supported:

     * Address Sanitizer

     * Memory Sanitizer

     * Thread Sanitizer

     * Leak Sanitizer

     * Undefined Behaviour Sanitizer

     * Realtime Sanitizer

     All of them are implemented in Clang, depending on your version, and  there
     is  an  work  in  progress  in GCC, where some of them are currently imple-
     mented.

     This module will check your current compiler version to see if it	supports
     the sanitizers that you want to enable

   Usage
     Simply add:

	include(ECMEnableSanitizers)

     to   your	 CMakeLists.txt.   Note   that	 this	module	is  included  in
     KDECompilerSettings, so projects using that module do not need to also  in-
     clude this one.

     The  sanitizers  are  not enabled by default. Instead, you must set ECM_EN-
     ABLE_SANITIZERS (either in your CMakeLists.txt or on the command line) to a
     semicolon-separated list of sanitizers you wish  to  enable.   The  options
     are:

     * address

     * memory

     * thread

     * leak

     * undefined

     * fuzzer

     * realtime

     The  sanitizers  aaddressa,  amemorya, athreada and arealtimea are mutually
     exclusive.  You cannot enable two of them in the same build.

     aleaka requires the  aaddressa sanitizer.

     NOTE:
	To reduce the overhead induced by the instrumentation of the sanitizers,
	it is advised to enable compiler optimizations (-O1 or higher).

   Example
     This is an example of usage:

	mkdir build
	cd build
	cmake -DECM_ENABLE_SANITIZERS='address;leak;undefined' ..

     NOTE:
	Most of the sanitizers will require Clang. To enable it, use:

	    -DCMAKE_CXX_COMPILER=clang++

     Since 1.3.0.

   ECMFeatureSummary
     Call feature_summary(), except when being called from a subdirectory.  This
     ensures that frameworks being used as submodules  by  third-party	applica-
     tions do not call feature_summary(), so that it doesnat end up being called
     multiple times in the same cmake run.

	include(ECMFeatureSummary)
	ecm_feature_summary([... see feature_summary documentation ...])

     Example:

	find_package(ECM REQUIRED)
	include(ECMFeatureSummary)
	ecm_feature_summary(WHAT ALL   FATAL_ON_MISSING_REQUIRED_PACKAGES)

     Since 5.247

   ECMFindModuleHelpers
     Helper   macros   for   find   modules:   ecm_find_package_version_check(),
     ecm_find_package_parse_components()     and     ecm_find_package_handle_li-
     brary_components().

	ecm_find_package_version_check(<name>)

     Prints  warnings  if the CMake version or the projectas required CMake ver-
     sion is older than that required by extra-cmake-modules.

	ecm_find_package_parse_components(<name>
	    RESULT_VAR <variable>
	    KNOWN_COMPONENTS <component1> [<component2> [...]]
	    [SKIP_DEPENDENCY_HANDLING])

     This macro will populate <variable> with a  list  of  components  found  in
     <name>_FIND_COMPONENTS, after checking that all those components are in the
     list  of  KNOWN_COMPONENTS;  if  there  are any unknown components, it will
     print an error or warning (depending on the value of  <name>_FIND_REQUIRED)
     and call return().

     The order of components in <variable> is guaranteed to match the order they
     are listed in the KNOWN_COMPONENTS argument.

     If  SKIP_DEPENDENCY_HANDLING  is  not  set, for each component the variable
     <name>_<component>_component_deps will be checked for dependent components.
     If <component> is listed in <name>_FIND_COMPONENTS, then all  its	(transi-
     tive) dependencies will also be added to <variable>.

	ecm_find_package_handle_library_components(<name>
	    COMPONENTS <component> [<component> [...]]
	    [SKIP_DEPENDENCY_HANDLING])
	    [SKIP_PKG_CONFIG])

     Creates  an  imported  library target for each component.	The operation of
     this macro depends on the presence of a number of CMake variables.

     The <name>_<component>_lib variable should contain the  name  of  this  li-
     brary,  and <name>_<component>_header variable should contain the name of a
     header file associated with it (whatever relative path is	normally  passed
     to  a#includea).  <name>_<component>_header_subdir  variable can be used to
     specify which subdirectory of the include path the headers  will  be  found
     in.  ecm_find_package_components() will then search for the library and in-
     clude  directory  (creating  appropriate cache variables) and create an im-
     ported library target named <name>::<component>.

     Additional variables can be used to provide additional information:

     If SKIP_PKG_CONFIG, the <name>_<component>_pkg_config variable is set,  and
     pkg-config   is  found,  the  pkg-config  module  given  by  <name>_<compo-
     nent>_pkg_config will be searched for and used to help locate  the  library
     and header file.  It will also be used to set <name>_<component>_VERSION.

     Note  that  if  version information is found via pkg-config, <name>_<compo-
     nent>_FIND_VERSION can be set to require a particular version for each com-
     ponent.

     If SKIP_DEPENDENCY_HANDLING is not set, the INTERFACE_LINK_LIBRARIES  prop-
     erty  of the imported target for <component> will be set to contain the im-
     ported targets  for  the  components  listed  in  <name>_<component>_compo-
     nent_deps.   <component>_FOUND will also be set to FALSE if any of the com-
     ponents in <name>_<component>_component_deps are not found.  This	requires
     the  components  in  <name>_<component>_component_deps  to be listed before
     <component> in the COMPONENTS argument.

     The following variables will be set:

     <name>_TARGETS
	    the imported targets

     <name>_LIBRARIES
	    the found libraries

     <name>_INCLUDE_DIRS
	    the combined required include directories for the components

     <name>_DEFINITIONS
	    the aothera CFLAGS provided by pkg-config, if any

     <name>_VERSION
	    the value of <name>_<component>_VERSION for the first component that
	    has this variable set (note that components are searched for in  the
	    order  they are passed to the macro), although if it is already set,
	    it will not be altered

     NOTE:
	These variables are never  cleared,  so  if  ecm_find_package_handle_li-
	brary_components()  is	called	multiple times with different components
	(typically because of multiple find_package()  calls)  then  <name>_TAR-
	GETS,  for  example, will contain all the targets found in any call (al-
	though no duplicates).

     Since pre-1.0.0.

   ECMFindQmlModule
     Finds QML import modules to set them as dependencies.

     Because QML modules are not hard compile time  requirements,  they  can  be
     easy  to miss by packagers and developers, causing suboptimal build results
     or runtime issues.  Use this CMake module to ensure a  QML  module  is  in-
     stalled at compile time during CMake configuration.

     Internally,  this	CMake  module  looks for the qmldir and, if needed, uses
     qmlplugindump to find the plugins and set them up as dependencies.

	ecm_find_qmlmodule(<module_name>
	  <version> # Optional for Qt6 builds
	  [REQUIRED] # Since 6.0
	)

     Usage example:

	ecm_find_qmlmodule(org.kde.kirigami 2.1)
	ecm_find_qmlmodule(org.kde.kirigami 2.1 REQUIRED) # CMake will fail if the required version is not found
	ecm_find_qmlmodule(org.kde.kirigami) # Find it without a given version
	ecm_find_qmlmodule(org.kde.kirigami REQUIRED) # CMake will fail if it is not found

     Since 5.38.0.

   ECMGenerateDBusServiceFile
     This module provides the ecm_generate_dbus_service_file function for gener-
     ating and installing a D-Bus service file.

	ecm_generate_dbus_service_file(
	    NAME <service name>
	    EXECUTABLE <executable>
	    [SYSTEMD_SERVICE <systemd service>]
	    DESTINATION <install_path>
	    [RENAME <dbus service filename>] # Since 5.75
	)

     A D-Bus service file <service name>.service will be generated and installed
     in the relevant D-Bus config location. This filename can be customized with
     RENAME.

     <executable> must be an absolute path to the installed service  executable.
     When  using it with KDEInstallDirs it needs to be the _FULL_ variant of the
     path variable.

     NOTE:
	On Windows, the macro will only use the file name part	of  <executable>
	since  D-Bus  service executables are to be installed in the same direc-
	tory as the D-Bus daemon.

     Optionally, a <systemd service> can be specified to launch the  correspond-
     ing  systemd  service  instead  of  the <executable> if the D-Bus daemon is
     started by systemd.

     Example usage:

	ecm_generate_dbus_service_file(
	    NAME org.kde.kded5
	    EXECUTABLE ${KDE_INSTALL_FULL_BINDIR}/kded5
	    DESTINATION ${KDE_INSTALL_DBUSSERVICEDIR}
	)

	ecm_generate_dbus_service_file(
	    NAME org.kde.kded5
	    EXECUTABLE ${KDE_INSTALL_FULL_BINDIR}/kded5
	    SYSTEMD_SERVICE plasma-kded.service
	    DESTINATION ${KDE_INSTALL_DBUSSERVICEDIR}
	    RENAME org.kde.daemon.service
	)

     Since 5.73.0.

   ECMGenerateExportHeader
     This module provides the ecm_generate_export_header function for generating
     export macros for libraries with version-based control over  visibility  of
     and  compiler  warnings for deprecated API for the library user, as well as
     over excluding deprecated API and their implementation  when  building  the
     library itself.

     For preparing some values useful in the context it also provides a function
     ecm_export_header_format_version.

	ecm_generate_export_header(<library_target_name>
	    VERSION <version>
	    [BASE_NAME <base_name>]
	    [GROUP_BASE_NAME <group_base_name>]
	    [EXPORT_MACRO_NAME <export_macro_name>]
	    [EXPORT_FILE_NAME <export_file_name>]
	    [DEPRECATED_MACRO_NAME <deprecated_macro_name>]
	    [NO_EXPORT_MACRO_NAME <no_export_macro_name>]
	    [INCLUDE_GUARD_NAME <include_guard_name>]
	    [STATIC_DEFINE <static_define>]
	    [PREFIX_NAME <prefix_name>]
	    [DEPRECATED_BASE_VERSION <deprecated_base_version>]
	    [DEPRECATION_VERSIONS <deprecation_version> [<deprecation_version2> [...]]]
	    [EXCLUDE_DEPRECATED_BEFORE_AND_AT <exclude_deprecated_before_and_at_version>]
	    [DEPRECATED_ATTRIBUTE_TYPE <attribute_type>] #  Since 6.28
	    [NO_BUILD_SET_DEPRECATED_WARNINGS_SINCE]
	    [NO_DEFINITION_EXPORT_TO_BUILD_INTERFACE]
	    [USE_VERSION_HEADER [<version_file_name>]] #  Since 5.106
	    [VERSION_BASE_NAME <version_base_name>] #  Since 5.106
	    [VERSION_MACRO_NAME <version_macro_name>] #  Since 5.106
	    [CUSTOM_CONTENT_FROM_VARIABLE <variable>]
	)

     VERSION  specifies  the  version  of the library, given in the format a<ma-
     jor>.<minor>.<patchlevel>a.

     GROUP_BASE_NAME specifies the name to use for the macros  defining  library
     group   default   values.	If  set,  this	will  generate	code  supporting
     <group_base_name>_NO_DEPRECATED_WARNINGS,	<group_base_name>_DISABLE_DEPRE-
     CATED_BEFORE_AND_AT,    <group_base_name>_DEPRECATED_WARNINGS_SINCE     and
     <group_base_name>_NO_DEPRECATED (see below).  If  not  set,  the  generated
     code will ignore any such macros.

     DEPRECATED_BASE_VERSION  specifies  the default version before and at which
     deprecated API is disabled. Possible values are a0a, aCURRENTa  (which  re-
     solves  to  <version>)  and  a  version  string in the format a<major>.<mi-
     nor>.<patchlevel>a. The default is the  value  of	a<exclude_deprecated_be-
     fore_and_at_version>a  if	set,  or  a<major>.0.0a, with <major> taken from
     <version>.

     DEPRECATION_VERSIONS specifies  versions  in  a<major>.<minor>a  format  in
     which  API  was  declared	deprecated.  Any version used with the generated
     macro <prefix_name><base_name>_DEPRECATED_VERSION(major,  minor,  text)  or
     <prefix_name><base_name>_DEPRECATED_VERSION_BELATED(major,  minor,  textma-
     jor, textminor, text) needs to be listed here,  otherwise	the  macro  will
     fail to work.

     EXCLUDE_DEPRECATED_BEFORE_AND_AT  specifies  the  version for which all API
     deprecated before and at should be  excluded  from  the  build  completely.
     Possible  values are a0a (default), aCURRENTa (which resolves to <version>)
     and a version string in the format a<major>.<minor>.<patchlevel>a.

     DEPRECATED_ATTRIBUTE_TYPE specifies the type of attribute	to  use  in  the
     generated macros. Options are aSTANDARDa (default when the minimum required
     version of ECM is 6.28 or newer) or aCOMPILERa (default otherwise, legacy).
     aSTANDARDa  will  result  in the use of the C++ standard attribute [[depre-
     cated("text")]], where-as aCOMPILERa will use the	pre-C++14  compiler-spe-
     cific  annotations  like  __attribute__ ((__deprecated__("text"))) or __de-
     clspec(deprecated("text")), if available.	Since 6.28.

     WARNING:
	The compiler-specific annotation attributes can be placed more freely in
	the signatures of declarations, the C++ standard  [[deprecated("text")]]
	ones  are  restrained  to the standard locations for attributes. So when
	switching from aCOMPILERa to aSTANDARDa it needs to be ensured all  used
	deprecation  macros are only at locations where attributes are possible.
	Also note that with aSTANDARDa the special enumerator macros (see below)
	will not be available, as usually the normal deprecation  macro  can  be
	used.

     NO_BUILD_SET_DEPRECATED_WARNINGS_SINCE  specifies that the definition <pre-
     fix_name><uppercase_base_name>_DEPRECATED_WARNINGS_SINCE will  not  be  set
     for  the  library	inside its own build, and thus will be defined by either
     explicit definition in the build system configuration  or	by  the  default
     value  mechanism (see below).  The default is that it is set for the build,
     to the version specified by EXCLUDE_DEPRECATED_BEFORE_AND_AT, so no  depre-
     cation warnings are done for any own deprecated API used in the library im-
     plementation itself.

     NO_DEFINITION_EXPORT_TO_BUILD_INTERFACE specifies that the definition <pre-
     fix_name><uppercase_base_name>_DISABLE_DEPRECATED_BEFORE_AND_AT will not be
     set  in  the  public interface of the library inside its own build, and the
     same for the definition <prefix_name><uppercase_base_name>_DEPRECATED_WARN-
     INGS_SINCE (if not disabled by  NO_BUILD_SET_DEPRECATED_WARNINGS_SINCE  al-
     ready).   The default is that they are set, to the version specified by EX-
     CLUDE_DEPRECATED_BEFORE_AND_AT, so e.g.  test  and  examples  part  of  the
     project  automatically build against the full API included in the build and
     without any deprecation warnings for it.

     USE_VERSION_HEADER defines whether a given header file  <version_file_name>
     providing	macros	specifying the library version should be included in the
     generated header file. By default angle-brackets are used for  the  include
     statement.  To  generate  includes with double quotes, add double quotes to
     the argument string (needs escaping), e.g. \"version.h\".	The  macro  from
     the  included  version header holding the library version is given as <ver-
     sion_macro_name> by the argument VERSION_MACRO_NAME and used in the  gener-
     ated  code for calculating defaults. If not specified, the defaults for the
     version  file  name  and  the  version  macro  are   derived   from   <ver-
     sion_base_name>  as  passed with VERSION_BASE_NAME, which again defaults to
     <base_name> or otherwise <library_target_name>.  The macro name defaults to
     <uppercase_version_base_name>_VERSION, the version  file  name  to  <lower-
     case_version_base_name>_version.h.  Since 5.106.

     CUSTOM_CONTENT_FROM_VARIABLE specifies the name of a variable whose content
     will  be appended at the end of the generated file, before any final inclu-
     sion guard closing. Note that before 5.98 this was broken	and  would  only
     append the string passed as argument value.

     The  function ecm_generate_export_header defines C++ preprocessor macros in
     the generated export header, some for use in the sources of the library the
     header is generated for, other for use by projects linking against the  li-
     brary.

     The macros for use in the library C++ sources are these, next to those also
     defined by GenerateExportHeader:

     <prefix_name><uppercase_base_name>_DEPRECATED_VERSION(major, minor, text)
	    to	  use	 to    conditionally	set    a    <prefix_name><upper-
	    case_base_name>_DEPRECATED macro for a  class,  struct  or	function
	    (other  elements  to  be supported in future versions), depending on
	    the visibility macro flags set (see below)

     <prefix_name><uppercase_base_name>_DEPRECATED_VERSION_BELATED(major, minor,
     textmajor, textminor, text)
	    to	  use	 to    conditionally	set    a    <prefix_name><upper-
	    case_base_name>_DEPRECATED	macro  for  a  class, struct or function
	    (other elements to be supported in future  versions),  depending  on
	    the  visibility  macro flags set (see below), with major & minor ap-
	    plied for the logic and textmajor & textminor for the warnings  mes-
	    sage.   Useful for retroactive tagging of API for the compiler with-
	    out injecting the API into the compiler warning  conditions  of  al-
	    ready released versions.  Since 5.71.

     <prefix_name><uppercase_base_name>_ENUMERATOR_DEPRECATED_VERSION(major, mi-
     nor, text)
	    to	  use	 to    conditionally	set    a    <prefix_name><upper-
	    case_base_name>_DEPRECATED macro for an enumerator, depending on the
	    warnings macro flags set (see below). In builds using C++14 standard
	    or earlier, where enumerator attributes are not yet  supported,  the
	    macro  will  always yield an empty string.	With MSVC it is also al-
	    ways an empty string for now.   Not  available  with  DEPRECATED_AT-
	    TRIBUTE_TYPE  set  to aSTANDARDa, there the normal macro can be usu-
	    ally used.	Since 5.82.

     <prefix_name><uppercase_base_name>_ENUMERATOR_DEPRECATED_VERSION_BE-
     LATED(major, minor, textmajor, textminor, text)
	    to	  use	 to    conditionally	set    a    <prefix_name><upper-
	    case_base_name>_DEPRECATED macro for an enumerator, depending on the
	    warnings macro flags set (see below), with major & minor applied for
	    the  logic	and  textmajor & textminor for the warnings message.  In
	    builds using C++14 standard or earlier, where enumerator  attributes
	    are  not yet supported, the macro will always yield an empty string.
	    Useful for retroactive tagging of API for the compiler  without  in-
	    jecting  the API into the compiler warning conditions of already re-
	    leased versions.  With MSVC it is also always an  empty  string  for
	    now.   Not	available  with  DEPRECATED_ATTRIBUTE_TYPE set to aSTAN-
	    DARDa, there the normal macro can be usually used.	Since 5.82.

     <prefix_name><uppercase_base_name>_ENABLE_DEPRECATED_SINCE(major, minor)
	    evaluates to TRUE or FALSE depending on the visibility  macro  flags
	    set  (see below). To be used mainly with #if/#endif to mark sections
	    of code which should be included depending	on  the  visibility  re-
	    quested.

     <prefix_name><uppercase_base_name>_BUILD_DEPRECATED_SINCE(major, minor)
	    evaluates  to TRUE or FALSE depending on the value of EXCLUDE_DEPRE-
	    CATED_BEFORE_AND_AT. To be used mainly with #if/#endif to mark  sec-
	    tions  of  two types of code: implementation code for deprecated API
	    and declaration code of deprecated API which only may be disabled at
	    build time of the library for BC reasons (e.g. virtual methods,  see
	    notes below).

     <prefix_name><uppercase_base_name>_EXCLUDE_DEPRECATED_BEFORE_AND_AT
	    holds  the	version  used to exclude deprecated API at build time of
	    the library.

     The macros used to control visibility when  building  against  the  library
     are:

     <prefix_name><uppercase_base_name>_DISABLE_DEPRECATED_BEFORE_AND_AT
	    definition	to  set to a value in single hex number version notation
	    (0x<major><minor><patchlevel>).

     <prefix_name><uppercase_base_name>_NO_DEPRECATED
	    flag to define to disable all deprecated API, being a  shortcut  for
	    settings   <prefix_name><uppercase_base_name>_DISABLE_DEPRECATED_BE-
	    FORE_AND_AT to the current version. If both are set, this flag over-
	    rules.

     <prefix_name><uppercase_base_name>_DEPRECATED_WARNINGS_SINCE
	    definition to set to a value in single hex number  version	notation
	    (0x<major><minor><patchlevel>).  Warnings will be only activated for
	    API deprecated up to and including the version. If <prefix_name><up-
	    percase_base_name>_DISABLE_DEPRECATED_BEFORE_AND_AT is set (directly
	    or via the group default), it will default to that version,  result-
	    ing  in  no  warnings. Otherwise the default is the current version,
	    resulting in warnings for all deprecated API.

     <prefix_name><uppercase_base_name>_NO_DEPRECATED_WARNINGS
	    flag to define to disable all deprecation warnings, being a shortcut
	    for   setting    <prefix_name><uppercase_base_name>_DEPRECATED_WARN-
	    INGS_SINCE to a0a. If both are set, this flag overrules.

     When  the GROUP_BASE_NAME has been used, the same macros but with the given
     <group_base_name> prefix are available to	define	the  defaults  of  these
     macros, if not explicitly set.

     WARNING:
	The  tricks  applied here for hiding deprecated API to the compiler when
	building against a library do not work for all deprecated API:

	* virtual methods need to stay visible to the compiler to  build  proper
	  virtual method tables for subclasses

	* enumerators  from enums cannot be simply removed, as this changes auto
	  values of following enumerators, also can poke holes in enumerator se-
	  ries used as index into tables

	In such cases the API can be only ahiddena at build time of the library,
	itself, by generated hard coded macro settings, using  <prefix_name><up-
	percase_base_name>_BUILD_DEPRECATED_SINCE(major, minor).

     Examples:

     Preparing a library aFooa created by target afooa, which is part of a group
     of  libraries aBara, where some API of aFooa got deprecated at versions 5.0
     & 5.12:

	ecm_generate_export_header(foo
	    GROUP_BASE_NAME BAR
	    VERSION ${FOO_VERSION}
	    DEPRECATION_VERSIONS 5.0 5.12
	)

     In the library aFooa sources in the headers the API would be prepared  like
     this, using the generated macros FOO_ENABLE_DEPRECATED_SINCE and FOO_DEPRE-
     CATED_VERSION:

	#include <foo_export.h>

	#if FOO_ENABLE_DEPRECATED_SINCE(5, 0)
	/**
	  * @deprecated Since 5.0
	  */
	FOO_EXPORT
	FOO_DEPRECATED_VERSION(5, 0, "Use doFoo2()")
	void doFoo();
	#endif

	#if FOO_ENABLE_DEPRECATED_SINCE(5, 12)
	/**
	  * @deprecated Since 5.12
	  */
	FOO_EXPORT
	FOO_DEPRECATED_VERSION(5, 12, "Use doBar2()")
	void doBar();
	#endif

     Projects  linking	against  the aFooa library can control which part of its
     deprecated API should be hidden to the compiler by adding a definition  us-
     ing  the FOO_DISABLE_DEPRECATED_BEFORE_AND_AT macro variable set to the de-
     sired value (in version hex number notation):

	add_definitions(-DFOO_DISABLE_DEPRECATED_BEFORE_AND_AT=0x050000)

     Or using the macro variable of the group:

	add_definitions(-DBAR_DISABLE_DEPRECATED_BEFORE_AND_AT=0x050000)

     If  both  are  specified,	FOO_DISABLE_DEPRECATED_BEFORE_AND_AT  will  take
     precedence.

     To  build	a  variant of a library with some deprecated API completely left
     out from the build, not only optionally invisible to  consumers,  one  uses
     the  EXCLUDE_DEPRECATED_BEFORE_AND_AT parameter. This is best combined with
     a cached CMake variable.

	set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control the range of deprecated API excluded from the build [default=0].")

	ecm_generate_export_header(foo
	    VERSION ${FOO_VERSION}
	    EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT}
	    DEPRECATION_VERSIONS 5.0 5.12
	)

     The macros used in the headers for library consumers are  reused  for  dis-
     abling  the API excluded in the build of the library. For disabling the im-
     plementation of that API as well as for disabling deprecated API which only
     can be disabled at build time of the library for BC reasons, one  uses  the
     generated macro FOO_BUILD_DEPRECATED_SINCE, like this:

	#include <foo_export.h>

	enum Bars {
	    One,
	#if FOO_BUILD_DEPRECATED_SINCE(5, 0)
	    Two FOO_ENUMERATOR_DEPRECATED_VERSION(5, 0, "Use Three"), // macro available since 5.82
	#endif
	    Three,
	};

	#if FOO_ENABLE_DEPRECATED_SINCE(5, 0)
	/**
	  * @deprecated Since 5.0
	  */
	FOO_EXPORT
	FOO_DEPRECATED_VERSION(5, 0, "Use doFoo2()")
	void doFoo();
	#endif

	#if FOO_ENABLE_DEPRECATED_SINCE(5, 12)
	/**
	  * @deprecated Since 5.12
	  */
	FOO_EXPORT
	FOO_DEPRECATED_VERSION(5, 12, "Use doBar2()")
	void doBar();
	#endif

	class FOO_EXPORT Foo {
	public:
	#if FOO_BUILD_DEPRECATED_SINCE(5, 0)
	    /**
	      * @deprecated Since 5.0
	      */
	    FOO_DEPRECATED_VERSION(5, 0, "Feature removed")
	    virtual void doWhat();
	#endif
	};

	#if FOO_BUILD_DEPRECATED_SINCE(5, 0)
	void doFoo()
	{
	    // [...]
	}
	#endif

	#if FOO_BUILD_DEPRECATED_SINCE(5, 12)
	void doBar()
	{
	    // [...]
	}
	#endif

	#if FOO_BUILD_DEPRECATED_SINCE(5, 0)
	void Foo::doWhat()
	{
	    // [...]
	}
	#endif

     So e.g. if EXCLUDE_DEPRECATED_BEFORE_AND_AT is set to a5.0.0a, the enumera-
     tor  Two  as  well  as  the methods ::doFoo() and Foo::doWhat() will be not
     available to library consumers. The methods will  not  have  been	compiled
     into  the	library  binary, and the declarations will be hidden to the com-
     piler, FOO_DISABLE_DEPRECATED_BEFORE_AND_AT also cannot be used to  reacti-
     vate them.

     When  using the NO_DEFINITION_EXPORT_TO_BUILD_INTERFACE and the project for
     the aFooa library includes also tests and examples linking against the  li-
     brary and using deprecated API (like tests covering it), one better explic-
     itly  sets  FOO_DISABLE_DEPRECATED_BEFORE_AND_AT  for  those targets to the
     version before and at which all deprecated API has been excluded  from  the
     build.  Even more when building against other libraries from the same group
     aBara  and disabling some deprecated API of those libraries using the group
     macro BAR_DISABLE_DEPRECATED_BEFORE_AND_AT, which also works as default for
     FOO_DISABLE_DEPRECATED_BEFORE_AND_AT.

     To get the hex number style value the helper  macro  ecm_export_header_for-
     mat_version() will be used:

	set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control what part of deprecated API is excluded from build [default=0].")

	ecm_generate_export_header(foo
	    VERSION ${FOO_VERSION}
	    GROUP_BASE_NAME BAR
	    EXCLUDE_DEPRECATED_BEFORE_AND_AT ${EXCLUDE_DEPRECATED_BEFORE_AND_AT}
	    NO_DEFINITION_EXPORT_TO_BUILD_INTERFACE
	    DEPRECATION_VERSIONS 5.0 5.12
	)

	ecm_export_header_format_version(${EXCLUDE_DEPRECATED_BEFORE_AND_AT}
	    CURRENT_VERSION ${FOO_VERSION}
	    HEXNUMBER_VAR foo_no_deprecated_before_and_at
	)

	# disable all deprecated API up to 5.9.0 from all other libs of group "BAR" that we use ourselves
	add_definitions(-DBAR_DISABLE_DEPRECATED_BEFORE_AND_AT=0x050900)

	add_executable(app app.cpp)
	target_link_libraries(app foo)
	target_compile_definitions(app
	     PRIVATE "FOO_DISABLE_DEPRECATED_BEFORE_AND_AT=${foo_no_deprecated_before_and_at}")

     Since 5.64.0.

   ECMGenerateHeaders
     Generate C/C++ CamelCase forwarding headers.

	ecm_generate_headers(<camelcase_forwarding_headers_var>
	    HEADER_NAMES <CamelCaseName> [<CamelCaseName> [...]]
	    [ORIGINAL <CAMELCASE|LOWERCASE>]
	    [HEADER_EXTENSION <header_extension>]
	    [OUTPUT_DIR <output_dir>]
	    [PREFIX <prefix>]
	    [SHARED_PREFIX <prefix>] # since 6.19
	    [REQUIRED_HEADERS <variable>]
	    [COMMON_HEADER <HeaderName>]
	    [RELATIVE <relative_path>])

     For  each CamelCase header name passed to HEADER_NAMES, a file of that name
     will be generated	that  will  include  a	version  with  .h  or,	if  set,
     .<header_extension>  appended.   For  example,  the generated header ClassA
     will include classa.h (or ClassA.h, see ORIGINAL).  If a CamelCaseName con-
     sists of multiple comma-separated files, e.g.   ClassA,ClassB,ClassC,  then
     multiple  camelcase  header  files will be generated which are redirects to
     the first header file.  The file locations of these generated headers  will
     be stored in <camelcase_forwarding_headers_var>.

     ORIGINAL  specifies  how the name of the original header is written: lower-
     cased or also camelcased.	The default is aLOWERCASEa. Since 1.8.0.

     HEADER_EXTENSION specifies what file name extension is used for the  header
     files.  The default is aha. Since 5.48.0.

     PREFIX  places  the  generated headers in subdirectories.	This should be a
     CamelCase name like KParts, which will cause the CamelCase forwarding head-
     ers to be placed in the KParts directory (e.g. KParts/Part).  It will also,
     for the convenience of code in the source distribution, generate forwarding
     headers based on the original names (e.g. kparts/part.h).	This allows  in-
     cludes  like  "#include <kparts/part.h>" to be used before installation, as
     long as the include_directories are set appropriately.

     SHARED_PREFIX works similar to PREFIX. It though assumes the original head-
     ers will be installed in the same subdirectory as the  forwarding	headers.
     So  the  generated files will include the original ones locally without any
     prefix.  And the above mentioned  pre-installation  convenience  forwarding
     headers based on the original names will be placed in the same subdirectory
     (e.g. KParts/part.h), to allow includes like "#include <KParts/Part>" to be
     used before installation and working properly. Since 6.19.0.

     OUTPUT_DIR  specifies  where  the	files  will be generated; this should be
     within the build directory. By default, ${CMAKE_CURRENT_BINARY_DIR} will be
     used.  This option can be used to avoid file conflicts.

     REQUIRED_HEADERS specifies an output variable name where all  the	required
     headers  will  be	appended so that they can be installed together with the
     generated ones.  This is mostly intended as a convenience so that adding  a
     new  header  to a project only requires specifying the CamelCase variant in
     the CMakeLists.txt file; the original variant will then be  added	to  this
     variable.

     COMMON_HEADER generates an additional convenience header which includes all
     other header files.

     The  RELATIVE  argument  indicates  where the original headers can be found
     relative to CMAKE_CURRENT_SOURCE_DIR.  It does  not  affect  the  generated
     CamelCase	forwarding files, but ecm_generate_headers() uses it when check-
     ing that the original header exists, and to generate originally named  for-
     warding headers when PREFIX or SHARED_PREFIX is set.

     To allow other parts of the source distribution (eg: tests) to use the gen-
     erated  headers  before installation, it may be desirable to add to the IN-
     CLUDE_DIRECTORIES property of the library target the output_dir.	If  OUT-
     PUT_DIR  is  CMAKE_CURRENT_BINARY_DIR  (the default) and CMAKE_INCLUDE_CUR-
     RENT_DIR_IN_INTERFACE is ON (as set by KDECMakeSettings), this is automati-
     cally done.  Otherwise you could do (adapt if OUTPUT_DIR is something else)

	target_include_directories(MyLib PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")

     Example usage (without PREFIX pr SHARED_PREFIX):

	ecm_generate_headers(
	    MyLib_FORWARDING_HEADERS
	    HEADERS
		MLFoo
		MLBar
		# etc
	    REQUIRED_HEADERS MyLib_HEADERS
	    COMMON_HEADER MLGeneral
	)
	install(FILES ${MyLib_FORWARDING_HEADERS} ${MyLib_HEADERS}
		DESTINATION ${CMAKE_INSTALL_PREFIX}/include
		COMPONENT Devel)

     Example usage (with PREFIX):

	ecm_generate_headers(
	    MyLib_FORWARDING_HEADERS
	    HEADERS
		Foo
		# several classes are contained in bar.h, so generate
		# additional files
		Bar,BarList
		# etc
	    PREFIX MyLib
	    REQUIRED_HEADERS MyLib_HEADERS
	)
	install(FILES ${MyLib_FORWARDING_HEADERS}
		DESTINATION ${CMAKE_INSTALL_PREFIX}/include/MyLib
		COMPONENT Devel)
	install(FILES ${MyLib_HEADERS}
		DESTINATION ${CMAKE_INSTALL_PREFIX}/include/mylib
		COMPONENT Devel)

     Example usage (with SHARED_PREFIX):

	ecm_generate_headers(
	    MyLib_FORWARDING_HEADERS
	    HEADERS
		Foo
		# several classes are contained in bar.h, so generate
		# additional files
		Bar,BarList
		# etc
	    SHARED_PREFIX MyLib
	    REQUIRED_HEADERS MyLib_HEADERS
	)
	install(FILES ${MyLib_FORWARDING_HEADERS} ${MyLib_HEADERS}
		DESTINATION ${CMAKE_INSTALL_PREFIX}/include/MyLib
		COMPONENT Devel)

     Since pre-1.0.0.

   ECMGeneratePkgConfigFile
     Generate a pkg-config file for the benefit of autotools-based projects.

	ecm_generate_pkgconfig_file(BASE_NAME <baseName>
			      [LIB_NAME <libName>]
			      [DEPS [PRIVATE|PUBLIC] <dep> [[PRIVATE|PUBLIC] <dep> [...]]]
			      [FILENAME_VAR <filename_variable>]
			      [INCLUDE_INSTALL_DIR <dir>]
			      [LIB_INSTALL_DIR <dir>]
			      [DEFINES -D<variable=value>...]
			      [DESCRIPTION <library description>] # since 5.41.0
			      [URL <url>] # since 5.89.0
			      [INSTALL])

     BASE_NAME is the name of the module. Itas the name  projects  will  use  to
     find the module.

     LIB_NAME  is  the name of the library that is being exported. If undefined,
     it will default to the BASE_NAME. That means the LIB_NAME will  be  set  as
     the name field as well as the library to link to.

     DEPS  is the list of libraries required by this library. Libraries that are
     not exposed to applications should be marked with PRIVATE. The  default  is
     PUBLIC,  but  note that according to the Guide to pkg-config marking depen-
     dencies as private is usually preferred. The PUBLIC  and  PRIVATE	keywords
     are supported since 5.89.0.

     FILENAME_VAR  is specified with a variable name. This variable will receive
     the location of the generated file will be set, within the build directory.
     This way it can be used in case some processing is required. See  also  IN-
     STALL.

     INCLUDE_INSTALL_DIR specifies where the includes will be installed. If itas
     not  specified,  it  will	default to INSTALL_INCLUDEDIR, CMAKE_INSTALL_IN-
     CLUDEDIR or just ainclude/a in case they are specified, with the  BASE_NAME
     postfixed.

     LIB_INSTALL_DIR specifies where the library is being installed. If itas not
     specified, it will default to LIB_INSTALL_DIR, CMAKE_INSTALL_LIBDIR or just
     alib/a in case they are specified.

     DEFINES  is  a list of preprocessor defines that it is recommended users of
     the library pass to the compiler when using it.

     DESCRIPTION describes what this library is. If itas  not  specified,  CMake
     will  first  try to get the description from the metainfo.yaml file or will
     create one based on LIB_NAME. Since 5.41.0.

     URL An URL where people can get more information  about  and  download  the
     package. Defaults to ahttps://www.kde.org/a. Since 5.89.0.

     INSTALL will cause the module to be installed to the pkgconfig subdirectory
     of  LIB_INSTALL_DIR, unless the ECM_PKGCONFIG_INSTALL_DIR cache variable is
     set to something different.

     NOTE:
	The first call to ecm_generate_pkgconfig_file() with the  INSTALL  argu-
	ment  will  cause  ECM_PKGCONFIG_INSTALL_DIR to be set to the cache, and
	will be used in any subsequent calls.

     To properly use this macro a version needs  to  be  set.  To  retrieve  it,
     ECM_PKGCONFIG_INSTALL_DIR	 uses	PROJECT_VERSION.  To  set  it,	use  the
     project() command (or if you still set CMP0048 to OLD and donat have  CMake
     >= 4 the ecm_setup_version() macro)

     Example usage:

	ecm_generate_pkgconfig_file(
	    BASE_NAME KF5Archive
	    DEPS Qt5Core
	    FILENAME_VAR pkgconfig_filename
	    INSTALL
	)

     Since 1.3.0.

   ECMGeneratePriFile
     Generate a .pri file for the benefit of qmake-based projects.

     As  well  as  the	function  below,  this module creates the cache variable
     ECM_MKSPECS_INSTALL_DIR and sets  the  default  value  to	mkspecs/modules.
     This  assumes  Qt	and  the  current project are both installed to the same
     non-system prefix.  Packagers who use -DCMAKE_INSTALL_PREFIX=/usr will cer-
     tainly want to set ECM_MKSPECS_INSTALL_DIR to something like  share/qt5/mk-
     specs/modules.

     The  main	thing  is that this should be the modules subdirectory of either
     the default qmake mkspecs directory or of a directory that will be  in  the
     $QMAKEPATH environment variable when qmake is run.

	ecm_generate_pri_file(BASE_NAME <baseName>
			      LIB_NAME <libName>
			      [VERSION <version>] # since 5.83
			      [DEPS "<dep> [<dep> [...]]"]
			      [FILENAME_VAR <filename_variable>]
			      [INCLUDE_INSTALL_DIRS <dir> [<dir> [...]]]  # since 5.92
			      [INCLUDE_INSTALL_DIR <dir>] # deprecated since 5.92
			      [LIB_INSTALL_DIR <dir>])

     If  your CMake project produces a Qt-based library, you may expect there to
     be applications that wish to use it that use a  qmake-based  build  system,
     rather  than a CMake-based one.  Creating a .pri file will make use of your
     library convenient for them, in much the same way that CMake  config  files
     make   things   convenient   for	CMake-based   applications.   ecm_gener-
     ate_pri_file() generates just such a file.

     VERSION specifies the version of the library the .pri  file  describes.  If
     not  set,	the  value  is	taken from the context variable PROJECT_VERSION.
     This variable is usually set by the project(... VERSION ...) command or, if
     CMake policy CMP0048 is not NEW, by ECMSetupVersion.  For backward-compati-
     bility with older ECM versions the PROJECT_VERSION_STRING variable  as  set
     by  ECMSetupVersion  will	be preferred over PROJECT_VERSION if set, unless
     the minimum required version of ECM is 5.83 and newer. Since 5.83.

     BASE_NAME specifies the name qmake project (.pro) files should use to refer
     to the library (eg: KArchive).  LIB_NAME is the name of the actual  library
     to link to (ie: the first argument to add_library()).  DEPS is a space-sep-
     arated list of the base names of other libraries (for Qt libraries, use the
     same  names  you  use with the QT variable in a qmake project file, such as
     acorea for QtCore).  FILENAME_VAR specifies the name of a variable to store
     the path to the generated file in.

     INCLUDE_INSTALL_DIRS are the paths (relative to CMAKE_INSTALL_PREFIX)  that
     include   files   will  be  installed  to.  It  defaults  to  ${INCLUDE_IN-
     STALL_DIR}/<baseName> if the INCLUDE_INSTALL_DIR variable is set.	If  that
     variable is not set, the CMAKE_INSTALL_INCLUDEDIR variable is used instead,
     and if neither are set include is used.  LIB_INSTALL_DIR operates similarly
     for  the  installation  location  for  libraries;	it defaults to ${LIB_IN-
     STALL_DIR}, ${CMAKE_INSTALL_LIBDIR} or lib, in that order.

     INCLUDE_INSTALL_DIR is the old variant of INCLUDE_INSTALL_DIRS, taking only
     one directory.

     Example usage:

	ecm_generate_pri_file(
	    BASE_NAME KArchive
	    LIB_NAME KF5KArchive
	    DEPS "core"
	    FILENAME_VAR pri_filename
	    VERSION 4.2.0
	)
	install(FILES ${pri_filename} DESTINATION ${ECM_MKSPECS_INSTALL_DIR})

     A qmake-based project that wished to use this would then do:

	QT += KArchive

     in their .pro file.

     Since pre-1.0.0.

   ECMGeneratePythonBindings
     This module is experimental and internal.	The interface will likely change
     in the coming releases.

     Generate Python bindings using Shiboken.

	ecm_generate_python_bindings(PACKAGE_NAME <pythonlibrary>
				     VERSION <version>
				     WRAPPED_HEADER <filename>
				     TYPESYSTEM <filename>
				     [EXPORT_TYPESYSTEM]
				     GENERATED_SOURCES <filename> [<filename> [...]]
				     DEPENDENCIES <target> [<target> [...]]
				     QT_VERSION <version>
				     HOMEPAGE_URL <url>
				     ISSUES_URL <url>
				     AUTHOR <string>
				     README <filename> )

     <pythonlibrary> is the name of the Python library that will be created.

     VERSION is the version of the library.

     WRAPPED_HEADER is a C++ header that contains all the required includes  for
     the library.

     TYPESYSTEM is the XML file where the bindings are defined.

     EXPORT_TYPESYSTEM	specifies that the typesystem XML file and the generated
     header are exported and can be used by other typesystem XML files.

     GENERATED_SOURCES is the list of generated C++  source  files  by	Shiboken
     that will be used to build the shared library.

     QT_VERSION is the minimum required Qt version of the library.

     DEPENDENCIES is the list of dependencies that the bindings uses.

     HOMEPAGE_URL is a URL to the project homepage.

     ISSUES_URL is a URL where users can report bugs and feature requests.

     AUTHOR is a string with the author of the library.

     README is a Markdown file that will be used as the projectas description on
     the Python Package Index.

   ECMGenerateQDoc
     This module provides the ecm_generate_qdoc function for generating API doc-
     umentation files for projects based on qdoc.

     It allows to generate both online HTML documentation as well as (installed)
     QCH files.

	ecm_generate_qdoc(<target_name> <qdocconf_file>)

     target_name is the library target for which the documentation is generated.

     qdocconf_file is the .qdocconf file that controls the documentation genera-
     tion.

     If  the project contains multiple libraries with documented APIs ecm_gener-
     ate_qdoc should be called for each one.

     Example usage:

	ecm_add_qch(KF6::CoreAddons kcoreaddons.qdocconf)

     Documentation is not built as part of the normal build, it needs to be  ex-
     plicitly invoked using the following build targets:

     * prepare_docs runs the prepare step from qdoc, which processes sources and
       creates index files

     * generate_docs runs the generate step from qdoc, generating the final doc-
       umentation from the index files

     * install_html_docs  installs the generated HTML documentation into KDE_IN-
       STALL_QTQCHDIR from KDEInstallDirs

     * generate_qch creates QCH files out of the HTML documentation

     * install_qch_docs installs the QCH files	into  KDE_INSTALL_QTQCHDIR  from
       KDEInstallDirs

     The following global parameters are understood:

     * QDOC_BIN: This can be used to select another qdoc executable than the one
       found  by find_package. This is useful to test with different versions of
       the qdoc tool.

     * DOC_DESTDIR: This is where the HTML and index files  will  be  generated.
       This  is useful to aggregate results from multiple projects into a single
       directory.

     When combining documentation from multiple projects the recommended  proce-
     dure  is  to use a common DOC_DESTDIR and run the prepare stage for all be-
     fore running the generate stage for all. This ensures that the index  files
     are  all available during the generate phase and cross-linking works as ex-
     pected.

     Since 6.11.0.

   ECMGenerateQmlTypes
     Generates plugins.qmltypes files for QML plugins.

	ecm_generate_qmltypes(<org.kde.pluginname> 1.3
			      DESTINATION <${KDE_INSTALL_QMLDIR}/org/kde/pluginname>)

     Makes it possible to generate plugins.qmltypes files for  the  QML  plugins
     that  our	project  offers. These files offer introspection upon our plugin
     and are useful for integrating with IDE language support of our plugin.  It
     offers information about the objects its methods and their argument types.

     The  developer  will be in charge of making sure that these files are up to
     date.  The plugin.qmltypes file will sit  in  the	source	directory.  This
     function  will  include  the code that installs the file in the right place
     and a small unit test named  qmltypes-pluginname-version  that  makes  sure
     that it doesnat need updating.

     With Qt6 prefer using qt_add_qml_module()/ecm_add_qml_module() and declara-
     tive type registration, which do this automatically.

     Since 5.33.0

   ECMInstallIcons
     Installs  icons, sorting them into the correct directories according to the
     FreeDesktop.org icon naming specification.

	ecm_install_icons(ICONS <icon> [<icon> [...]]
			  DESTINATION <icon_install_dir>
			  [LANG <l10n_code>]
			  [THEME <theme>])

     The given icons, whose names must match the pattern:

	<size>-<group>-<name>.<ext>

     will be installed to the appropriate subdirectory of DESTINATION  according
     to  the  FreeDesktop.org icon naming scheme. By default, they are installed
     to the ahicolora theme, but this can be changed using the	THEME  argument.
     If  the  icons are localized, the LANG argument can be used to install them
     in a locale-specific directory.

     <size> is a numeric pixel size (typically 16, 22, 32, 48, 64, 128	or  256)
     or  sc  for  scalable (SVG) files, <group> is one of the standard FreeDesk-
     top.org icon groups (actions, animations, apps,  categories,  devices,  em-
     blems,  emotes,  intl, mimetypes, places, status) and <ext> is one of .png,
     .mng or .svgz.

     The typical installation directory is share/icons.

	ecm_install_icons(ICONS 22-actions-menu_new.png
			  DESTINATION share/icons)

     The above code will install the file 22-actions-menu_new.png as ${CMAKE_IN-
     STALL_PREFIX}/share/icons/<theme>/22x22/actions/menu_new.png

     Users  of	the  KDEInstallDirs  module   would   normally	 use   ${KDE_IN-
     STALL_ICONDIR} as the DESTINATION, while users of the GNUInstallDirs module
     should use ${CMAKE_INSTALL_DATAROOTDIR}/icons.

     An old form of arguments will also be accepted:

	ecm_install_icons(<icon_install_dir> [<l10n_code>])

     This matches files named like:

	<theme><size>-<group>-<name>.<ext>

     where <theme> is one of

     * hi for hicolor

     * lo for locolor

     * cr for the Crystal icon theme

     * ox for the Oxygen icon theme

     * br for the Breeze icon theme

     With  this  syntax,  the  file hi22-actions-menu_new.png would be installed
     into <icon_install_dir>/hicolor/22x22/actions/menu_new.png

     Since pre-1.0.0.

   ECMMarkAsTest
     Marks a target as only being required for tests.

	ecm_mark_as_test(<target1> [<target2> [...]])

     This will cause the  specified  targets  to  not  be  built  unless  either
     BUILD_TESTING is set to ON or the user invokes the buildtests target.

     BUILD_TESTING is created as a cache variable by the CTest module and by the
     KDECMakeSettings module.

     Since pre-1.0.0.

   ECMMarkNonGuiExecutable
     Marks an executable target as not being a GUI application.

	ecm_mark_nongui_executable(<target1> [<target2> [...]])

     This  will  indicate  to CMake that the specified targets should not be in-
     cluded in a MACOSX_BUNDLE and should not be  WIN32_EXECUTABLEs.   On  plat-
     forms other than MacOS X or Windows, this will have no effect.

     Since pre-1.0.0.

   ECMOptionalAddSubdirectory
     Make subdirectories optional.

	ecm_optional_add_subdirectory(<dir>)

     This  behaves  like add_subdirectory(), except that it does not complain if
     the directory does not exist.  Additionally, if the directory  does  exist,
     it creates an option to allow the user to skip it. The option will be named
     BUILD_<dir>.

     This  is useful for ameta-projectsa that combine several mostly-independent
     sub-projects.

     If the CMake variable DISABLE_ALL_OPTIONAL_SUBDIRECTORIES is  set	to  TRUE
     for the first CMake run on the project, all optional subdirectories will be
     disabled  by  default  (but can of course be enabled via the respective op-
     tions).  For example, the following will disable all  optional  subdirecto-
     ries except the one named afooa:

	cmake -DDISABLE_ALL_OPTIONAL_SUBDIRECTORIES=TRUE -DBUILD_foo=TRUE myproject

     Since pre-1.0.0.

   ECMPackageConfigHelpers
     Helper macros for generating CMake package config files.

     write_basic_package_version_file() is the same as the one provided by the -
     CMakePackageConfigHelpers	module in CMake; see that moduleas documentation
     for more information.

	ecm_configure_package_config_file(<input> <output>
	    INSTALL_DESTINATION <path>
	    [PATH_VARS <var1> [<var2> [...]]
	    [NO_SET_AND_CHECK_MACRO]
	    [NO_CHECK_REQUIRED_COMPONENTS_MACRO])

     This behaves in the same way as configure_package_config_file() from  CMake
     2.8.12, except that it adds an extra helper macro: find_dependency(). It is
     highly  recommended  that	you  read the documentation for CMakePackageCon-
     figHelpers for more information, particularly with regard to the  PATH_VARS
     argument.

     Note  that  there	is  no	argument that will disable the find_dependency()
     macro; if you do not require this macro,  you  should  use  configure_pack-
     age_config_file from the CMakePackageConfigHelpers module.

     CMake  3.0  includes  a  CMakeFindDependencyMacro	module that provides the
     find_dependency() macro (which you can include()  in  your  package  config
     file),  so  this file is only useful for projects wishing to provide config
     files that will work with CMake 2.8.12.

   Additional Config File Macros
	find_dependency(<dep> [<version> [EXACT]])

     find_dependency() should be used instead of find_package() to find  package
     dependencies.   It forwards the correct parameters for EXACT, QUIET and RE-
     QUIRED which were passed to the original find_package() call.  It also sets
     an informative diagnostic message if the dependency could not be found.

     Since pre-1.0.0.

   ECMPoQmTools
     This   module   provides	the   ecm_process_po_files_as_qm   and	 ecm_in-
     stall_po_files_as_qm  functions  for  generating QTranslator (.qm) catalogs
     from Gettext (.po) catalogs, and the ecm_create_qm_loader function for gen-
     erating the necessary code to load them in a Qt application or library.

	ecm_process_po_files_as_qm(<lang> [ALL]
				   [INSTALL_DESTINATION <install_destination>]
				   PO_FILES <pofile> [<pofile> [...]])

     Compile .po files into .qm files for the given language.

     If INSTALL_DESTINATION is given,  the  .qm  files	are  installed	in  <in-
     stall_destination>/<lang>/LC_MESSAGES.  Typically, <install_destination> is
     set to share/locale.

     ecm_process_po_files_as_qm creates a  atranslationsa  target.  This  target
     builds  all .po files into .qm files.  If ALL is specified, these rules are
     added to the aalla target (and so the .qm files will be built by default).

	ecm_create_qm_loader(<sources_var_name(|target (since 5.83))> <catalog_name>)

     Generates C++ code which ensures translations are automatically  loaded  at
     startup.	The   generated   files  are  appended	to  the  variable  named
     <sources_var_name> or, if the first argument is a target (since  5.83),  to
     the  SOURCES property of <target>. Any target must be created with add_exe-
     cutable() or add_library() and not be an alias.

     It assumes that the .qm file for the language code <lang> is  installed  as
     <sharedir>/locale/<lang>/LC_MESSAGES/<catalog_name>.qm, where <sharedir> is
     one of the directories given by the GenericDataLocation of QStandardPaths.

     Typical usage is like:

	set(mylib_SRCS foo.cpp bar.cpp)
	ecm_create_qm_loader(mylib_SRCS mycatalog)
	add_library(mylib ${mylib_SRCS})

	# Or, since 5.83:
	add_library(mylib foo.cpp bar.cpp)
	ecm_create_qm_loader(mylib mycatalog)

	ecm_install_po_files_as_qm(<podir>)

     Searches for .po files and installs them to the standard location.

     This  is a convenience function which relies on all .po files being kept in
     <podir>/<lang>/, where <lang> is the language the .po files are written in.

     For example, given the following directory structure:

	po/
	  fr/
	    mylib.po

     ecm_install_po_files_as_qm(po) compiles mylib.po into mylib.qm and installs
     it in <install_destination>/fr/LC_MESSAGES.  <install_destination> defaults
     to ${LOCALE_INSTALL_DIR} if defined, otherwise it uses  ${CMAKE_INSTALL_LO-
     CALEDIR} if that is defined, otherwise it uses share/locale.

     Since pre-1.0.0.

   ECMQmlModule
     Helper functions to make it easier to create QML modules.

     This  CMake  module  lets	you  create QML-enabled targets, add C++ and QML
     files to them, and finalize the module if needed. When using Qt 6,  it  al-
     lows for declarative registration of QML types.

     This CMake module reduces boilerplate and takes care of special handling of
     QML modules between shared and static builds:

     * When  building  a static version of a QML module, the relevant QML source
       files are bundled into the static library.

     * When using a shared build, the QML plugin  and  relevant  QML  files  are
       copied  to the targetas RUNTIME_OUTPUT_DIRECTORY to make it easier to run
       things directly from the build directory.

     Since 6.0.0, when using Qt 6, most functionality of this  module  has  been
     implemented  by upstream Qt. Most of the functions here will now forward to
     the similar Qt functions.

     Example usage with an executable as backing target:

	add_executable(app)
	ecm_add_qml_module(app
	    URI "org.example.Example"
	)

	target_sources(app PRIVATE main.cpp)
	target_link_libraries(app PRIVATE Qt::Quick)

	ecm_target_qml_sources(app SOURCES ExampleItem.qml) # This will have 1.0 as the default version
	ecm_target_qml_sources(app SOURCES AnotherExampleItem.qml VERSION 1.5)

	install(TARGETS app ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})

     The above example creates an executable target, modifies the target to  al-
     low it to accept QML files and properties, adds source files to it, and in-
     stalls it.

     The executable is the backing target for the QML module, which in practical
     terms  means the QML module is aembeddeda into the executable, always being
     loaded as part of the application, and no plugin library is created.

     Example usage with a separate QML module:

	add_library(ExampleModule)
	ecm_add_qml_module(ExampleModule
	    URI org.example.Example
	    GENERATE_PLUGIN_SOURCE
	)

	target_sources(ExampleModule PRIVATE ExamplePlugin.cpp)
	target_link_libraries(ExampleModule PRIVATE Qt::Quick)

	ecm_target_qml_sources(ExampleModule SOURCES ExampleItem.qml)

	ecm_finalize_qml_module(ExampleModule DESTINATION ${KDE_INSTALL_QMLDIR})

	install(TARGETS ExampleModule ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})

     The above example creates a library target, modifies the target to allow it
     to accept QML files and properties, adds source files to it, and  finalizes
     the target.

     The library acts as a plugin that is expected to be linked to an executable
     later  on,  in  which case GENERATE_PLUGIN_SOURCE and ecm_finalize_qml_mod-
     ule() are both required.

	ecm_add_qml_module(<target name>
	    URI <module uri>
	    [VERSION <module version>]
	    [NO_PLUGIN] # Deprecated since 6.0.0 when using Qt 6
	    [CLASSNAME <class name>] # Deprecated since 6.0.0 when using Qt 6, use CLASS_NAME instead
	    [QT_NO_PLUGIN] # Since 6.0.0, when using Qt 6
	    [GENERATE_PLUGIN_SOURCE] # Since 6.0.0, when using Qt 6
	    [DEPENDENCIES <dependency> ...] # Since 6.0.0, when using Qt 6, inherited from qt_add_qml_module()
	    [IMPORTS <import> ...] # Since 6.0.0, when using Qt 6, inherited from qt_add_qml_module()
	)

     This will declare a new CMake target called <target name>. The URI argument
     is required and should be a proper QML module URI. The URI is  used,  among
     others, to generate a subdirectory where the module will be installed to.

     If  the VERSION argument is specified, it is used to initialize the default
     version that is used by  ecm_target_qml_sources when adding QML  files.  If
     it  is not specified, a  default of 1.0 is used. Additionally, if a version
     greater than or equal to 2.0 is specified, the major version is appended to
     the Qt5 installation path of the module.  In case you donat specify a  ver-
     sion  for the module, but specify a version for the individual sources, the
     latter will be set as the resulting version for this module. This will also
     be used in the ECMFindQmlModule module.

     If the option NO_PLUGIN is set, a target is declared that is  not	expected
     to contain any C++ QML plugin.

     If  the  optional	CLASSNAME argument is supplied, it will be used as class
     name in the generated QMLDIR file. If it is not specified, the target  name
     will be used instead.

     You can add C++ and QML source files to the target using target_sources and
     ecm_target_qml_sources, respectively.

     Since 5.91.0

     Since  6.0.0,  when used with Qt 6, this will forward to qt_add_qml_module.
     Any extra arguments will be forwarded as well. The  NO_PLUGIN  argument  is
     deprecated and implies GENERATE_PLUGIN_SOURCE, since modules in Qt 6 always
     require  a  plugin or backing target. If you want to use Qtas behaviour for
     NO_PLUGIN, use QT_NO_PLUGIN instead.  Additionally,  to  maintain	backward
     compatibility,    by   default   we   pass   NO_GENERATE_PLUGIN_SOURCE   to
     qt_add_qml_module.

     If you are using the executable as backing target for your QML module,  the
     default  behavior	should	suffice. If you are using a separate QML module,
     you will need to have Qt generate the plugin sources,  in	which  case  you
     should pass GENERATE_PLUGIN_SOURCE.

     The DEPENDENCIES and IMPORTS options come from qt_add_qml_module() since Qt
     6, and behave as in upstream Qt.

     Use  DEPENDENCIES for things like aQtCorea, aQtQuicka, ayour.custom.qmlmod-
     ulea, as well as C++ only dependencies. This is  required	for  QML-exposed
     C++  code,  like when subclassing a type or using it as a parameter type in
     properties and invokables.

     Use IMPORTS to make a type available a part of a moduleas public interface.
     In other words, if a QML file imports this module, it also imports all  the
     modules listed under IMPORTS.

     See  Declaring module dependencies and 10 Tips to Make Your QML Code Faster
     and More Maintainable for details.

	ecm_add_qml_module_dependencies(<target> DEPENDS <module string> [<module string> ...])

     Adds the list of dependencies specified  by  the  DEPENDS	argument  to  be
     listed as dependencies in the generated QMLDIR file of <target>.

     Since 5.91.0

     Since  6.0.0,  this  is deprecated and ignored when using Qt 6, instead use
     the DEPENDENCIES and IMPORTS arguments to ecm_add_qml_module.

	ecm_target_qml_sources(<target> SOURCES <source.qml> [<source.qml> ...] [VERSION <version>] [PATH <path>] [PRIVATE])

     Adds the list of QML files specified by  the  SOURCES  argument  as  source
     files to the QML module target <target>.

     If  the optional VERSION argument is specified, all QML files will be added
     with the specified version. If it is not specified, they will use the  ver-
     sion of the QML module target.

     If  the  optional	PRIVATE argument is specified, the QML files will be in-
     cluded in the target but not in the generated qmldir file. Any version  ar-
     gument will be ignored.

     The  optional PATH argument declares a subdirectory of the module where the
     files should be copied to. By default, files will be copied to  the  module
     root.

     This  function  will  fail if <target> is not a QML module target or any of
     the specified files do not exist.

     Since 5.91.0

     Since  6.0.0,  when  used	with  Qt  6,  this  will  forward   to	 qt_tar-
     get_qml_sources().  The SOURCES argument will be translated to QML_SOURCES.
     VERSION  and PRIVATE will set Qtas QT_QML_SOURCE_VERSIONS and QT_QML_INTER-
     NAL_TYPE properties  on  SOURCES  before  calling	qt_target_qml_sources().
     Since  Qt	includes  the  path relative to the current source dir, for each
     source file a resource alias will be generated with the path  stripped.  If
     the  PATH argument is set, it will be prefixed to the alias. Any additional
     arguments will be passed to qt_target_qml_sources().

	ecm_finalize_qml_module(<target>
	    [DESTINATION <QML install destination>] # Optional since 6.0
	    [VERSION <Project Version>] # Added for 6.0 when using Qt 6
	    [EXPORT <export-set>] # Added for 6.8 when using Qt 6
	)

     Finalizes the specified QML module target.

     This is required in case you do not use the executable as backing target.

     This must be called after all other setup (like adding sources) on the tar-
     get has been done. It will perform a number of tasks:

     * It will generate a qmldir file from the QML files added to the target. If
       the module has a C++ plugin, this will also be  included  in  the  qmldir
       file.

     * If  BUILD_SHARED_LIBS  is off, a QRC file is generated from the QML files
       added to the target. This QRC file will be included  when  compiling  the
       C++ QML module. The built static library will be installed in a subdirec-
       tory  of  DESTINATION based on the QML moduleas URI. If this value is not
       set, KDE_INSTALL_QMLDIR will be used. Note that if NO_PLUGIN  is  set,  a
       C++ QML plugin will be generated to include the QRC files.

     * If  BUILD_SHARED_LIBS is on, all generated files, QML sources and the C++
       plugin will be installed in a subdirectory of DESTINATION  based  on  the
       QML  moduleas  URI.  In	addition, these files will also be copied to the
       targetas RUNTIME_OUTPUT_DIRECTORY in a similar subdirectory.

     * If BUILD_SHARED_LIBS is off, EXPORT allows to specify a CMake export  set
       all installed targets should be added to.

     This function will fail if <target> is not a QML module target.

     Since 5.91.0

     Since 6.0.0, when using Qt 6, this will instead install the files generated
     by qt_add_qml_module. The optional VERSION argument was added that will de-
     fault  to	PROJECT_VERSION  and  which  will  write  a file that is used by
     ECMFindQmlModule to detect the version of the QML module.

     Since 6.1.0

     Enabling the global option VERBOSE_QML_COMPILER during CMake  configuration
     will activate verbose output for qmlcachegen.

     Since 6.18.0

     Generate  code  from  qmlcachegen	is  put into the same UNITY_GROUP. Unity
     builds using this can either be activated manually per target or  with  the
     ECM_QMLCACHE_UNITY_BUILD option globally. This can speed up clean builds at
     the expense of needing more memory and making incremental builds slower.

   ECMQtDeclareLoggingCategory
     This  module provides the ecm_qt_declare_logging_category function for gen-
     erating declarations for logging categories  in  Qt5,  and  the  ecm_qt_in-
     stall_logging_categories  function  for generating and installing a file in
     KDebugSettings format with the info about all those categories, as well  as
     a	file  with  info about any renamed categories if defined.  To include in
     that file any logging categories that are manually defined also a	function
     ecm_qt_export_logging_category is provided.

	ecm_qt_declare_logging_category(<sources_var_name(|target (since 5.80))>
	    HEADER <filename>
	    IDENTIFIER <identifier>
	    CATEGORY_NAME <category_name>
	    [OLD_CATEGORY_NAMES <oldest_cat_name> [<second_oldest_cat_name> [...]]]
	    [DEFAULT_SEVERITY <Debug|Info|Warning|Critical|Fatal>]
	    [EXPORT <exportid>]
	    [DESCRIPTION <description>]
	)

     A	header	file,  <filename>,  will be generated along with a corresponding
     source file. These will provide a QLoggingCategory category that can be re-
     ferred to from C++ code using <identifier>, and from the logging configura-
     tion using <category_name>.

     The generated source file will be added  to  the  variable  with  the  name
     <sources_var_name>.  If the given argument is a target though, instead both
     the generated header file and the generated source file will  be  added  to
     the  target  as  private  sources	(since	5.80). The target must not be an
     alias.

     If <filename> is not absolute, it will be taken relative to the current bi-
     nary directory.

     <identifier> may include namespaces (eg: foo::bar::IDENT).

     If EXPORT is passed, the category will be registered for the group id  <ex-
     portid>. Info about the categories of that group can then be generated in a
     file  and	installed by that group id with the ecm_qt_install_logging_cate-
     gories function. In that case also DESCRIPTION will need to be passed, with
     <description> being a short single line text.  And  OLD_CATEGORY_NAMES  can
     be used to inform about any renamings of the category, so user settings can
     be migrated. Since 5.68.0.

     Since 5.14.0.

	ecm_qt_export_logging_category(
	    IDENTIFIER <identifier>
	    CATEGORY_NAME <category_name>
	    [OLD_CATEGORY_NAMES <oldest_category_name> [<second_oldest_category_name> [...]]]
	    EXPORT <exportid>
	    DESCRIPTION <description>
	    [DEFAULT_SEVERITY <Debug|Info|Warning|Critical|Fatal>]
	)

     Registers	a  logging  category for being included in the generated and in-
     stalled KDebugSettings files. To be used for categories who are declared by
     manual code or  other  ways  instead  of  code  generated	with  ecm_qt_de-
     clare_logging_category.

     <identifier> may include namespaces (eg: foo::bar::IDENT).

     EXPORT  specifies	the group id with which the category will be registered.
     Info about the categories of that group can then be generated in a file and
     installed by that group id with the ecm_qt_install_logging_categories func-
     tion.

     DESCRIPTION specifies a short single line text describing the category.

     OLD_CATEGORY_NAMES can be used to inform about any renamings of  the  cate-
     gory, so user settings can be migrated.

     Since 5.68.0.

	ecm_qt_install_logging_categories(
	    EXPORT <exportid>
	    [FILE <filename>]
	    DESTINATION <install_path>
	    [SORT]
	    [COMPONENT <component>]
	)

     Generates	and installs a file in KDebugSettings format with the info about
     all the categories registered for the group <exportid>, as well as  a  file
     with info about any renamed categories, if there are.

     The  method call needs to be after the last ecm_qt_declare_logging_category
     call which uses the same <exportid>. This can be in the same directory,  or
     any subdirectory or parent directory.

     EXPORT  specifies	the  group  id of categories whose information should be
     stored in the file generated and installed.

     FILE specifies the name of the file generated and installed.  It  will  de-
     fault  to lower-cased <exportid>.categories. The name of the file with info
     about renamed categories will use the same final base name and  the  suffix
     .renamecategories.  Note:	Before	5.113, the base name should not have any
     further . in the name, as its end would be defined by that.

     DESTINATION specifies where the generated file will be installed.

     IF SORT is set, entries will be sorted by identifiers.

     COMPONENT specifies the installation component name with which the  install
     rules for the generated file are associated.

     Since  5.85.0  this is a no-op when building for Android, as KDebugSettings
     is not available on that platform and the logging category files  therefore
     just bloat the APK.

     Example usage:

	ecm_qt_declare_logging_category(
	    MYPROJECT_SRCS
	    HEADER "myproject_debug.h"
	    IDENTIFIER "MYPROJECT_DEBUG"
	    CATEGORY_NAME "myproject"
	    OLD_CATEGORY_NAMES "myprojectlog"
	    DESCRIPTION "My project"
	    EXPORT MyProject
	)

	ecm_qt_export_logging_category(
	    IDENTIFIER "MYPROJECT_SUBMODULE_DEBUG"
	    CATEGORY_NAME "myproject.submodule"
	    DESCRIPTION "My project - submodule"
	    EXPORT MyProject
	)

	ecm_qt_install_logging_categories(
	    EXPORT MyProject
	    FILE myproject.categories
	    DESTINATION "${KDE_INSTALL_LOGGINGCATEGORIESDIR}"
	)

     Since 5.68.0.

   ECMQueryQt
     This module can be used to query the installation paths used by Qt.

     For  Qt5  this  uses  qmake,  and for Qt6 this used qtpaths (the latter has
     built-in support to query the paths of a target platform when cross-compil-
     ing).

     This module defines the following function:

	ecm_query_qt(<result_variable> <qt_variable> [TRY])

     Passing TRY will result in the method not making the build fail if the exe-
     cutable used for querying has not been found, but instead	simply	print  a
     warning message and return an empty string.

     Example usage:

	include(ECMQueryQt)
	ecm_query_qt(bin_dir QT_INSTALL_BINS)

     If  the  call  succeeds  ${bin_dir} will be set to <prefix>/path/to/bin/dir
     (e.g.  /usr/lib64/qt/bin/).

     Since: 5.93

   ECMSetupQtPluginMacroNames
     Instruct CMakeas automoc about  C++  preprocessor	macros	used  to  define
     Qt-style plugins.

	ecm_setup_qtplugin_macro_names(
	    [MACRO_NAMES <macro_name> [<macro_name> [...]]] # since 6.18
	    [JSON_NONE <macro_name> [<macro_name> [...]]]
	    [JSON_ARG1 <macro_name> [<macro_name> [...]]]
	    [JSON_ARG2 <macro_name> [<macro_name> [...]]]
	    [JSON_ARG3 <macro_name> [<macro_name> [...]]]
	    [CONFIG_CODE_VARIABLE <variable_name>] )

     CMakeas  automoc needs some support when parsing C++ source files to detect
     whether moc should be run on those files and if there are also dependencies
     on other files, like those with Qt plugin metadata in JSON format.  Because
     automoc  just greps overs the raw plain text of the sources without any C++
     preprocessor-like processing.  CMake in newer versions provides  the  vari-
     able  CMAKE_AUTOMOC_MACRO_NAMES  (CMake  >= 3.10) to allow the developer to
     assist automoc. For  Qt  up  to  version  5.15  additionally  the	variable
     CMAKE_AUTOMOC_DEPEND_FILTERS (CMake >= 3.9.0) can be used.

     This macro cares for the explicit setup needed for those variables for com-
     mon cases of C++ preprocessor macros used for Qt-style plugins.

     MACRO_NAMES  lists  the names of C++ preprocessor macros for Qt-style plug-
     ins.  Requires at least Qt 5.15. Since 6.18.

     JSON_NONE lists the names of C++ preprocessor macros for  Qt-style  plugins
     which  do	not  refer  to	external  files  with  the  plugin metadata. Use
     MACRO_NAMES instead for Qt >= 5.15.

     JSON_ARG1 lists the names of C++ preprocessor macros for  Qt-style  plugins
     where the first argument to the macro is the name of the external file with
     the plugin metadata.  Use MACRO_NAMES instead for Qt >= 5.15.

     JSON_ARG2	is the same as JSON_ARG1 but with the file name being the second
     argument.	Use MACRO_NAMES instead for Qt >= 5.15.

     JSON_ARG3 is the same as JSON_ARG1 but with the file name being  the  third
     argument.	Use MACRO_NAMES instead for Qt >= 5.15.

     CONFIG_CODE_VARIABLE  specifies the name of the variable which will get set
     as value some generated CMake code for instructing automoc  for  the  given
     macro  names, as useful in an installed CMake config file. The variable can
     then be used as usual in the template file for such a CMake config file, by
     @<variable_name>@.

     Example usage:

     Given some plugin-oriented Qt-based software which  defines  a  custom  C++
     preprocessor macro EXPORT_MYPLUGIN for declaring the central plugin object:

	#define EXPORT_MYPLUGIN_WITH_JSON(classname, jsonFile) \
	class classname : public QObject \
	{ \
	    Q_OBJECT \
	    Q_PLUGIN_METADATA(IID "myplugin" FILE jsonFile) \
	    explicit classname() {} \
	};

     In the CMake buildsystem of the library one calls

	ecm_setup_qtplugin_macro_names(
	    MACRO_NAMES
	       EXPORT_MYPLUGIN_WITH_JSON
	)

     to instruct automoc about the usage of that macro in the sources of the li-
     brary itself.

     Given  the  software installs a library including the header with the macro
     definition and a CMake config file, so 3rd-party can create additional plu-
     gins by linking against the library, one passes additionally the name of  a
     variable  which shall be set as value the CMake code needed to instruct au-
     tomoc about the usage of that macro.

	ecm_setup_qtplugin_macro_names(
	    MACRO_NAMES
	       EXPORT_MYPLUGIN_WITH_JSON
	    CONFIG_CODE_VARIABLE
	       PACKAGE_SETUP_AUTOMOC_VARIABLES
	)

     This variable then is  used  in  the  template  file  (e.g.   MyProjectCon-
     fig.cmake.in)  for  the  libaryas	installed CMake config file and that way
     will ensure that in the  3rd-party  pluginas  buildsystem	automoc  is  in-
     structed as well as needed:

	@PACKAGE_SETUP_AUTOMOC_VARIABLES@

     Since 5.45.0.

   ECMSetupVersion
     Handle library version information.

	ecm_setup_version(<version>
			  VARIABLE_PREFIX <prefix>
			  [SOVERSION <soversion>]
			  [VERSION_HEADER <filename>]
			  [PACKAGE_VERSION_FILE <filename> [COMPATIBILITY <compat>]] )

     This  parses  a  version string and sets up a standard set of version vari-
     ables.  It can optionally also create a C version header file and	a  CMake
     package version file to install along with the library.

     If  the  <version> argument is of the form <major>.<minor>.<patch> (or <ma-
     jor>.<minor>.<patch>.<tweak>), The following CMake variables are set:

	<prefix>_VERSION_MAJOR	- <major>
	<prefix>_VERSION_MINOR	- <minor>
	<prefix>_VERSION_PATCH	- <patch>
	<prefix>_VERSION	- <version>
	<prefix>_SOVERSION	- <soversion>, or <major> if SOVERSION was not given

     For backward-compatibility also this variable is set (only if  the  minimum
     required version of ECM is < 5.83):

	<prefix>_VERSION_STRING - <version> (use <prefix>_VERSION instead)

     With  CMake  versions  older  than 4.0.0 and if CMake policy CMP0048 is not
     NEW, the following CMake variables will also be set:

	PROJECT_VERSION_MAJOR	- <major>
	PROJECT_VERSION_MINOR	- <minor>
	PROJECT_VERSION_PATCH	- <patch>
	PROJECT_VERSION 	- <version>

     For backward-compatibility, if CMake policy CMP0048 is not NEW,  also  this
     variable is set (only if the minimum required version of ECM is < 5.83):

	PROJECT_VERSION_STRING	- <version> (use PROJECT_VERSION instead)

     If  the  VERSION_HEADER option is used, a simple C header is generated with
     the given filename. If filename is a relative path, it  is  interpreted  as
     relative  to  CMAKE_CURRENT_BINARY_DIR.   The generated header contains the
     following macros:

	<prefix>_VERSION_MAJOR	- <major> as an integer
	<prefix>_VERSION_MINOR	- <minor> as an integer
	<prefix>_VERSION_PATCH	- <patch> as an integer
	<prefix>_VERSION_STRING - <version> as a C string
	<prefix>_VERSION	- the version as an integer

     <prefix>_VERSION has <patch> in the bottom 8 bits, <minor> in  the  next  8
     bits and <major> in the remaining bits.  Note that <patch> and <minor> must
     be less than 256.

     If  the PACKAGE_VERSION_FILE option is used, a simple CMake package version
     file is created using the write_basic_package_version_file() macro provided
     by CMake. It should be installed in the same location as  the  Config.cmake
     file  of  the  library  so  that it can be found by find_package().  If the
     filename is a relative path, it is interpreted as	relative  to  CMAKE_CUR-
     RENT_BINARY_DIR.	The   optional	COMPATIBILITY  option  is  forwarded  to
     write_basic_package_version_file(), and defaults to AnyNewerVersion.

     With CMake versions >= 4.0.0 or if CMake policy CMP0048 is NEW, an alterna-
     tive form of the command is available:

	ecm_setup_version(PROJECT
			  [VARIABLE_PREFIX <prefix>]
			  [SOVERSION <soversion>]
			  [VERSION_HEADER <filename>]
			  [PACKAGE_VERSION_FILE <filename>] )

     This will use the version information set by the project() command.   VARI-
     ABLE_PREFIX  defaults  to	the project name.  Note that PROJECT must be the
     first argument.  In all other respects, it behaves like the other	form  of
     the command.

     Since pre-1.0.0.

     COMPATIBILITY option available since 1.6.0.

   ECMSourceVersionControl
     Tries  to determine whether the source is under version control (git clone,
     svn checkout, etc).

     ECM_SOURCE_UNDER_VERSION_CONTROL is  set  when  indication  is  found  that
     CMAKE_SOURCE_DIR is under version control.

     Since 5.63

   ECMUninstallTarget
     Add an uninstall target.

     By  including  this module, an uninstall target will be added to your CMake
     project. This will remove all files installed (or updated)  by  a	previous
     invocation of the install target. It will not remove files created or modi-
     fied  by  an  install(SCRIPT) or install(CODE) command; you should create a
     custom uninstallation target for these and use add_dependency to  make  the
     uninstall target depend on it:

	include(ECMUninstallTarget)
	install(SCRIPT install-foo.cmake)
	add_custom_target(uninstall_foo COMMAND ${CMAKE_COMMAND} -P uninstall-foo.cmake)
	add_dependency(uninstall uninstall_foo)

     The  target  will fail if the install target has not yet been run (so it is
     not possible to run CMake on the project and then immediately run the unin-
     stall target).

     WARNING:
	CMake deliberately does not provide an uninstall target  by  default  on
	the basis that such a target has the potential to remove important files
	from a useras computer. Use with caution.

     Since 1.7.0.

   ECMUseFindModules
     Selectively use some of the find modules provided by extra-cmake-modules.

     This  module  is  automatically available once extra-cmake-modules has been
     found, so it is not necessary to include(ECMUseFindModules) explicitly.

	ecm_use_find_modules(DIR <dir>
			     MODULES module1.cmake [module2.cmake [...]]
			     [NO_OVERRIDE])

     This allows selective use of the find modules provided  by  ECM,  including
     deferring to CMakeas versions of those modules if it has them.  Rather than
     adding	${ECM_FIND_MODULE_DIR}	  to	CMAKE_MODULE_PATH,    you    use
     ecm_use_find_modules() to copy the modules you want to a local (build)  di-
     rectory, and add that to CMAKE_MODULE_PATH.

     The  find modules given to MODULES will be copied to the directory given by
     DIR (which should be located in ${CMAKE_BINARY_DIR} and added to CMAKE_MOD-
     ULE_PATH).  If NO_OVERRIDE is given, only	modules  not  also  provided  by
     CMake will be copied.

     Example:

	find_package(ECM REQUIRED)
	ecm_use_find_modules(
	    DIR ${CMAKE_BINARY_DIR}/cmake
	    MODULES FindEGL.cmake
	    NO_OVERRIDE
	)
	set(CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR}/cmake)

     This example will make FindEGL.cmake available in your project, but only as
     long  as  it is not yet part of CMake. Calls to find_package(EGL) will then
     make use of this copied module (or the CMake module if it exists).

     Another possible use for this macro is to take copies of find modules  that
     can  be  installed along with config files if they are required as a depen-
     dency (for example, if targets provided by the find module are in the  link
     interface of a library).

     Since pre-1.0.0.

   ECMWinResolveSymlinks
     Resolve pseudo-symlinks created by git when cloning on Windows.

	ecm_win_resolve_symlinks(<dir>)

     When  git checks out a repository with UNIX symlinks on Windows machine, it
     creates a text file for each symlink, containing a  relative  path  to  the
     real  file.   This function would recursively walk over specified directory
     and replace pseudo-symlinks with corresponding  real  fileas  contents.  It
     would then run git update-index --assume-unchanged on them to trick git.

     This is useful for projects like abreeze-iconsa that contain many identical
     icons implemented as symlinks.

     Since 5.28

   QtVersionOption
     Adds  a  build option to select the major Qt version if necessary, that is,
     if the major Qt version has not yet been determined otherwise  (e.g.  by  a
     corresponding  find_package()  call).  This module is typically included by
     other modules requiring knowledge about the major Qt version.

     If the ECM version passed to find_package	was  at  least	5.240.0  Qt6  is
     picked by default.  Otherwise Qt5 is picked.

     QT_MAJOR_VERSION is defined to either be a5a or a6a.

     Since 5.82.0.

SEE ALSO
     ecm(7), ecm-find-modules(7), ecm-kde-modules(7)

COPYRIGHT
     KDE Developers

6.28				  Jul 31, 2026			  ECM-MODULES(7)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=ecm-modules&sektion=7&manpath=FreeBSD+Ports+15.1.quarterly>

home | help