From 61a9291f5582f662a0a353a6c357df7430d0a904 Mon Sep 17 00:00:00 2001 From: Andrew Hayzen Date: Wed, 28 Jun 2023 18:38:40 +0100 Subject: [PATCH 1/6] examples: create a multi project to test multiple crates --- Cargo.toml | 3 + examples/CMakeLists.txt | 1 + examples/meta_project/CMakeLists.txt | 86 +++++++++++++++++++ examples/meta_project/cpp/main.cpp | 31 +++++++ examples/meta_project/qml/main.qml | 60 +++++++++++++ examples/meta_project/qml/qml.qrc | 12 +++ examples/meta_project/rust/main/Cargo.toml | 24 ++++++ examples/meta_project/rust/main/build.rs | 17 ++++ examples/meta_project/rust/main/src/lib.rs | 6 ++ .../meta_project/rust/main/src/main_object.rs | 44 ++++++++++ examples/meta_project/rust/sub1/Cargo.toml | 22 +++++ examples/meta_project/rust/sub1/build.rs | 18 ++++ examples/meta_project/rust/sub1/src/lib.rs | 13 +++ .../meta_project/rust/sub1/src/sub1_object.rs | 41 +++++++++ examples/meta_project/rust/sub2/Cargo.toml | 22 +++++ examples/meta_project/rust/sub2/build.rs | 17 ++++ examples/meta_project/rust/sub2/src/lib.rs | 13 +++ .../meta_project/rust/sub2/src/sub2_object.rs | 41 +++++++++ 18 files changed, 471 insertions(+) create mode 100644 examples/meta_project/CMakeLists.txt create mode 100644 examples/meta_project/cpp/main.cpp create mode 100644 examples/meta_project/qml/main.qml create mode 100644 examples/meta_project/qml/qml.qrc create mode 100644 examples/meta_project/rust/main/Cargo.toml create mode 100644 examples/meta_project/rust/main/build.rs create mode 100644 examples/meta_project/rust/main/src/lib.rs create mode 100644 examples/meta_project/rust/main/src/main_object.rs create mode 100644 examples/meta_project/rust/sub1/Cargo.toml create mode 100644 examples/meta_project/rust/sub1/build.rs create mode 100644 examples/meta_project/rust/sub1/src/lib.rs create mode 100644 examples/meta_project/rust/sub1/src/sub1_object.rs create mode 100644 examples/meta_project/rust/sub2/Cargo.toml create mode 100644 examples/meta_project/rust/sub2/build.rs create mode 100644 examples/meta_project/rust/sub2/src/lib.rs create mode 100644 examples/meta_project/rust/sub2/src/sub2_object.rs diff --git a/Cargo.toml b/Cargo.toml index ae34f3637..97030008e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,9 @@ members = [ "examples/demo_threading/rust", "examples/qml_features/rust", "examples/qml_minimal/rust", + "examples/meta_project/rust/main", + "examples/meta_project/rust/sub1", + "examples/meta_project/rust/sub2", "tests/basic_cxx_only/rust", "tests/basic_cxx_qt/rust", diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 7cec23b99..f7dc8f19c 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -9,6 +9,7 @@ # When using `cargo test` add_subdirectory(qml_features) add_subdirectory(qml_minimal) +add_subdirectory(meta_project) # TODO: get demo_threading working for wasm builds if(NOT BUILD_WASM) diff --git a/examples/meta_project/CMakeLists.txt b/examples/meta_project/CMakeLists.txt new file mode 100644 index 000000000..4f89ef7a4 --- /dev/null +++ b/examples/meta_project/CMakeLists.txt @@ -0,0 +1,86 @@ +# SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +# SPDX-FileContributor: Andrew Hayzen +# +# SPDX-License-Identifier: MIT OR Apache-2.0 + +cmake_minimum_required(VERSION 3.24) + +project(example_meta_project) + +# Rust always links against non-debug Windows runtime on *-msvc targets +# Note it is best to set this on the command line to ensure all targets are consistent +# https://github.com/corrosion-rs/corrosion/blob/master/doc/src/common_issues.md#linking-debug-cc-libraries-into-rust-fails-on-windows-msvc-targets +# https://github.com/rust-lang/rust/issues/39016 +if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL") +endif() + +if(BUILD_WASM) + # Ensure Rust build for the correct target + set(Rust_CARGO_TARGET wasm32-unknown-emscripten) + set(THREADS_PREFER_PTHREAD_FLAG ON) + find_package(Threads REQUIRED) +endif() + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CXXQT_QTCOMPONENTS Core Gui Qml QuickControls2 QuickTest Test) +if(NOT BUILD_WASM) + set(CXXQT_QTCOMPONENTS ${CXXQT_QTCOMPONENTS} QmlImportScanner) +endif() + +if(NOT USE_QT5) + find_package(Qt6 COMPONENTS ${CXXQT_QTCOMPONENTS}) +endif() +if(NOT Qt6_FOUND) + find_package(Qt5 5.15 COMPONENTS ${CXXQT_QTCOMPONENTS} REQUIRED) +endif() + +find_package(CxxQt QUIET) +if(NOT CxxQt_FOUND) + include(FetchContent) + FetchContent_Declare( + CxxQt + GIT_REPOSITORY https://github.com/kdab/cxx-qt-cmake.git + GIT_TAG main + ) + + FetchContent_MakeAvailable(CxxQt) +endif() + +cxx_qt_import_crate(MANIFEST_PATH rust/main/Cargo.toml CRATES qml_meta_project) +target_link_libraries(qml_meta_project INTERFACE Qt::Core Qt::Gui Qt::Qml Qt::QuickControls2) + +cxx_qt_import_qml_module(qml_meta_project_main + URI "com.kdab.cxx_qt.demo" + SOURCE_CRATE qml_meta_project) + +cxx_qt_import_qml_module(qml_meta_project_sub1 + URI "com.kdab.cxx_qt.demo.sub1" + SOURCE_CRATE qml_meta_project) + +cxx_qt_import_qml_module(qml_meta_project_sub2 + URI "com.kdab.cxx_qt.demo.sub2" + SOURCE_CRATE qml_meta_project) + +# Define the executable with the C++ source +if(BUILD_WASM) + # Currently need to use qt_add_executable + # for WASM builds, otherwise there is no + # HTML output. + # + # TODO: Figure out how to configure such that + # we can use add_executable for WASM + qt_add_executable(example_meta_project cpp/main.cpp qml/qml.qrc) +else() + add_executable(example_meta_project cpp/main.cpp qml/qml.qrc) +endif() + +# Link to the qml module, which in turn links to the Rust qml_meta_project library +target_link_libraries(example_meta_project PRIVATE Qt::Core Qt::Gui Qt::Qml qml_meta_project_main qml_meta_project_sub1 qml_meta_project_sub2) + +# If we are using a statically linked Qt then we need to import any qml plugins +qt_import_qml_plugins(example_meta_project) diff --git a/examples/meta_project/cpp/main.cpp b/examples/meta_project/cpp/main.cpp new file mode 100644 index 000000000..cf615d210 --- /dev/null +++ b/examples/meta_project/cpp/main.cpp @@ -0,0 +1,31 @@ +// clang-format off +// SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +// clang-format on +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 +#include +#include + +int +main(int argc, char* argv[]) +{ + QGuiApplication app(argc, argv); + + QQmlApplicationEngine engine; + + const QUrl url(QStringLiteral("qrc:/main.qml")); + QObject::connect( + &engine, + &QQmlApplicationEngine::objectCreated, + &app, + [url](QObject* obj, const QUrl& objUrl) { + if (!obj && url == objUrl) + QCoreApplication::exit(-1); + }, + Qt::QueuedConnection); + + engine.load(url); + + return app.exec(); +} diff --git a/examples/meta_project/qml/main.qml b/examples/meta_project/qml/main.qml new file mode 100644 index 000000000..18301e50f --- /dev/null +++ b/examples/meta_project/qml/main.qml @@ -0,0 +1,60 @@ +// SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import QtQuick.Window 2.12 + +import com.kdab.cxx_qt.demo 1.0 +import com.kdab.cxx_qt.demo.sub1 1.0 +import com.kdab.cxx_qt.demo.sub2 1.0 + +ApplicationWindow { + id: window + minimumHeight: 480 + minimumWidth: 640 + title: qsTr("CXX-Qt: Hello World") + visible: true + + MainObject { + id: main + } + + Sub1Object { + id: sub1 + } + + Sub2Object { + id: sub2 + } + + Column { + anchors.fill: parent + anchors.margins: 10 + spacing: 10 + + Label { + text: "Main: " + main.string + } + + Label { + text: "Sub1: " + sub1.string + } + + Label { + text: "Sub2: " + sub2.string + } + + Button { + text: "Increment Number" + + onClicked: { + main.increment(); + sub1.increment(); + sub2.increment(); + } + } + } +} diff --git a/examples/meta_project/qml/qml.qrc b/examples/meta_project/qml/qml.qrc new file mode 100644 index 000000000..69e2bfdf5 --- /dev/null +++ b/examples/meta_project/qml/qml.qrc @@ -0,0 +1,12 @@ + + + + + main.qml + + diff --git a/examples/meta_project/rust/main/Cargo.toml b/examples/meta_project/rust/main/Cargo.toml new file mode 100644 index 000000000..de1082d84 --- /dev/null +++ b/examples/meta_project/rust/main/Cargo.toml @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +# SPDX-FileContributor: Andrew Hayzen +# +# SPDX-License-Identifier: MIT OR Apache-2.0 +[package] +name = "qml_meta_project" +version = "0.1.0" +authors = ["Andrew Hayzen "] +edition = "2021" +license = "MIT OR Apache-2.0" + +[lib] +crate-type = ["staticlib"] + +[dependencies] +sub1 = { path = "../sub1" } +sub2 = { path = "../sub2" } + +cxx.workspace = true +cxx-qt.workspace = true +cxx-qt-lib.workspace = true + +[build-dependencies] +cxx-qt-build.workspace = true diff --git a/examples/meta_project/rust/main/build.rs b/examples/meta_project/rust/main/build.rs new file mode 100644 index 000000000..e5541b98a --- /dev/null +++ b/examples/meta_project/rust/main/build.rs @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +use cxx_qt_build::{CxxQtBuilder, QmlModule}; + +fn main() { + CxxQtBuilder::new() + .qt_module("Network") + .qml_module(QmlModule::<_, &str> { + uri: "com.kdab.cxx_qt.demo", + rust_files: &["src/main_object.rs"], + ..Default::default() + }) + .build(); +} diff --git a/examples/meta_project/rust/main/src/lib.rs b/examples/meta_project/rust/main/src/lib.rs new file mode 100644 index 000000000..a609c11c6 --- /dev/null +++ b/examples/meta_project/rust/main/src/lib.rs @@ -0,0 +1,6 @@ +// SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +mod main_object; diff --git a/examples/meta_project/rust/main/src/main_object.rs b/examples/meta_project/rust/main/src/main_object.rs new file mode 100644 index 000000000..f4b3892a5 --- /dev/null +++ b/examples/meta_project/rust/main/src/main_object.rs @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +#[cxx_qt::bridge] +pub mod qobject { + unsafe extern "C++" { + include!("cxx-qt-lib/qstring.h"); + type QString = cxx_qt_lib::QString; + } + + unsafe extern "RustQt" { + #[qobject] + #[qproperty(QString, string)] + type MainObject = super::MainObjectRust; + + #[qinvokable] + fn increment(self: Pin<&mut MainObject>); + } +} + +use core::pin::Pin; +use cxx_qt::CxxQtType; +use cxx_qt_lib::QString; + +#[derive(Default)] +pub struct MainObjectRust { + string: QString, + + pub counter: u32, +} + +impl qobject::MainObject { + pub fn increment(mut self: Pin<&mut Self>) { + let counter = self.rust().counter; + let counter = sub1::increment(counter); + let counter = sub2::increment(counter); + self.as_mut().rust_mut().counter = counter; + + let new_string = QString::from(&self.rust().counter.to_string()); + self.as_mut().set_string(new_string); + } +} diff --git a/examples/meta_project/rust/sub1/Cargo.toml b/examples/meta_project/rust/sub1/Cargo.toml new file mode 100644 index 000000000..f38f96056 --- /dev/null +++ b/examples/meta_project/rust/sub1/Cargo.toml @@ -0,0 +1,22 @@ +# SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +# SPDX-FileContributor: Andrew Hayzen +# +# SPDX-License-Identifier: MIT OR Apache-2.0 +[package] +name = "sub1" +version = "0.1.0" +authors = [ + "Andrew Hayzen ", +] +edition = "2021" +license = "MIT OR Apache-2.0" + +links = "sub1" + +[dependencies] +cxx.workspace = true +cxx-qt.workspace = true +cxx-qt-lib.workspace = true + +[build-dependencies] +cxx-qt-build.workspace = true diff --git a/examples/meta_project/rust/sub1/build.rs b/examples/meta_project/rust/sub1/build.rs new file mode 100644 index 000000000..6652b1c0d --- /dev/null +++ b/examples/meta_project/rust/sub1/build.rs @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +use cxx_qt_build::{CxxQtBuilder, Interface, QmlModule}; + +fn main() { + let interface = Interface::default(); + CxxQtBuilder::library(interface) + .qt_module("Network") + .qml_module(QmlModule::<_, &str> { + uri: "com.kdab.cxx_qt.demo.sub1", + rust_files: &["src/sub1_object.rs"], + ..Default::default() + }) + .build(); +} diff --git a/examples/meta_project/rust/sub1/src/lib.rs b/examples/meta_project/rust/sub1/src/lib.rs new file mode 100644 index 000000000..79812862f --- /dev/null +++ b/examples/meta_project/rust/sub1/src/lib.rs @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +// We need to enable packed bundled libs to allow for +bundle and +whole-archive +// https://github.com/rust-lang/rust/issues/108081 + +mod sub1_object; + +pub fn increment(number: u32) -> u32 { + number + 1 +} diff --git a/examples/meta_project/rust/sub1/src/sub1_object.rs b/examples/meta_project/rust/sub1/src/sub1_object.rs new file mode 100644 index 000000000..e2a48d306 --- /dev/null +++ b/examples/meta_project/rust/sub1/src/sub1_object.rs @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +#[cxx_qt::bridge] +pub mod qobject { + unsafe extern "C++" { + include!("cxx-qt-lib/qstring.h"); + type QString = cxx_qt_lib::QString; + } + + unsafe extern "RustQt" { + #[qobject] + #[qproperty(QString, string)] + type Sub1Object = super::Sub1ObjectRust; + + #[qinvokable] + fn increment(self: Pin<&mut Sub1Object>); + } +} + +use core::pin::Pin; +use cxx_qt::CxxQtType; +use cxx_qt_lib::QString; + +#[derive(Default)] +pub struct Sub1ObjectRust { + string: QString, + + pub counter: u32, +} + +impl qobject::Sub1Object { + pub fn increment(mut self: Pin<&mut Self>) { + self.as_mut().rust_mut().counter = crate::increment(self.rust().counter); + + let new_string = QString::from(&self.rust().counter.to_string()); + self.as_mut().set_string(new_string); + } +} diff --git a/examples/meta_project/rust/sub2/Cargo.toml b/examples/meta_project/rust/sub2/Cargo.toml new file mode 100644 index 000000000..97f0fbac4 --- /dev/null +++ b/examples/meta_project/rust/sub2/Cargo.toml @@ -0,0 +1,22 @@ +# SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +# SPDX-FileContributor: Andrew Hayzen +# +# SPDX-License-Identifier: MIT OR Apache-2.0 +[package] +name = "sub2" +version = "0.1.0" +authors = [ + "Andrew Hayzen ", +] +edition = "2021" +license = "MIT OR Apache-2.0" + +links = "sub2" + +[dependencies] +cxx.workspace = true +cxx-qt.workspace = true +cxx-qt-lib.workspace = true + +[build-dependencies] +cxx-qt-build.workspace = true diff --git a/examples/meta_project/rust/sub2/build.rs b/examples/meta_project/rust/sub2/build.rs new file mode 100644 index 000000000..cdbb1c9a2 --- /dev/null +++ b/examples/meta_project/rust/sub2/build.rs @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +use cxx_qt_build::{CxxQtBuilder, Interface, QmlModule}; + +fn main() { + let interface = Interface::default(); + CxxQtBuilder::library(interface) + .qml_module(QmlModule::<_, &str> { + uri: "com.kdab.cxx_qt.demo.sub2", + rust_files: &["src/sub2_object.rs"], + ..Default::default() + }) + .build(); +} diff --git a/examples/meta_project/rust/sub2/src/lib.rs b/examples/meta_project/rust/sub2/src/lib.rs new file mode 100644 index 000000000..58e180cf7 --- /dev/null +++ b/examples/meta_project/rust/sub2/src/lib.rs @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +// We need to enable packed bundled libs to allow for +bundle and +whole-archive +// https://github.com/rust-lang/rust/issues/108081 + +mod sub2_object; + +pub fn increment(number: u32) -> u32 { + number + 2 +} diff --git a/examples/meta_project/rust/sub2/src/sub2_object.rs b/examples/meta_project/rust/sub2/src/sub2_object.rs new file mode 100644 index 000000000..ec448b31f --- /dev/null +++ b/examples/meta_project/rust/sub2/src/sub2_object.rs @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2023 Klarälvdalens Datakonsult AB, a KDAB Group company +// SPDX-FileContributor: Andrew Hayzen +// +// SPDX-License-Identifier: MIT OR Apache-2.0 + +#[cxx_qt::bridge] +pub mod qobject { + unsafe extern "C++" { + include!("cxx-qt-lib/qstring.h"); + type QString = cxx_qt_lib::QString; + } + + unsafe extern "RustQt" { + #[qobject] + #[qproperty(QString, string)] + type Sub2Object = super::Sub2ObjectRust; + + #[qinvokable] + fn increment(self: Pin<&mut Sub2Object>); + } +} + +use core::pin::Pin; +use cxx_qt::CxxQtType; +use cxx_qt_lib::QString; + +#[derive(Default)] +pub struct Sub2ObjectRust { + string: QString, + + pub counter: u32, +} + +impl qobject::Sub2Object { + pub fn increment(mut self: Pin<&mut Self>) { + self.as_mut().rust_mut().counter = crate::increment(self.rust().counter); + + let new_string = QString::from(&self.rust().counter.to_string()); + self.as_mut().set_string(new_string); + } +} From 7a99575bcfe951218faf25165da71670e87f8bd8 Mon Sep 17 00:00:00 2001 From: Be Wilson Date: Wed, 29 Nov 2023 01:02:38 -0600 Subject: [PATCH 2/6] meta_project: add missing #[qml_element] attributes --- examples/meta_project/rust/main/src/main_object.rs | 1 + examples/meta_project/rust/sub1/src/sub1_object.rs | 1 + examples/meta_project/rust/sub2/src/sub2_object.rs | 1 + 3 files changed, 3 insertions(+) diff --git a/examples/meta_project/rust/main/src/main_object.rs b/examples/meta_project/rust/main/src/main_object.rs index f4b3892a5..23246d34a 100644 --- a/examples/meta_project/rust/main/src/main_object.rs +++ b/examples/meta_project/rust/main/src/main_object.rs @@ -12,6 +12,7 @@ pub mod qobject { unsafe extern "RustQt" { #[qobject] + #[qml_element] #[qproperty(QString, string)] type MainObject = super::MainObjectRust; diff --git a/examples/meta_project/rust/sub1/src/sub1_object.rs b/examples/meta_project/rust/sub1/src/sub1_object.rs index e2a48d306..f2bdf0679 100644 --- a/examples/meta_project/rust/sub1/src/sub1_object.rs +++ b/examples/meta_project/rust/sub1/src/sub1_object.rs @@ -12,6 +12,7 @@ pub mod qobject { unsafe extern "RustQt" { #[qobject] + #[qml_element] #[qproperty(QString, string)] type Sub1Object = super::Sub1ObjectRust; diff --git a/examples/meta_project/rust/sub2/src/sub2_object.rs b/examples/meta_project/rust/sub2/src/sub2_object.rs index ec448b31f..f520f235f 100644 --- a/examples/meta_project/rust/sub2/src/sub2_object.rs +++ b/examples/meta_project/rust/sub2/src/sub2_object.rs @@ -12,6 +12,7 @@ pub mod qobject { unsafe extern "RustQt" { #[qobject] + #[qml_element] #[qproperty(QString, string)] type Sub2Object = super::Sub2ObjectRust; From c3e13ec6144e3cbfd0386ff1135111bbe1c33f2d Mon Sep 17 00:00:00 2001 From: Be Wilson Date: Wed, 29 Nov 2023 01:04:02 -0600 Subject: [PATCH 3/6] meta_project: update build system to new practices --- examples/meta_project/CMakeLists.txt | 4 ++-- examples/meta_project/cpp/main.cpp | 3 ++- examples/meta_project/qml/qml.qrc | 12 ------------ examples/meta_project/rust/main/build.rs | 1 + 4 files changed, 5 insertions(+), 15 deletions(-) delete mode 100644 examples/meta_project/qml/qml.qrc diff --git a/examples/meta_project/CMakeLists.txt b/examples/meta_project/CMakeLists.txt index 4f89ef7a4..516fa532d 100644 --- a/examples/meta_project/CMakeLists.txt +++ b/examples/meta_project/CMakeLists.txt @@ -74,9 +74,9 @@ if(BUILD_WASM) # # TODO: Figure out how to configure such that # we can use add_executable for WASM - qt_add_executable(example_meta_project cpp/main.cpp qml/qml.qrc) + qt_add_executable(example_meta_project cpp/main.cpp) else() - add_executable(example_meta_project cpp/main.cpp qml/qml.qrc) + add_executable(example_meta_project cpp/main.cpp) endif() # Link to the qml module, which in turn links to the Rust qml_meta_project library diff --git a/examples/meta_project/cpp/main.cpp b/examples/meta_project/cpp/main.cpp index cf615d210..e6613bb93 100644 --- a/examples/meta_project/cpp/main.cpp +++ b/examples/meta_project/cpp/main.cpp @@ -14,7 +14,8 @@ main(int argc, char* argv[]) QQmlApplicationEngine engine; - const QUrl url(QStringLiteral("qrc:/main.qml")); + const QUrl url( + QStringLiteral("qrc:/qt/qml/com/kdab/cxx_qt/demo/qml/main.qml")); QObject::connect( &engine, &QQmlApplicationEngine::objectCreated, diff --git a/examples/meta_project/qml/qml.qrc b/examples/meta_project/qml/qml.qrc deleted file mode 100644 index 69e2bfdf5..000000000 --- a/examples/meta_project/qml/qml.qrc +++ /dev/null @@ -1,12 +0,0 @@ - - - - - main.qml - - diff --git a/examples/meta_project/rust/main/build.rs b/examples/meta_project/rust/main/build.rs index e5541b98a..194054c84 100644 --- a/examples/meta_project/rust/main/build.rs +++ b/examples/meta_project/rust/main/build.rs @@ -11,6 +11,7 @@ fn main() { .qml_module(QmlModule::<_, &str> { uri: "com.kdab.cxx_qt.demo", rust_files: &["src/main_object.rs"], + qml_files: &["../../qml/main.qml"], ..Default::default() }) .build(); From d0fe61a69368b246a1c83753a70767d144c16712 Mon Sep 17 00:00:00 2001 From: Be Wilson Date: Wed, 29 Nov 2023 01:58:19 -0600 Subject: [PATCH 4/6] meta_project: don't double invoke increment methods The `increment` methods of the subobjects are invoked from QML, so don't also invoke them from Rust. This also makes the behavior of the application clearer: Main counts by 1, Sub1 counts by 2, Sub2 counts by 3. --- examples/meta_project/rust/main/src/lib.rs | 6 ++++++ examples/meta_project/rust/main/src/main_object.rs | 5 +---- examples/meta_project/rust/sub1/src/lib.rs | 2 +- examples/meta_project/rust/sub2/src/lib.rs | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/examples/meta_project/rust/main/src/lib.rs b/examples/meta_project/rust/main/src/lib.rs index a609c11c6..73b514826 100644 --- a/examples/meta_project/rust/main/src/lib.rs +++ b/examples/meta_project/rust/main/src/lib.rs @@ -4,3 +4,9 @@ // SPDX-License-Identifier: MIT OR Apache-2.0 mod main_object; + +// Ensure the symbols from the rlib dependencies end up +// in the staticlib (if you use Rust symbols from these +// crates in this crate, you can skip these `pub use` statements). +pub use sub1; +pub use sub2; diff --git a/examples/meta_project/rust/main/src/main_object.rs b/examples/meta_project/rust/main/src/main_object.rs index 23246d34a..9fc69cef5 100644 --- a/examples/meta_project/rust/main/src/main_object.rs +++ b/examples/meta_project/rust/main/src/main_object.rs @@ -34,10 +34,7 @@ pub struct MainObjectRust { impl qobject::MainObject { pub fn increment(mut self: Pin<&mut Self>) { - let counter = self.rust().counter; - let counter = sub1::increment(counter); - let counter = sub2::increment(counter); - self.as_mut().rust_mut().counter = counter; + self.as_mut().rust_mut().counter = self.rust().counter + 1; let new_string = QString::from(&self.rust().counter.to_string()); self.as_mut().set_string(new_string); diff --git a/examples/meta_project/rust/sub1/src/lib.rs b/examples/meta_project/rust/sub1/src/lib.rs index 79812862f..eaedc0171 100644 --- a/examples/meta_project/rust/sub1/src/lib.rs +++ b/examples/meta_project/rust/sub1/src/lib.rs @@ -9,5 +9,5 @@ mod sub1_object; pub fn increment(number: u32) -> u32 { - number + 1 + number + 2 } diff --git a/examples/meta_project/rust/sub2/src/lib.rs b/examples/meta_project/rust/sub2/src/lib.rs index 58e180cf7..689f1ece5 100644 --- a/examples/meta_project/rust/sub2/src/lib.rs +++ b/examples/meta_project/rust/sub2/src/lib.rs @@ -9,5 +9,5 @@ mod sub2_object; pub fn increment(number: u32) -> u32 { - number + 2 + number + 3 } From 2353a8fb0140df1a92f9fbdc0b90c1e2ecd40fce Mon Sep 17 00:00:00 2001 From: Be Wilson Date: Wed, 29 Nov 2023 02:03:16 -0600 Subject: [PATCH 5/6] meta_project: specify and document Rust 1.74 MSRV This isn't required for the libraries published to crates.io, so this isn't specified in the workspace Cargo.toml. --- examples/meta_project/rust/main/Cargo.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/meta_project/rust/main/Cargo.toml b/examples/meta_project/rust/main/Cargo.toml index de1082d84..c2d9504e2 100644 --- a/examples/meta_project/rust/main/Cargo.toml +++ b/examples/meta_project/rust/main/Cargo.toml @@ -8,6 +8,10 @@ version = "0.1.0" authors = ["Andrew Hayzen "] edition = "2021" license = "MIT OR Apache-2.0" +# Linking CXX-Qt crates as rlibs requires a compiler feature +# that was stabilized in Rust 1.74, +# combining +whole-archive and +bundle link modifiers: https://github.com/rust-lang/rust/pull/113301 +rust-version = "1.74" [lib] crate-type = ["staticlib"] From 0530e1a68f4c58ea1d4e578d7da7db95e2dc9449 Mon Sep 17 00:00:00 2001 From: Be Wilson Date: Fri, 1 Dec 2023 02:30:51 -0600 Subject: [PATCH 6/6] meta_project: use `extern crate` rather than `pub use` No need to change the privacy of these; just need to have the symbols referenced within the staticlib crate. --- examples/meta_project/rust/main/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/meta_project/rust/main/src/lib.rs b/examples/meta_project/rust/main/src/lib.rs index 73b514826..9133ec875 100644 --- a/examples/meta_project/rust/main/src/lib.rs +++ b/examples/meta_project/rust/main/src/lib.rs @@ -7,6 +7,6 @@ mod main_object; // Ensure the symbols from the rlib dependencies end up // in the staticlib (if you use Rust symbols from these -// crates in this crate, you can skip these `pub use` statements). -pub use sub1; -pub use sub2; +// crates in this crate, you can skip these `extern crate` statements). +extern crate sub1; +extern crate sub2;