Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions crates/cxx-qt-build/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -878,22 +878,39 @@ impl CxxQtBuilder {
for qmlcachegen_file in qml_module_registration_files.qmlcachegen {
cc_builder.file(qmlcachegen_file);
}
// This is required, as described here: plugin_builder
// This is required, as described here: https://doc.qt.io/qt-6/plugins-howto.html#creating-static-plugins
cc_builder.define("QT_STATICPLUGIN", None);

// If any of the files inside the qml module change, then trigger a rerun
for file in qml_module.qml_files {
println!("cargo::rerun-if-changed={}", file.path().display());
}

// Export the .qmltypes and qmldir files into a stable path, so that tools like
// qmllint/qmlls can find them.
let plugin_dir = dir::module_export(&qml_module.uri);
if let Some(plugin_dir) = &plugin_dir {
std::fs::create_dir_all(plugin_dir).expect("Could not create plugin directory");
std::fs::copy(
qml_module_registration_files.qmltypes,
plugin_dir.join("plugin.qmltypes"),
)
.expect("Could not copy plugin.qmltypes to export directory");
std::fs::copy(
qml_module_registration_files.qmldir,
plugin_dir.join("qmldir"),
)
.expect("Could not copy qmldir to export directory");
}

let module_init_key = qml_module_init_key(&qml_module.uri);
let private_initializers = [qml_module_registration_files.plugin_init];
let public_initializer =
Self::generate_public_initializer(&private_initializers, &module_init_key);
self.build_initializers(
&private_initializers,
&public_initializer,
dir::module_export(&qml_module.uri).map(|dir| dir.join("plugin_init.o")),
plugin_dir.map(|dir| dir.join("plugin_init.o")),
&module_init_key,
);

Expand Down
12 changes: 10 additions & 2 deletions crates/qt-build-utils/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,12 @@ pub struct QmlModuleRegistrationFiles {
pub qmlcachegen: Vec<PathBuf>,
/// File generated by [qmltyperegistrar](https://www.qt.io/blog/qml-type-registration-in-qt-5.15) CLI tool.
pub qmltyperegistrar: Option<PathBuf>,
/// The .qmltypes file generated by [qmltyperegistrar](https://www.qt.io/blog/qml-type-registration-in-qt-5.15) CLI tool.
/// Mostly used for IDE support (e.g. qmllint/qmlls).
pub qmltypes: PathBuf,
/// qmldir file path.
/// Mostly used for better qmllint/qmlls support.
pub qmldir: PathBuf,
/// File with generated [QQmlEngineExtensionPlugin](https://doc.qt.io/qt-6/qqmlengineextensionplugin.html) that calls the function generated by qmltyperegistrar.
pub plugin: PathBuf,
/// Initializer that automatically registers the QQmlExtensionPlugin at startup.
Expand Down Expand Up @@ -247,7 +253,7 @@ impl QtBuild {
if self.qt_installation.version().major >= 6 {
let qml_cache_args = QmlCacheArguments {
uri: uri.clone(),
qmldir_path: qmldir_file_path,
qmldir_path: qmldir_file_path.clone(),
qmldir_qrc_path: qrc_path.clone(),
};
let mut qml_resource_paths = Vec::new();
Expand All @@ -273,7 +279,7 @@ impl QtBuild {
// Run qmltyperegistrar over the meta types
let qmltyperegistrar_path = self.qmltyperegistrar().compile(
metatypes_json,
qmltypes_path,
&qmltypes_path,
uri,
Version::new(version_major as u64, version_minor as u64, 0),
);
Expand Down Expand Up @@ -315,6 +321,8 @@ Q_IMPORT_PLUGIN({plugin_class_name});
rcc: rcc.file.unwrap(),
qmlcachegen: qmlcachegen_file_paths,
qmltyperegistrar: qmltyperegistrar_path,
qmltypes: qmltypes_path,
qmldir: qmldir_file_path,
plugin: qml_plugin_cpp_path,
plugin_init,
include_path,
Expand Down
Loading