# Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file LICENSE.rst or https://cmake.org/licensing for details. #[=======================================================================[.rst: FindKDE4 -------- .. note:: This module is specifically intended for KDE version 4, which is obsolete and no longer maintained. For modern application development using KDE technologies with CMake, use a newer version of KDE, and refer to the `KDE documentation `_. Finds the KDE 4 installation: .. code-block:: cmake find_package(KDE4 [...]) This module is a wrapper around the following upstream KDE 4 modules: ``FindKDE4Internal.cmake`` Upstream internal module, which finds the KDE 4 include directories, libraries, and KDE-specific preprocessor tools. It provides usage requirements for building KDE 4 software and defines several helper commands to simplify working with KDE 4 in CMake. ``KDE4Macros.cmake`` Upstream utility module that defines all additional KDE4-specific commands to use KDE 4 in CMake. For example: ``kde4_automoc()``, ``kde4_add_executable()``, ``kde4_add_library()``, ``kde4_add_ui_files()``, ``kde4_add_ui3_files()``, ``kde4_add_kcfg_files()``, ``kde4_add_kdeinit_executable()``, etc. Upstream KDE 4 modules are installed by the KDE 4 distribution package in ``$KDEDIRS/share/apps/cmake/modules/``. This path is automatically appended to the :variable:`CMAKE_MODULE_PATH` variable when calling ``find_package(KDE4)``, so any additional KDE 4 modules can be included in the project with :command:`include`. For example: ``KDE4Defaults.cmake`` Upstream internal module that sets some CMake options which are useful, but not required for building KDE 4 software. If these settings should be used, include this module after finding KDE 4: .. code-block:: cmake find_package(KDE4) include(KDE4Defaults) For usage details, refer to the upstream KDE 4 documentation. For example, at the top of the ``FindKDE4Internal`` module a complete documentation is available for all variables and commands these modules provide. Result Variables ^^^^^^^^^^^^^^^^ This module defines the following variables: ``KDE4_FOUND`` Boolean indicating whether KDE 4 was found. This variable is set by the upstream ``FindKDE4Internal`` module. Hints ^^^^^ This module accepts the following variables before calling the ``find_package(KDE4)``: ``ENV{KDEDIRS}`` Environment variable containing the path to the KDE 4 installation. KDE 4 is searched in the following directories in the given order: * :variable:`CMAKE_INSTALL_PREFIX` variable * ``KDEDIRS`` environment variable * ``/opt/kde4`` path Examples ^^^^^^^^ Example: Basic Usage """""""""""""""""""" Finding KDE 4 as required and using it in CMake: .. code-block:: cmake find_package(KDE4 REQUIRED) set(sources main.cpp mywidget.cpp mypart.cpp) # The kde4_*() commands are provided by the KDE4Macros module, which is # included automatically by FindKDE4, if KDE4 is found: kde4_automoc(${sources}) kde4_add_executable(example ${sources}) target_include_directories(example PRIVATE ${KDE4_INCLUDES}) target_link_libraries(example PRIVATE ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS}) install(TARGETS example DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES kfoo.desktop DESTINATION ${XDG_APPS_DIR}) Example: Full Featured Example """""""""""""""""""""""""""""" In the following example this module is used to find KDE 4 installation. .. code-block:: cmake project(kfoo) find_package(KDE4 REQUIRED) # Append path from where to include local project modules if any: list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) include_directories(${KDE4_INCLUDE_DIRS}) add_definitions(${KDE4_DEFINITIONS}) set(sources main.cpp myappl.cpp view.cpp) # If Qt designer UI files version 3 or 4 are available add them to the # sources variable: kde4_add_ui_files(sources maindialog.ui logindialog.ui) kde4_add_ui3_files(sources printerdlg.ui previewdlg.ui) # If there are files for the kconfig_compiler add them this way: kde4_add_kcfg_files(sources settings.kcfg) # When everything is listed, probably automoc is wanted: kde4_automoc(${sources}) # Finally, specify what to build: kde4_add_executable(kfoo ${sources}) The ``kde4_add_executable()`` command is a slightly extended version of the CMake command :command:`add_executable`. Additionally, it does some more ``RPATH`` handling and supports the ``KDE4_ENABLE_FINAL`` variable. The first argument is the name of the executable followed by a list of source files. If a library needs to be created instead of an executable, the ``kde4_add_library()`` can be used. It is an extended version of the :command:`add_library` command. It adds support for the ``KDE4_ENABLE_FINAL`` variable and under Windows it adds the ``-DMAKE_KFOO_LIB`` to the compile flags. .. code-block:: cmake find_package(KDE4 REQUIRED) # ... kde4_add_library(kfoo ${sources}) # Optionally, set the library version number if needed: set_target_properties(kfoo PROPERTIES VERSION 5.0.0 SOVERSION 5) KDE is very modular, so if a KPart, a control center module, or an ioslave needs to be created, here's how to do it: .. code-block:: cmake find_package(KDE4 REQUIRED) # ... kde4_add_plugin(kfoo ${sources}) Now, the application/library/plugin probably needs to link to some libraries. For this use the standard :command:`target_link_libraries` command. For every KDE library there are variables available in the form of ``KDE4_FOO_LIBS``. Use them to get also all depending libraries: .. code-block:: cmake target_link_libraries(kfoo ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS}) Example: The kdeinit Executable """"""""""""""""""""""""""""""" In the following example, the so called kdeinit executable is created. The ``kde4_add_kdeinit_executable()`` command creates both an executable with the given name and a library with the given name prefixed with ``kdeinit_``. The :command:`target_link_libraries` command adds all required libraries to the ``kdeinit_kbar`` library, and then links the ``kbar`` against the ``kdeinit_kbar``: .. code-block:: cmake find_package(KDE4 REQUIRED) # ... kde4_add_kdeinit_executable(kbar ${kbarSources}) target_link_libraries(kdeinit_kbar ${KDE4_KIO_LIBS}) target_link_libraries(kbar kdeinit_kbar) install(TARGETS kbar DESTINATION ${CMAKE_INSTALL_BINDIR}) install(TARGETS kdeinit_kbar DESTINATION ${CMAKE_INSTALL_LIBDIR}) Example: Removing Compile Definitions """"""""""""""""""""""""""""""""""""" Sometimes, a default compile definition passed to the compiler needs to be removed. The :command:`remove_definitions` command can be used. For example, by default, the KDE4 build system sets the ``-DQT_NO_STL`` flag. If the project code uses some of the Qt STL compatibility layer, this flag should be removed: .. code-block:: cmake find_package(KDE4 REQUIRED) add_definitions(${KDE4_DEFINITIONS}) # ... remove_definitions(-DQT_NO_STL) #]=======================================================================] # Author: Alexander Neundorf # If Qt3 has already been found, fail. if(QT_QT_LIBRARY) if(KDE4_FIND_REQUIRED) message( FATAL_ERROR "KDE4/Qt4 and Qt3 cannot be used together in one project.") else() if(NOT KDE4_FIND_QUIETLY) message( STATUS "KDE4/Qt4 and Qt3 cannot be used together in one project.") endif() return() endif() endif() file(TO_CMAKE_PATH "$ENV{KDEDIRS}" _KDEDIRS) # when cross compiling, searching kde4-config in order to run it later on # doesn't make a lot of sense. We'll have to do something about this. # Searching always in the target environment ? Then we get at least the correct one, # still it can't be used to run it. Alex # For KDE4 kde-config has been renamed to kde4-config find_program(KDE4_KDECONFIG_EXECUTABLE NAMES kde4-config # the suffix must be used since KDEDIRS can be a list of directories which don't have bin/ appended PATH_SUFFIXES bin HINTS ${CMAKE_INSTALL_PREFIX} ${_KDEDIRS} /opt/kde4 ONLY_CMAKE_FIND_ROOT_PATH ) if (NOT KDE4_KDECONFIG_EXECUTABLE) if (KDE4_FIND_REQUIRED) message(FATAL_ERROR "ERROR: Could not find KDE4 kde4-config") endif () endif () # when cross compiling, KDE4_DATA_DIR may be already preset if(NOT KDE4_DATA_DIR) if(CMAKE_CROSSCOMPILING) # when cross compiling, don't run kde4-config but use its location as install dir get_filename_component(KDE4_DATA_DIR "${KDE4_KDECONFIG_EXECUTABLE}" PATH) get_filename_component(KDE4_DATA_DIR "${KDE4_DATA_DIR}" PATH) else() # then ask kde4-config for the kde data dirs if(KDE4_KDECONFIG_EXECUTABLE) execute_process(COMMAND "${KDE4_KDECONFIG_EXECUTABLE}" --path data OUTPUT_VARIABLE _data_DIR ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) file(TO_CMAKE_PATH "${_data_DIR}" _data_DIR) # then check the data dirs for FindKDE4Internal.cmake find_path(KDE4_DATA_DIR cmake/modules/FindKDE4Internal.cmake HINTS ${_data_DIR}) endif() endif() endif() # if it has been found... if (KDE4_DATA_DIR) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${KDE4_DATA_DIR}/cmake/modules) if (KDE4_FIND_QUIETLY) set(_quiet QUIET) endif () if (KDE4_FIND_REQUIRED) set(_req REQUIRED) endif () # use FindKDE4Internal.cmake to do the rest find_package(KDE4Internal ${_req} ${_quiet} NO_POLICY_SCOPE) else () if (KDE4_FIND_REQUIRED) message(FATAL_ERROR "ERROR: cmake/modules/FindKDE4Internal.cmake not found in ${_data_DIR}") endif () set(KDE4_FOUND FALSE) endif ()