diff options
| -rw-r--r-- | docs/find-module/FindQtWaylandScanner.rst | 1 | ||||
| -rw-r--r-- | docs/find-module/FindWaylandScanner.rst | 1 | ||||
| -rw-r--r-- | find-modules/FindQtWaylandScanner.cmake | 192 | ||||
| -rw-r--r-- | find-modules/FindWaylandScanner.cmake | 169 | 
4 files changed, 363 insertions, 0 deletions
| diff --git a/docs/find-module/FindQtWaylandScanner.rst b/docs/find-module/FindQtWaylandScanner.rst new file mode 100644 index 00000000..addc9128 --- /dev/null +++ b/docs/find-module/FindQtWaylandScanner.rst @@ -0,0 +1 @@ +.. ecm-module:: ../../find-modules/FindQtWaylandScanner.cmake diff --git a/docs/find-module/FindWaylandScanner.rst b/docs/find-module/FindWaylandScanner.rst new file mode 100644 index 00000000..7dac0256 --- /dev/null +++ b/docs/find-module/FindWaylandScanner.rst @@ -0,0 +1 @@ +.. ecm-module:: ../../find-modules/FindWaylandScanner.cmake diff --git a/find-modules/FindQtWaylandScanner.cmake b/find-modules/FindQtWaylandScanner.cmake new file mode 100644 index 00000000..acd7e0b2 --- /dev/null +++ b/find-modules/FindQtWaylandScanner.cmake @@ -0,0 +1,192 @@ +#.rst: +# FindQtWaylandScanner +# -------------------- +# +# Try to find qtwaylandscanner on a Unix system. +# +# If the qtwaylandscanner executable is not in your PATH, you can provide +# an alternative name or full path location with the ``QtWaylandScanner_EXECUTABLE`` +# variable. +# +# This will define the following variables: +# +# ``QtWaylandScanner_FOUND`` +#     True if qtwaylandscanner is available +# +# ``QtWaylandScanner_EXECUTABLE`` +#     The qtwaylandscanner executable. +# +# If ``QtWaylandScanner_FOUND`` is TRUE, it will also define the following imported +# target: +# +# ``Wayland::QtScanner`` +#     The qtwaylandscanner executable. +# +# This module provides the following functions to generate C++ protocol +# implementations: +# +#   - ``ecm_add_qtwayland_client_protocol`` +#   - ``ecm_add_qtwayland_server_protocol`` +# +# :: +# +#   ecm_add_qtwayland_client_protocol(<source_files_var> +#                                     PROTOCOL <xmlfile> +#                                     BASENAME <basename> +#                                     [PREFIX <prefix>]) +# +# Generate C++ wrapper to Wayland client protocol files from ``<xmlfile>`` +# XML definition for the ``<basename>`` interface and append those files +# to ``<source_files_var>``.  Pass the ``<prefix>`` argument if the interface +# names don't start with ``qt_`` or ``wl_``. +# +# WaylandScanner is required and will be searched for. +# +# :: +# +#   ecm_add_qtwayland_server_protocol(<source_files_var> +#                                     PROTOCOL <xmlfile> +#                                     BASENAME <basename> +#                                     [PREFIX <prefix>]) +# +# Generate C++ wrapper to Wayland server protocol files from ``<xmlfile>`` +# XML definition for the ``<basename>`` interface and append those files +# to ``<source_files_var>``.  Pass the ``<prefix>`` argument if the interface +# names don't start with ``qt_`` or ``wl_``. +# +# WaylandScanner is required and will be searched for. + +#============================================================================= +# Copyright 2012-2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the copyright +#    notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +#    notice, this list of conditions and the following disclaimer in the +#    documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +#    derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#============================================================================= + +include(${CMAKE_CURRENT_LIST_DIR}/ECMFindModuleHelpersStub.cmake) + +ecm_find_package_version_check(QtWaylandScanner) + +if(NOT WIN32) +    # Find qtwaylandscanner +    find_program(QtWaylandScanner_EXECUTABLE NAMES qtwaylandscanner) + +    include(FindPackageHandleStandardArgs) +    find_package_handle_standard_args(QtWaylandScanner +        FOUND_VAR +            QtWaylandScanner_FOUND +        REQUIRED_VARS +            QtWaylandScanner_EXECUTABLE +    ) + +    mark_as_advanced(QtWaylandScanner_EXECUTABLE) + +    if(NOT TARGET Wayland::QtScanner AND QtWaylandScanner_FOUND) +        add_executable(Wayland::QtScanner IMPORTED) +        set_target_properties(Wayland::QtScanner PROPERTIES +            IMPORTED_LOCATION "${QtWaylandScanner_EXECUTABLE}" +        ) +    endif() +else() +    message(STATUS "Wayland and QtWayland are not available on Windows.") +    set(QtWaylandScanner_FOUND FALSE) +endif() + +include(FeatureSummary) +set_package_properties(QtWaylandScanner PROPERTIES +    URL "http://qt.io" +    DESCRIPTION "Executable that converts XML protocol files to C++ code" +) + + +include(CMakeParseArguments) + +function(ecm_add_qtwayland_client_protocol out_var) +    # Parse arguments +    set(oneValueArgs PROTOCOL BASENAME PREFIX) +    cmake_parse_arguments(ARGS "" "${oneValueArgs}" "" ${ARGN}) + +    if(ARGS_UNPARSED_ARGUMENTS) +        message(FATAL_ERROR "Unknown keywords given to ecm_add_qtwayland_client_protocol(): \"${ARGS_UNPARSED_ARGUMENTS}\"") +    endif() + +    set(_prefix "${ARGS_PREFIX}") + +    find_package(WaylandScanner REQUIRED QUIET) +    ecm_add_wayland_client_protocol(${out_var} +                                    PROTOCOL ${ARGS_PROTOCOL} +                                    BASENAME ${ARGS_BASENAME}) + +    get_filename_component(_infile ${ARGS_PROTOCOL} ABSOLUTE) +    set(_cheader "${CMAKE_CURRENT_BINARY_DIR}/wayland-${ARGS_BASENAME}-client-protocol.h") +    set(_header "${CMAKE_CURRENT_BINARY_DIR}/qwayland-${ARGS_BASENAME}.h") +    set(_code "${CMAKE_CURRENT_BINARY_DIR}/qwayland-${ARGS_BASENAME}.cpp") + +    set_source_files_properties(${_header} ${_code} GENERATED) + +    add_custom_command(OUTPUT "${_header}" +        COMMAND ${QtWaylandScanner_EXECUTABLE} client-header ${_infile} "" ${_prefix} > ${_header} +        DEPENDS ${_infile} ${_cheader} VERBATIM) + +    add_custom_command(OUTPUT "${_code}" +        COMMAND ${QtWaylandScanner_EXECUTABLE} client-code ${_infile} "" ${_prefix} > ${_code} +        DEPENDS ${_infile} ${_header} VERBATIM) + +    list(APPEND ${out_var} "${_code}") +    set(${out_var} ${${out_var}} PARENT_SCOPE) +endfunction() + + +function(ecm_add_qtwayland_server_protocol out_var) +    # Parse arguments +    set(oneValueArgs PROTOCOL BASENAME PREFIX) +    cmake_parse_arguments(ARGS "" "${oneValueArgs}" "" ${ARGN}) + +    if(ARGS_UNPARSED_ARGUMENTS) +        message(FATAL_ERROR "Unknown keywords given to ecm_add_qtwayland_server_protocol(): \"${ARGS_UNPARSED_ARGUMENTS}\"") +    endif() + +    set(_prefix "${ARGS_PREFIX}") + +    find_package(WaylandScanner REQUIRED QUIET) +    ecm_add_wayland_server_protocol(${out_var} +                                    PROTOCOL ${ARGS_PROTOCOL} +                                    BASENAME ${ARGS_BASENAME}) + +    get_filename_component(_infile ${ARGS_PROTOCOL} ABSOLUTE) +    set(_header "${CMAKE_CURRENT_BINARY_DIR}/qwayland-server-${ARGS_BASENAME}.h") +    set(_code "${CMAKE_CURRENT_BINARY_DIR}/qwayland-server-${ARGS_BASENAME}.cpp") + +    set_source_files_properties(${_header} ${_code} GENERATED) + +    add_custom_command(OUTPUT "${_header}" +        COMMAND ${QtWaylandScanner_EXECUTABLE} server-header ${_infile} "" ${_prefix} > ${_header} +        DEPENDS ${_infile} VERBATIM) + +    add_custom_command(OUTPUT "${_code}" +        COMMAND ${QtWaylandScanner_EXECUTABLE} server-code ${_infile} "" ${_prefix} > ${_code} +        DEPENDS ${_infile} ${_header} VERBATIM) + +    list(APPEND ${out_var} "${_code}") +    set(${out_var} ${${out_var}} PARENT_SCOPE) +endfunction() diff --git a/find-modules/FindWaylandScanner.cmake b/find-modules/FindWaylandScanner.cmake new file mode 100644 index 00000000..4cade50f --- /dev/null +++ b/find-modules/FindWaylandScanner.cmake @@ -0,0 +1,169 @@ +#.rst: +# FindWaylandScanner +# ------------------ +# +# Try to find wayland-scanner on a Unix system. +# +# If the wayland-scanner executable is not in your PATH, you can provide +# an alternative name or full path location with the ``WaylandScanner_EXECUTABLE`` +# variable. +# +# This will define the following variables: +# +# ``WaylandScanner_FOUND`` +#     True if wayland-scanner is available. +# +# ``WaylandScanner_EXECUTABLE`` +#     The wayland-scanner executable. +# +# If ``WaylandScanner_FOUND`` is TRUE, it will also define the following imported +# target: +# +# ``Wayland::Scanner`` +#     The wayland-scanner executable. +# +# This module provides the following functions to generate C protocol +# implementations: +# +#   - ``ecm_add_wayland_client_protocol`` +#   - ``ecm_add_wayland_server_protocol`` +# +# :: +# +#   ecm_add_wayland_client_protocol(<source_files_var> +#                                   PROTOCOL <xmlfile> +#                                   BASENAME <basename>) +# +# Generate Wayland client protocol files from ``<xmlfile>`` XML +# definition for the ``<basename>`` interface and append those files +# to ``<source_files_var>``. +# +# :: +# +#   ecm_add_wayland_server_protocol(<source_files_var> +#                                   PROTOCOL <xmlfile> +#                                   BASENAME <basename>) +# +# Generate Wayland server protocol files from ``<xmlfile>`` XML +# definition for the ``<basename>`` interface and append those files +# to ``<source_files_var>``. + +#============================================================================= +# Copyright 2012-2014 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the copyright +#    notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +#    notice, this list of conditions and the following disclaimer in the +#    documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +#    derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#============================================================================= + +include(${CMAKE_CURRENT_LIST_DIR}/ECMFindModuleHelpersStub.cmake) + +ecm_find_package_version_check(WaylandScanner) + +if(NOT WIN32) +    # Find wayland-scanner +    find_program(WaylandScanner_EXECUTABLE NAMES wayland-scanner) + +    include(FindPackageHandleStandardArgs) +    find_package_handle_standard_args(WaylandScanner +        FOUND_VAR +            WaylandScanner_FOUND +        REQUIRED_VARS +            WaylandScanner_EXECUTABLE +    ) + +    mark_as_advanced(WaylandScanner_EXECUTABLE) + +    if(NOT TARGET Wayland::Scanner AND WaylandScanner_FOUND) +        add_executable(Wayland::Scanner IMPORTED) +        set_target_properties(Wayland::Scanner PROPERTIES +            IMPORTED_LOCATION "${WaylandScanner_EXECUTABLE}" +        ) +    endif() +else() +    message(STATUS "Wayland is not available on Windows.") +    set(WaylandScanner_FOUND FALSE) +endif() + +include(FeatureSummary) +set_package_properties(WaylandScanner PROPERTIES +    URL "http://wayland.freedesktop.org" +    DESCRIPTION "Executable that converts XML protocol files to C code" +) + + +include(CMakeParseArguments) + +function(ecm_add_wayland_client_protocol out_var) +    # Parse arguments +    set(oneValueArgs PROTOCOL BASENAME) +    cmake_parse_arguments(ARGS "" "${oneValueArgs}" "" ${ARGN}) + +    if(ARGS_UNPARSED_ARGUMENTS) +        message(FATAL_ERROR "Unknown keywords given to ecm_add_wayland_client_protocol(): \"${ARGS_UNPARSED_ARGUMENTS}\"") +    endif() + +    get_filename_component(_infile ${ARGS_PROTOCOL} ABSOLUTE) +    set(_client_header "${CMAKE_CURRENT_BINARY_DIR}/wayland-${ARGS_BASENAME}-client-protocol.h") +    set(_code "${CMAKE_CURRENT_BINARY_DIR}/wayland-${ARGS_BASENAME}-protocol.c") + +    set_source_files_properties(${_client_header} GENERATED) +    set_source_files_properties(${_code} GENERATED) + +    add_custom_command(OUTPUT "${_client_header}" +        COMMAND ${WaylandScanner_EXECUTABLE} client-header < ${_infile} > ${_client_header} +        DEPENDS ${_infile} VERBATIM) + +    add_custom_command(OUTPUT "${_code}" +        COMMAND ${WaylandScanner_EXECUTABLE} code < ${_infile} > ${_code} +        DEPENDS ${_infile} ${_client_header} VERBATIM) + +    list(APPEND ${out_var} "${_client_header}" "${_code}") +    set(${out_var} ${${out_var}} PARENT_SCOPE) +endfunction() + + +function(ecm_add_wayland_server_protocol out_var) +    # Parse arguments +    set(oneValueArgs PROTOCOL BASENAME) +    cmake_parse_arguments(ARGS "" "${oneValueArgs}" "" ${ARGN}) + +    if(ARGS_UNPARSED_ARGUMENTS) +        message(FATAL_ERROR "Unknown keywords given to ecm_add_wayland_server_protocol(): \"${ARGS_UNPARSED_ARGUMENTS}\"") +    endif() + +    ecm_add_wayland_client_protocol(${out_var} +                                    PROTOCOL ${ARGS_PROTOCOL} +                                    BASENAME ${ARGS_BASENAME}) + +    get_filename_component(_infile ${ARGS_PROTOCOL} ABSOLUTE) +    set(_server_header "${CMAKE_CURRENT_BINARY_DIR}/wayland-${ARGS_BASENAME}-server-protocol.h") + +    set_source_files_properties(${_server_header} GENERATED) + +    add_custom_command(OUTPUT "${_server_header}" +        COMMAND ${WaylandScanner_EXECUTABLE} server-header < ${_infile} > ${_server_header} +        DEPENDS ${_infile} VERBATIM) + +    list(APPEND ${out_var} "${_server_header}") +    set(${out_var} ${${out_var}} PARENT_SCOPE) +endfunction() | 
