diff --git a/modules/ECMGenerateQmlTypes.cmake b/modules/ECMGenerateQmlTypes.cmake new file mode 100644 --- /dev/null +++ b/modules/ECMGenerateQmlTypes.cmake @@ -0,0 +1,73 @@ +#.rst: +# ECMGenerateQmlTypes +# ----------- +# +# Generates plugins.qmltypes files for QML plugins. +# +# :: +# +# ecm_generate_qmltypes( 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 doesn't need updating. +# +# +# Since 5.33.0 + +#============================================================================= +# Copyright 2017 Aleix Pol Gonzalez +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +include(CMakeParseArguments) +function(ecm_generate_qmltypes) + set(options) + set(oneValueArgs DESTINATION) + cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "" ${ARGN}) + + set(generatedFile ${CMAKE_CURRENT_SOURCE_DIR}/plugins.qmltypes) + add_custom_target(qmltypes DEPENDS ${generatedFile}) + add_custom_command( + OUTPUT ${generatedFile} + COMMAND qmlplugindump -nonrelocatable ${ARG_UNPARSED_ARGUMENTS} ${KDE_INSTALL_QMLDIR} -output ${generatedFile} + ) + install(FILES ${generatedFile} DESTINATION "${ARG_DESTINATION}") + + set(testname "qmltypes-${ARG_UNPARSED_ARGUMENTS}") + string(REPLACE ";" - testname "${testname}") + + string(REPLACE ";" / processedArgs "${ARG_UNPARSED_ARGUMENTS}") + + add_test(NAME ${testname} COMMAND + cmake -DARG_UNPARSED_ARGUMENTS=${processedArgs} -DKDE_INSTALL_QMLDIR=${KDE_INSTALL_QMLDIR} -DINPUT=${generatedFile} -P ${ECM_MODULE_DIR}/test_execute_and_compare.cmake + ) +endfunction() diff --git a/modules/test_execute_and_compare.cmake b/modules/test_execute_and_compare.cmake new file mode 100644 --- /dev/null +++ b/modules/test_execute_and_compare.cmake @@ -0,0 +1,11 @@ +string(REPLACE / ";" processedArgs "${ARG_UNPARSED_ARGUMENTS}") + +execute_process(COMMAND qmlplugindump -nonrelocatable ${processedArgs} ${KDE_INSTALL_QMLDIR} -output ${CMAKE_CURRENT_SOURCE_DIR}/plugins.qmltypes RESULT_VARIABLE code) +if(code) + message(FATAL_ERROR "Could not call qmlplugindump successfully. Exited with code ${code}") +endif() + +execute_process(COMMAND diff -I "//*" ${INPUT} ${CMAKE_CURRENT_SOURCE_DIR}/plugins.qmltypes RESULT_VARIABLE code OUTPUT_VARIABLE out) +if(code) + message(FATAL_ERROR "both plugin dumps differ:\n${out}") +endif()