From 239703a5bcaf5df957f56fe21c610f50288af396 Mon Sep 17 00:00:00 2001 From: Ray Donnelly Date: Mon, 3 Aug 2015 22:00:16 +0100 Subject: [PATCH 4/8] Implement Qt5 static plugin support Enabled via a new target property "AUTOSTATICPLUGINS". At CMake execution time, a C++ file is created to link the static plugins. For this to work, patches for Qt5-static from [1] are necessary [2], [3] and [4] [1] https://github.com/Alexpux/MINGW-packages/tree/master/mingw-w64-qt5-static [2] 0038-qt-5.4.0-Make-it-possible-to-use-static-builds-of-Qt-with-CMa.patch [3] 0039-qt-5.4.0-Generate-separated-libraries-in-prl-files-for-CMake.patch [4] 0041-qt-5.4.0-static-cmake-also-link-plugins-and-plugin-deps.patch .. and also some more minor ones that aren't strictly related to Qt5 static CMake but are necessary for this to work on MinGW-w64 (0040- for example). --- Source/cmGlobalGenerator.cxx | 1 + Source/cmQtAutoGeneratorInitializer.cxx | 70 ++++++++++++++++++++++++++++++++- Source/cmTarget.cxx | 1 + Source/cmTargetPropertyComputer.cxx | 1 + 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index f11825083e..e8a07361c0 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -1409,6 +1409,7 @@ cmGlobalGenerator::CreateQtAutoGeneratorsTargets() } if ((!(*ti)->GetPropertyAsBool("AUTOMOC") && !(*ti)->GetPropertyAsBool("AUTOUIC") && + !(*ti)->GetPropertyAsBool("AUTOSTATICPLUGINS") && !(*ti)->GetPropertyAsBool("AUTORCC")) || (*ti)->IsImported()) { continue; diff --git a/Source/cmQtAutoGeneratorInitializer.cxx b/Source/cmQtAutoGeneratorInitializer.cxx index 825eba0e1d..61652b80b1 100644 --- a/Source/cmQtAutoGeneratorInitializer.cxx +++ b/Source/cmQtAutoGeneratorInitializer.cxx @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -160,6 +161,65 @@ static void SetupSourceFiles(cmGeneratorTarget const* target, } } } + + /* in qt5-static/lib/cmake/Qt5Core/Qt5CoreConfig.cmake, + * macro(_populate_Core_plugin_properties ..), we'd have: + * set_property(TARGET PROPERTY AUTOSTATICPLUGINS True) // Not currently need + * as defaults to "ON" + * set_property(TARGET Qt5::Core APPEND PROPERTY STATIC_PLUGINS ${Plugin}) + */ + if (target->GetPropertyAsBool("AUTOSTATICPLUGINS")) { + std::vector libTargets = + target->GetLinkImplementationClosure(""); + std::vector::const_iterator li; + std::vector staticPlugins; + for (li = libTargets.begin(); li != libTargets.end(); ++li) { + cmGeneratorTarget const* tgt = *li; + const char* staticPluginsProp = tgt->GetProperty("STATIC_PLUGINS"); + if (staticPluginsProp) { + std::vector staticPluginsTgt = + cmSystemTools::tokenize(staticPluginsProp, ";"); + for (std::vector::const_iterator spti = + staticPluginsTgt.begin(); + spti != staticPluginsTgt.end(); ++spti) { + if (std::find(staticPlugins.begin(), staticPlugins.end(), *spti) == + staticPlugins.end()) { + staticPlugins.push_back(*spti); + } + } + } + } + + if (staticPlugins.size()) { + std::string static_plugins_output_dir = target->GetSupportDirectory(); + cmSystemTools::MakeDirectory(static_plugins_output_dir.c_str()); + std::string static_plugins_output_file = static_plugins_output_dir; + static_plugins_output_file += + "/" + target->GetName() + "_plugin_import.cpp"; + cmGeneratedFileStream staticPluginsFileStream( + static_plugins_output_file.c_str()); + if (staticPluginsFileStream) { + staticPluginsFileStream << "// This file is autogenerated by cmake. " + "It imports static plugin classes for" + << std::endl; + staticPluginsFileStream + << "// static plugins specified using QTPLUGIN and " + "QT_PLUGIN_CLASS. variables." + << std::endl; + staticPluginsFileStream << "#include " << std::endl; + for (std::vector::const_iterator spti = + staticPlugins.begin(); + spti != staticPlugins.end(); ++spti) { + staticPluginsFileStream << "Q_IMPORT_PLUGIN(" << *spti << ")" + << std::endl; + } + staticPluginsFileStream.Close(); + makefile->AppendProperty("ADDITIONAL_MAKE_CLEAN_FILES", + static_plugins_output_file.c_str(), false); + const_cast(target)->AddSource(static_plugins_output_file); + } + } + } } static void GetCompileDefinitionsAndDirectories( @@ -742,7 +802,13 @@ void cmQtAutoGeneratorInitializer::InitializeAutogenTarget( } if (toolNames.size() == 1) { tools += " and " + toolNames[0]; + } else if (toolNames.size() == 0) { + /* AUTOSTATICPLUGINS .cpp files are created at cmake execution time, + * and not at build time, so in that case it is possible to get here + * with no toolNames. */ + return; } + autogenComment = "Automatic " + tools + " for target " + target->GetName(); } @@ -894,7 +960,9 @@ void cmQtAutoGeneratorInitializer::SetupAutoGenerateTarget( if (target->GetPropertyAsBool("AUTOMOC") || target->GetPropertyAsBool("AUTOUIC") || - target->GetPropertyAsBool("AUTORCC")) { + target->GetPropertyAsBool("AUTORCC") || + ( target->GetPropertyAsBool("AUTOSTATICPLUGINS") + && target->GetType() == cmStateEnums::EXECUTABLE)) { SetupSourceFiles(target, mocUicSources, mocUicHeaders, skipMoc, skipUic); } makefile->AddDefinition( diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index fe3472d5d7..dcfdfcbd32 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -245,6 +245,7 @@ cmTarget::cmTarget(std::string const& name, cmStateEnums::TargetType type, this->SetPropertyDefault("AUTOMOC", CM_NULLPTR); this->SetPropertyDefault("AUTOUIC", CM_NULLPTR); this->SetPropertyDefault("AUTORCC", CM_NULLPTR); + this->SetPropertyDefault("AUTOSTATICPLUGINS", CM_NULLPTR); this->SetPropertyDefault("AUTOMOC_MOC_OPTIONS", CM_NULLPTR); this->SetPropertyDefault("AUTOUIC_OPTIONS", CM_NULLPTR); this->SetPropertyDefault("AUTORCC_OPTIONS", CM_NULLPTR); diff --git a/Source/cmTargetPropertyComputer.cxx b/Source/cmTargetPropertyComputer.cxx index a57bc5aea5..b12bd2dea8 100644 --- a/Source/cmTargetPropertyComputer.cxx +++ b/Source/cmTargetPropertyComputer.cxx @@ -58,6 +58,7 @@ bool cmTargetPropertyComputer::WhiteListedInterfaceProperty( builtIns.insert("EXPORT_NAME"); builtIns.insert("IMPORTED"); builtIns.insert("NAME"); + builtIns.insert("STATIC_PLUGINS"); builtIns.insert("TYPE"); } -- 2.11.0