From 3813fd1bc97fa6bb2189cc9586f77be4c30478d6 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 2 Aug 2021 15:01:13 +0200 Subject: Introduce ECMQmlModule.cmake This contains some helper functions to make it easier to create QML modules through CMake. It takes care of several things that currently need to be done manually. It adds four tests for the four primary ways that it can be used, either as shared/static library and with or without C++ plugin. --- tests/ECMQmlModuleTest/CMakeLists.txt | 32 +++++++++++ tests/ECMQmlModuleTest/QmlModule.qml | 11 ++++ tests/ECMQmlModuleTest/check.cmake.in | 64 ++++++++++++++++++++++ tests/ECMQmlModuleTest/qmldir_expected_depends | 6 ++ .../qmldir_expected_depends.license | 2 + tests/ECMQmlModuleTest/qmldir_expected_full | 5 ++ .../ECMQmlModuleTest/qmldir_expected_full.license | 2 + tests/ECMQmlModuleTest/qmldir_expected_qmlonly | 3 + .../qmldir_expected_qmlonly.license | 2 + tests/ECMQmlModuleTest/qmlmodule.cpp | 14 +++++ tests/ECMQmlModuleTest/qmlmodule.h | 21 +++++++ 11 files changed, 162 insertions(+) create mode 100644 tests/ECMQmlModuleTest/CMakeLists.txt create mode 100644 tests/ECMQmlModuleTest/QmlModule.qml create mode 100644 tests/ECMQmlModuleTest/check.cmake.in create mode 100644 tests/ECMQmlModuleTest/qmldir_expected_depends create mode 100644 tests/ECMQmlModuleTest/qmldir_expected_depends.license create mode 100644 tests/ECMQmlModuleTest/qmldir_expected_full create mode 100644 tests/ECMQmlModuleTest/qmldir_expected_full.license create mode 100644 tests/ECMQmlModuleTest/qmldir_expected_qmlonly create mode 100644 tests/ECMQmlModuleTest/qmldir_expected_qmlonly.license create mode 100644 tests/ECMQmlModuleTest/qmlmodule.cpp create mode 100644 tests/ECMQmlModuleTest/qmlmodule.h (limited to 'tests/ECMQmlModuleTest') diff --git a/tests/ECMQmlModuleTest/CMakeLists.txt b/tests/ECMQmlModuleTest/CMakeLists.txt new file mode 100644 index 00000000..49d76594 --- /dev/null +++ b/tests/ECMQmlModuleTest/CMakeLists.txt @@ -0,0 +1,32 @@ +# +# SPDX-FileCopyrightText: 2021 Arjen Hiemstra +# +# SPDX-License-Identifier: BSD-3-Clause + +project(extra-cmake-modules) +cmake_minimum_required(VERSION 3.5) + +set(ECM_MODULE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../modules) +set(CMAKE_MODULE_PATH "${ECM_FIND_MODULE_DIR}" "${ECM_MODULE_DIR}") + +find_package(Qt5 REQUIRED COMPONENTS Qml) +include(ECMQmlModule) + +if(QML_ONLY) + ecm_add_qml_module(TestModule URI Test NO_PLUGIN) +else() + ecm_add_qml_module(TestModule URI Test) + target_sources(TestModule PRIVATE qmlmodule.cpp) + target_link_libraries(TestModule Qt5::Qml) +endif() + +if (DEPENDS) + ecm_add_qml_module_dependencies(TestModule DEPENDS OtherTest) +endif() + +ecm_target_qml_sources(TestModule SOURCES QmlModule.qml) + +ecm_finalize_qml_module(TestModule DESTINATION "test") + +# this will be run by CTest +configure_file(check.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/check.cmake" @ONLY) diff --git a/tests/ECMQmlModuleTest/QmlModule.qml b/tests/ECMQmlModuleTest/QmlModule.qml new file mode 100644 index 00000000..ce16c9db --- /dev/null +++ b/tests/ECMQmlModuleTest/QmlModule.qml @@ -0,0 +1,11 @@ +/** + * SPDX-FileCopyrightText: 2021 Arjen Hiemstra + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +import QtQuick 2.15 + +Item { + +} diff --git a/tests/ECMQmlModuleTest/check.cmake.in b/tests/ECMQmlModuleTest/check.cmake.in new file mode 100644 index 00000000..af64a120 --- /dev/null +++ b/tests/ECMQmlModuleTest/check.cmake.in @@ -0,0 +1,64 @@ +# +# SPDX-FileCopyrightText: 2021 Arjen Hiemstra +# +# SPDX-License-Identifier: BSD-3-Clause + +set(SOURCE_DIR "@CMAKE_CURRENT_SOURCE_DIR@") +set(INSTALL_DIR "@CMAKE_INSTALL_PREFIX@/test") +set(SHARED "@BUILD_SHARED_LIBS@") +set(QML_ONLY "@QML_ONLY@") +set(DEPENDS "@DEPENDS@") + +function(check_file_exists file) + if (NOT EXISTS ${file}) + message(FATAL_ERROR "File \"${file}\" does not exist") + endif() +endfunction() + +function (check_file_contents) + cmake_parse_arguments(ARGS "" "GENERATED;EXPECTED" "" ${ARGN}) + + if (NOT EXISTS "${ARGS_GENERATED}") + message(FATAL_ERROR "${ARGS_GENERATED} was not generated") + endif() + file(READ "${ARGS_GENERATED}" generated_contents) + if (NOT EXISTS "${ARGS_EXPECTED}") + message(FATAL_ERROR "Original ${ARGS_EXPECTED} was not found") + endif() + file(READ "${ARGS_EXPECTED}" original_contents) + if (NOT "${generated_contents}" STREQUAL "${original_contents}") + message(FATAL_ERROR "${generated_file} contains '${generated_contents}' instead of '${original_contents}'") + endif() +endfunction() + +if (SHARED) + check_file_contents( + GENERATED "${INSTALL_DIR}/Test/QmlModule.qml" + EXPECTED "${SOURCE_DIR}/QmlModule.qml" + ) + + if (NOT QML_ONLY AND NOT DEPENDS) + check_file_exists("${INSTALL_DIR}/Test/libTestModule.so") + + check_file_contents( + GENERATED "${INSTALL_DIR}/Test/qmldir" + EXPECTED "${SOURCE_DIR}/qmldir_expected_full" + ) + endif() + + if (QML_ONLY AND NOT DEPENDS) + check_file_contents( + GENERATED "${INSTALL_DIR}/Test/qmldir" + EXPECTED "${SOURCE_DIR}/qmldir_expected_qmlonly" + ) + endif() + + if (DEPENDS) + check_file_contents( + GENERATED "${INSTALL_DIR}/Test/qmldir" + EXPECTED "${SOURCE_DIR}/qmldir_expected_depends" + ) + endif() +else() + check_file_exists("${INSTALL_DIR}/Test/libTestModule.a") +endif() diff --git a/tests/ECMQmlModuleTest/qmldir_expected_depends b/tests/ECMQmlModuleTest/qmldir_expected_depends new file mode 100644 index 00000000..2f373e2f --- /dev/null +++ b/tests/ECMQmlModuleTest/qmldir_expected_depends @@ -0,0 +1,6 @@ +# This file was automatically generated by ECMQmlModule and should not be modified +module Test +plugin TestModule +classname TestModule +depends OtherTest +QmlModule 1.0 QmlModule.qml diff --git a/tests/ECMQmlModuleTest/qmldir_expected_depends.license b/tests/ECMQmlModuleTest/qmldir_expected_depends.license new file mode 100644 index 00000000..8ebd85e2 --- /dev/null +++ b/tests/ECMQmlModuleTest/qmldir_expected_depends.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2021 Arjen Hiemstra +SPDX-License-Identifier: CC0 diff --git a/tests/ECMQmlModuleTest/qmldir_expected_full b/tests/ECMQmlModuleTest/qmldir_expected_full new file mode 100644 index 00000000..9a13246c --- /dev/null +++ b/tests/ECMQmlModuleTest/qmldir_expected_full @@ -0,0 +1,5 @@ +# This file was automatically generated by ECMQmlModule and should not be modified +module Test +plugin TestModule +classname TestModule +QmlModule 1.0 QmlModule.qml diff --git a/tests/ECMQmlModuleTest/qmldir_expected_full.license b/tests/ECMQmlModuleTest/qmldir_expected_full.license new file mode 100644 index 00000000..8ebd85e2 --- /dev/null +++ b/tests/ECMQmlModuleTest/qmldir_expected_full.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2021 Arjen Hiemstra +SPDX-License-Identifier: CC0 diff --git a/tests/ECMQmlModuleTest/qmldir_expected_qmlonly b/tests/ECMQmlModuleTest/qmldir_expected_qmlonly new file mode 100644 index 00000000..01823063 --- /dev/null +++ b/tests/ECMQmlModuleTest/qmldir_expected_qmlonly @@ -0,0 +1,3 @@ +# This file was automatically generated by ECMQmlModule and should not be modified +module Test +QmlModule 1.0 QmlModule.qml diff --git a/tests/ECMQmlModuleTest/qmldir_expected_qmlonly.license b/tests/ECMQmlModuleTest/qmldir_expected_qmlonly.license new file mode 100644 index 00000000..8ebd85e2 --- /dev/null +++ b/tests/ECMQmlModuleTest/qmldir_expected_qmlonly.license @@ -0,0 +1,2 @@ +SPDX-FileCopyrightText: 2021 Arjen Hiemstra +SPDX-License-Identifier: CC0 diff --git a/tests/ECMQmlModuleTest/qmlmodule.cpp b/tests/ECMQmlModuleTest/qmlmodule.cpp new file mode 100644 index 00000000..a1552a86 --- /dev/null +++ b/tests/ECMQmlModuleTest/qmlmodule.cpp @@ -0,0 +1,14 @@ +/** + * SPDX-FileCopyrightText: 2021 Arjen Hiemstra + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "qmlmodule.h" + +#include + +void QmlModule::registerTypes(const char* uri) +{ + Q_ASSERT(QLatin1String(uri) == QLatin1String("Test")); +} diff --git a/tests/ECMQmlModuleTest/qmlmodule.h b/tests/ECMQmlModuleTest/qmlmodule.h new file mode 100644 index 00000000..49cd83a9 --- /dev/null +++ b/tests/ECMQmlModuleTest/qmlmodule.h @@ -0,0 +1,21 @@ +/** + * SPDX-FileCopyrightText: 2021 Arjen Hiemstra + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef QMLMODULE_H +#define QMLMODULE_H + +#include + +class QmlModule : public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") + +public: + void registerTypes(const char* uri) override; +}; + +#endif -- cgit v1.2.1