diff --git a/crates/cxx-qt-build/src/lib.rs b/crates/cxx-qt-build/src/lib.rs index 253818964..aaee9030e 100644 --- a/crates/cxx-qt-build/src/lib.rs +++ b/crates/cxx-qt-build/src/lib.rs @@ -878,7 +878,7 @@ 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 @@ -886,6 +886,23 @@ impl CxxQtBuilder { 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 = @@ -893,7 +910,7 @@ impl CxxQtBuilder { 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, ); diff --git a/crates/qt-build-utils/src/lib.rs b/crates/qt-build-utils/src/lib.rs index 8d54dde5b..0514e3c12 100644 --- a/crates/qt-build-utils/src/lib.rs +++ b/crates/qt-build-utils/src/lib.rs @@ -69,6 +69,12 @@ pub struct QmlModuleRegistrationFiles { pub qmlcachegen: Vec, /// File generated by [qmltyperegistrar](https://www.qt.io/blog/qml-type-registration-in-qt-5.15) CLI tool. pub qmltyperegistrar: Option, + /// 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. @@ -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(); @@ -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), ); @@ -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,