aboutsummaryrefslogtreecommitdiff
path: root/find-modules/FindWayland.cmake
diff options
context:
space:
mode:
authorAlex Merry <alex.merry@kde.org>2014-03-06 23:01:18 +0000
committerAlex Merry <alex.merry@kde.org>2014-03-17 18:05:23 +0000
commitf686ff75f6e76c5ec1c1a485bae907ca0e814d21 (patch)
treebe6ac3ea8a65781a862a0be915a89ea890851e16 /find-modules/FindWayland.cmake
parent7a1bcb0bcf63018b42a297a4dcf122beabd9013c (diff)
downloadextra-cmake-modules-f686ff75f6e76c5ec1c1a485bae907ca0e814d21.tar.gz
extra-cmake-modules-f686ff75f6e76c5ec1c1a485bae907ca0e814d21.tar.bz2
Create ECMFindModuleHelpers module for common find-module code
This currently mostly contains macros for handling components; FindWayland and FindXCB are ported to use this module, which comes with various improvements for them. REVIEW: 116653
Diffstat (limited to 'find-modules/FindWayland.cmake')
-rw-r--r--find-modules/FindWayland.cmake236
1 files changed, 75 insertions, 161 deletions
diff --git a/find-modules/FindWayland.cmake b/find-modules/FindWayland.cmake
index a121de9f..c7c599c2 100644
--- a/find-modules/FindWayland.cmake
+++ b/find-modules/FindWayland.cmake
@@ -1,180 +1,95 @@
# Try to find Wayland on a Unix system
#
-# This will define:
+# This is a component-based find module, which makes use of the COMPONENTS
+# and OPTIONAL_COMPONENTS arguments to find_module. The following components
+# are available:
#
-# Wayland_FOUND - True if Wayland is available
-# Wayland_LIBRARIES - Link these to use Wayland
-# Wayland_INCLUDE_DIRS - Include directory for Wayland
-# Wayland_DEFINITIONS - Compiler flags for using Wayland
-# Wayland_VERSION_STRING - Found Wayland version
+# Client Server Cursor Egl
#
-# In addition the following more fine grained variables will be defined:
+# If no components are specified, this module will act as though all components
+# were passed to OPTIONAL_COMPONENTS.
#
-# Wayland_Client_FOUND Wayland_Client_INCLUDE_DIR Wayland_Client_LIBRARY Wayland_Client_VERSION_STRING
-# Wayland_Server_FOUND Wayland_Server_INCLUDE_DIR Wayland_Server_LIBRARY Wayland_Server_VERSION_STRING
-# Wayland_Cursor_FOUND Wayland_Cursor_INCLUDE_DIR Wayland_Cursor_LIBRARY Wayland_Cursor_VERSION_STRING
-# Wayland_Egl_FOUND Wayland_Egl_INCLUDE_DIR Wayland_Egl_LIBRARY Wayland_Egl_VERSION_STRING
+# This module will define the following variables, independently of the
+# components searched for or found:
#
-# Additionally, the following imported targets will be defined:
+# Wayland_FOUND - True if (the requestion version of) Wayland is available
+# Wayland_VERSION - Found Wayland version
#
-# Wayland::Client
-# Wayland::Server
-# Wayland::Cursor
-# Wayland::Egl
+# For each searched-for components, Wayland_<component>_FOUND will be set to true
+# if the corresponding Wayland library was found, and false otherwise. If
+# Wayland_<component>_FOUND is true, the imported target Wayland::<component> will be
+# defined. This module will also attempt to determine Wayland_*_VERSION variables
+# for each imported target, although Wayland_VERSION should normally be sufficient.
#
-# Copyright (c) 2014 Martin Gräßlin <mgraesslin@kde.org>
+# The following variable will also be defined for convenience, and for
+# compatibility with old-style find module conventions:
#
-# Redistribution and use is allowed according to the terms of the BSD license.
-# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
-
-if(CMAKE_VERSION VERSION_LESS 2.8.12)
- message(FATAL_ERROR "CMake 2.8.12 is required by FindWayland.cmake")
-endif()
-if(CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.12)
- message(AUTHOR_WARNING "Your project should require at least CMake 2.8.12 to use FindWayland.cmake")
-endif()
-
-set(knownComponents Client
- Server
- Cursor
- Egl
- )
-
-unset(unknownComponents)
-
-set(pkgConfigModules)
-
-if (Wayland_FIND_COMPONENTS)
- set(comps ${Wayland_FIND_COMPONENTS})
-else()
- set(comps ${knownComponents})
-endif()
-
-# iterate through the list of requested components, and check that we know them all.
-# If not, fail.
-foreach(comp ${comps})
- list(FIND knownComponents ${comp} index )
- if("${index}" STREQUAL "-1")
- list(APPEND unknownComponents "${comp}")
- else()
- if("${comp}" STREQUAL "Client")
- list(APPEND pkgConfigModules "wayland-client")
- elseif("${comp}" STREQUAL "Server")
- list(APPEND pkgConfigModules "wayland-server")
- elseif("${comp}" STREQUAL "Cursor")
- list(APPEND pkgConfigModules "wayland-cursor")
- elseif("${comp}" STREQUAL "Egl")
- list(APPEND pkgConfigModules "wayland-egl")
- endif()
- endif()
-endforeach()
+# Wayland_LIBRARIES - A list of all Wayland imported targets
+#=============================================================================
+# Copyright 2014 Martin Gräßlin <mgraesslin@kde.org>
+# Copyright 2014 Alex Merry <alex.merry@kde.org>
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file COPYING-CMAKE-SCRIPTS for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of extra-cmake-modules, substitute the full
+# License text for the above reference.)
-if(DEFINED unknownComponents)
- set(msgType STATUS)
- if(Wayland_FIND_REQUIRED)
- set(msgType FATAL_ERROR)
- endif()
- if(NOT Wayland_FIND_QUIETLY)
- message(${msgType} "Wayland: requested unknown components ${unknownComponents}")
- endif()
- return()
-endif()
+include(${CMAKE_CURRENT_LIST_DIR}/../modules/ECMFindModuleHelpers.cmake)
-macro(_wayland_handle_component _comp)
- set(_header )
- set(_lib )
- set(_pkgconfig_module_var)
- if("${_comp}" STREQUAL "Client")
- set(_header "wayland-client.h")
- set(_lib "wayland-client")
- set(_pkgconfig_module_var "wayland-client")
- elseif("${_comp}" STREQUAL "Server")
- set(_header "wayland-server.h")
- set(_lib "wayland-server")
- set(_pkgconfig_module_var "wayland-server")
- elseif("${_comp}" STREQUAL "Cursor")
- set(_header "wayland-cursor.h")
- set(_lib "wayland-cursor")
- set(_pkgconfig_module_var "wayland-cursor")
- elseif("${_comp}" STREQUAL "Egl")
- set(_header "wayland-egl.h")
- set(_lib "wayland-egl")
- set(_pkgconfig_module_var "wayland-egl")
- endif()
+ecm_find_package_version_check(Wayland)
- find_path(Wayland_${_comp}_INCLUDE_DIR
- NAMES ${_header}
- HINTS ${PKG_Wayland_INCLUDE_DIRS}
- )
- find_library(Wayland_${_comp}_LIBRARY
- NAMES ${_lib}
- HINTS ${PKG_Wayland_LIBRARY_DIRS}
+if(NOT WIN32)
+ set(Wayland_known_components
+ Client
+ Server
+ Cursor
+ Egl
)
+ foreach(_comp ${Wayland_known_components})
+ string(TOLOWER "${_comp}" _lc_comp)
+ set(Wayland_${_comp}_component_deps)
+ set(Wayland_${_comp}_pkg_config "wayland-${_lc_comp}")
+ set(Wayland_${_comp}_lib "wayland-${_lc_comp}")
+ set(Wayland_${_comp}_header "wayland-${_lc_comp}.h")
+ endforeach()
+ set(Wayland_Egl_component_deps Client)
- if(Wayland_${_comp}_INCLUDE_DIR AND Wayland_${_comp}_LIBRARY)
- list(APPEND Wayland_INCLUDE_DIRS ${Wayland_${_comp}_INCLUDE_DIR})
- list(APPEND Wayland_LIBRARIES ${Wayland_${_comp}_LIBRARY})
- endif()
-
- if(PKG_Wayland_VERSION AND NOT PKG_Wayland_${_pkgconfig_module_var}_VERSION)
- # this is what gets set if we only search for one module
- set(Wayland_${_comp}_VERSION_STRING "${PKG_Wayland_VERSION}")
- else()
- set(Wayland_${_comp}_VERSION_STRING "${PKG_Wayland_${_pkgconfig_module_var}_VERSION}")
- endif()
-
- if(NOT Wayland_VERSION_STRING)
- set(Wayland_VERSION_STRING ${Wayland_${_comp}_VERSION_STRING})
- endif()
-
- set(Wayland_${_comp}_FIND_VERSION "${Wayland_FIND_VERSION}")
- find_package_handle_standard_args(Wayland_${_comp}
- FOUND_VAR
- Wayland_${_comp}_FOUND
- REQUIRED_VARS
- Wayland_${_comp}_LIBRARY
- Wayland_${_comp}_INCLUDE_DIR
- VERSION_VAR
- Wayland_${_comp}_VERSION_STRING
- )
-
- mark_as_advanced(
- Wayland_${_comp}_LIBRARY
- Wayland_${_comp}_INCLUDE_DIR
+ ecm_find_package_parse_components(Wayland
+ RESULT_VAR Wayland_components
+ KNOWN_COMPONENTS ${Wayland_known_components}
+ )
+ ecm_find_package_handle_library_components(Wayland
+ COMPONENTS ${Wayland_components}
)
- if(Wayland_${_comp}_FOUND AND NOT TARGET Wayland::${_comp})
- add_library(Wayland::${_comp} UNKNOWN IMPORTED)
- set_target_properties(Wayland::${_comp} PROPERTIES
- IMPORTED_LOCATION "${Wayland_${_comp}_LIBRARY}"
- INTERFACE_COMPILE_OPTIONS "${Wayland_DEFINITIONS}"
- INTERFACE_INCLUDE_DIRECTORIES "${Wayland_${_comp}_INCLUDE_DIR}"
+ # If pkg-config didn't provide us with version information,
+ # try to extract it from wayland-version.h
+ # (Note that the version from wayland-egl.pc will probably be
+ # the Mesa version, rather than the Wayland version, but that
+ # version will be ignored as we always find wayland-client.pc
+ # first).
+ if(NOT Wayland_VERSION)
+ find_file(Wayland_VERSION_HEADER
+ NAMES wayland-version.h
+ HINTS ${Wayland_INCLUDE_DIRS}
)
- endif()
-endmacro()
-
-if(NOT WIN32)
- include(FindPackageHandleStandardArgs)
- # Use pkg-config to get the directories and then use these values
- # in the FIND_PATH() and FIND_LIBRARY() calls
- find_package(PkgConfig)
- # Invoke pkg_check_modules() in a loop because if we call it like this:
- # pkg_check_modules(PKG_Wayland QUIET ${pkgConfigModules})
- # and one of the components cannot be found, then it won't set any variable
- # at all.
- foreach(comp ${pkgConfigModules})
- pkg_check_modules(PKG_Wayland_${comp} QUIET ${comp})
- endforeach()
-
- set(Wayland_DEFINITIONS ${PKG_Wayland_CFLAGS_OTHER})
-
- foreach(comp ${comps})
- _wayland_handle_component(${comp})
- endforeach()
-
- if(Wayland_INCLUDE_DIRS)
- list(REMOVE_DUPLICATES Wayland_INCLUDE_DIRS)
+ mark_as_advanced(Wayland_VERSION_HEADER)
+ if(Wayland_VERSION_HEADER)
+ file(READ ${Wayland_VERSION_HEADER} _wayland_version_header_contents)
+ string(REGEX REPLACE
+ "^.*[ \\t]+WAYLAND_VERSION[ \\t]+\"([0-9.]*)\".*$"
+ "\\1"
+ Wayland_VERSION
+ "${_wayland_version_header_contents}"
+ )
+ unset(_wayland_version_header_contents)
+ endif()
endif()
find_package_handle_standard_args(Wayland
@@ -182,9 +97,8 @@ if(NOT WIN32)
Wayland_FOUND
REQUIRED_VARS
Wayland_LIBRARIES
- Wayland_INCLUDE_DIRS
VERSION_VAR
- Wayland_VERSION_STRING
+ Wayland_VERSION
HANDLE_COMPONENTS
)