Skip to content

Commit

Permalink
meta_project -> qml_multi_crates & enable CMake
Browse files Browse the repository at this point in the history
qml_multi_crates is the grand finale in our quest for CMake&Cargo
compatibility.
It is a project that can be built as a Cargo lib and binary, as well as
imported into CMake with a C++ binary and uses multiple Cargo crates
internally.

It does rely on the init_crate! and init_qml_module! macros, but
otherwise works quite seamless.
  • Loading branch information
LeonMatthesKDAB committed Feb 6, 2025
1 parent 4aca6ae commit db794ad
Show file tree
Hide file tree
Showing 18 changed files with 26 additions and 24 deletions.
6 changes: 3 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ members = [
"examples/qml_features/rust",
"examples/qml_minimal/rust",
"examples/qml_basics",
"examples/meta_project/rust/main",
"examples/meta_project/rust/sub1",
"examples/meta_project/rust/sub2",
"examples/qml_multi_crates/rust/main",
"examples/qml_multi_crates/rust/sub1",
"examples/qml_multi_crates/rust/sub2",

"tests/basic_cxx_only/rust",
"tests/basic_cxx_qt/rust",
Expand Down
2 changes: 1 addition & 1 deletion examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
# When using `cargo test`
add_subdirectory(qml_features)
add_subdirectory(qml_minimal)
# add_subdirectory(meta_project)
add_subdirectory(qml_multi_crates)

# TODO: get demo_threading working for wasm builds
if(NOT BUILD_WASM)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

cmake_minimum_required(VERSION 3.24)

project(example_meta_project)
project(example_qml_multi_crates)

# 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
Expand Down Expand Up @@ -51,20 +51,22 @@ if(NOT CxxQt_FOUND)
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_crate(MANIFEST_PATH rust/main/Cargo.toml
CRATES qml_multi_crates
CRATE_TYPES staticlib
QT_MODULES Qt::Core Qt::Gui Qt::Qml Qt::QuickControls2 Qt::Network)

cxx_qt_import_qml_module(qml_meta_project_main
cxx_qt_import_qml_module(qml_multi_crates_main
URI "com.kdab.cxx_qt.demo"
SOURCE_CRATE qml_meta_project)
SOURCE_CRATE qml_multi_crates)

cxx_qt_import_qml_module(qml_meta_project_sub1
cxx_qt_import_qml_module(qml_multi_crates_sub1
URI "com.kdab.cxx_qt.demo.sub1"
SOURCE_CRATE qml_meta_project)
SOURCE_CRATE qml_multi_crates)

cxx_qt_import_qml_module(qml_meta_project_sub2
cxx_qt_import_qml_module(qml_multi_crates_sub2
URI "com.kdab.cxx_qt.demo.sub2"
SOURCE_CRATE qml_meta_project)
SOURCE_CRATE qml_multi_crates)

# Define the executable with the C++ source
if(BUILD_WASM)
Expand All @@ -74,13 +76,13 @@ 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)
qt_add_executable(example_qml_multi_crates cpp/main.cpp)
else()
add_executable(example_meta_project cpp/main.cpp)
add_executable(example_qml_multi_crates cpp/main.cpp)
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)
# Link to the qml module, which in turn links to the Rust qml_multi_crates library
target_link_libraries(example_qml_multi_crates PRIVATE Qt::Core Qt::Gui Qt::Qml qml_multi_crates_main qml_multi_crates_sub1 qml_multi_crates_sub2)

# If we are using a statically linked Qt then we need to import any qml plugins
qt_import_qml_plugins(example_meta_project)
qt_import_qml_plugins(example_qml_multi_crates)
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
#
# SPDX-License-Identifier: MIT OR Apache-2.0
[package]
name = "qml_meta_project"
name = "qml_multi_crates"
version = "0.1.0"
authors = ["Andrew Hayzen <[email protected]>"]
edition = "2021"
license = "MIT OR Apache-2.0"

# [lib]
# crate-type = ["staticlib", "lib"]
[lib]
crate-type = ["staticlib", "lib"]

[dependencies]
sub1 = { path = "../sub1" }
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
//
// SPDX-License-Identifier: MIT OR Apache-2.0

extern crate qml_meta_project;
extern crate qml_multi_crates;

use cxx_qt_lib::{QGuiApplication, QQmlApplicationEngine, QUrl};

fn main() {
cxx_qt::init_crate!(qml_meta_project);
cxx_qt::init_crate!(qml_multi_crates);
cxx_qt::init_qml_module!("com.kdab.cxx_qt.demo");

// Create the application and engine
Expand Down Expand Up @@ -42,7 +42,7 @@ mod tests {
// Otherwise linking will fail!
#[test]
fn init_dependencies() {
cxx_qt::init_crate!(qml_meta_project);
cxx_qt::init_crate!(qml_multi_crates);
cxx_qt::init_qml_module!("com.kdab.cxx_qt.demo");
}
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 comments on commit db794ad

Please sign in to comment.