diff --git a/src/plugins/qmldesigner/boilerplate.qrc b/src/plugins/qmldesigner/boilerplate.qrc index 3e2106beaa0..790f605c08e 100644 --- a/src/plugins/qmldesigner/boilerplate.qrc +++ b/src/plugins/qmldesigner/boilerplate.qrc @@ -2,6 +2,7 @@ qmlprojectmaincpp.tpl qmlprojectmaincppheader.tpl + qmlprojectenvheader.tpl qmlprojectmodules.tpl qmlprojectmaincmakelists.tpl qmlprojectmodulecmakelists.tpl diff --git a/src/plugins/qmldesigner/generatecmakelists.cpp b/src/plugins/qmldesigner/generatecmakelists.cpp index 247d2f3e93d..abab295c3ed 100644 --- a/src/plugins/qmldesigner/generatecmakelists.cpp +++ b/src/plugins/qmldesigner/generatecmakelists.cpp @@ -30,11 +30,14 @@ #include #include +#include #include #include #include #include +#include +#include #include #include @@ -70,7 +73,8 @@ enum ProjectDirectoryError { MissingAppMainQml = 1<<7, MissingQmlModules = 1<<8, MissingMainCpp = 1<<9, - MissingMainCppHeader = 1<<10 + MissingMainCppHeader = 1<<10, + MissingEnvHeader = 1<<11 }; QVector queuedFiles; @@ -104,8 +108,7 @@ void onGenerateCmakeLists() queuedFiles.clear(); GenerateCmakeLists::generateCmakes(rootDir); - GenerateEntryPoints::generateMainCpp(rootDir); - GenerateEntryPoints::generateMainQml(rootDir); + GenerateEntryPoints::generateEntryPointFiles(rootDir); if (showConfirmationDialog(rootDir)) writeQueuedFiles(); } @@ -141,6 +144,8 @@ int isProjectCorrectlyFormed(const FilePath &rootDir) errors |= MissingMainCpp; if (!rootDir.pathAppended(DIRNAME_CPP).pathAppended(FILENAME_MAINCPP_HEADER).exists()) errors |= MissingMainCppHeader; + if (!rootDir.pathAppended(DIRNAME_CPP).pathAppended(FILENAME_ENV_HEADER).exists()) + errors |= MissingEnvHeader; if (!rootDir.pathAppended(FILENAME_CMAKELISTS).exists()) errors |= MissingMainCMake; @@ -205,6 +210,11 @@ void showProjectDirErrorDialog(int error) + QDir::separator() + QString(FILENAME_MAINCPP_HEADER) + "\n"); + if (error & MissingEnvHeader) + nonFatalList.append(QString(DIRNAME_CPP) + + QDir::separator() + + QString(FILENAME_ENV_HEADER) + + "\n"); bool isFatal = isErrorFatal(error); @@ -536,6 +546,8 @@ bool generateEntryPointFiles(const FilePath &dir) const char MAIN_CPPFILE_TEMPLATE_PATH[] = ":/boilerplatetemplates/qmlprojectmaincpp.tpl"; const char MAIN_CPPFILE_HEADER_TEMPLATE_PATH[] = ":/boilerplatetemplates/qmlprojectmaincppheader.tpl"; const char MAIN_CPPFILE_HEADER_PLUGIN_LINE[] = "Q_IMPORT_QML_PLUGIN(%1)\n"; +const char ENV_HEADER_TEMPLATE_PATH[] = ":/boilerplatetemplates/qmlprojectenvheader.tpl"; +const char ENV_HEADER_VARIABLE_LINE[] = " qputenv(\"%1\", \"%2\");\n"; bool generateMainCpp(const FilePath &dir) { @@ -553,9 +565,27 @@ bool generateMainCpp(const FilePath &dir) QString headerContent = GenerateCmake::readTemplate(MAIN_CPPFILE_HEADER_TEMPLATE_PATH) .arg(modulesAsPlugins); FilePath headerFilePath = srcDir.pathAppended(FILENAME_MAINCPP_HEADER); - bool headerOk = GenerateCmake::queueFile(headerFilePath, headerContent); + bool pluginHeaderOk = GenerateCmake::queueFile(headerFilePath, headerContent); - return cppOk && headerOk; + bool envHeaderOk = true; + QString environment; + auto *target = ProjectExplorer::SessionManager::startupProject()->activeTarget(); + if (target && target->buildSystem()) { + auto buildSystem = qobject_cast(target->buildSystem()); + if (buildSystem) { + for (EnvironmentItem &envItem : buildSystem->environment()) { + QString key = envItem.name; + QString value = envItem.value; + environment.append(QString(ENV_HEADER_VARIABLE_LINE).arg(key).arg(value)); + } + QString envHeaderContent = GenerateCmake::readTemplate(ENV_HEADER_TEMPLATE_PATH) + .arg(environment); + FilePath envHeaderPath = srcDir.pathAppended(FILENAME_ENV_HEADER); + envHeaderOk = GenerateCmake::queueFile(envHeaderPath, envHeaderContent); + } + } + + return cppOk && pluginHeaderOk && envHeaderOk; } const char MAIN_QMLFILE_TEMPLATE_PATH[] = ":/boilerplatetemplates/qmlprojectmainqml.tpl"; diff --git a/src/plugins/qmldesigner/generatecmakelistsconstants.h b/src/plugins/qmldesigner/generatecmakelistsconstants.h index dce1b8e61bb..0374ac2ad65 100644 --- a/src/plugins/qmldesigner/generatecmakelistsconstants.h +++ b/src/plugins/qmldesigner/generatecmakelistsconstants.h @@ -45,6 +45,7 @@ const char FILENAME_MAINCPP[] = "main.cpp"; const char FILENAME_MAINCPP_HEADER[] = "import_qml_plugins.h"; const char FILENAME_MODULES[] = "qmlmodules"; const char FILENAME_QMLDIR[] = "qmldir"; +const char FILENAME_ENV_HEADER[] = "app_environment.h"; } //Constants } //GenerateCmake diff --git a/src/plugins/qmldesigner/qmlprojectenvheader.tpl b/src/plugins/qmldesigner/qmlprojectenvheader.tpl new file mode 100644 index 00000000000..bf60adb4ac1 --- /dev/null +++ b/src/plugins/qmldesigner/qmlprojectenvheader.tpl @@ -0,0 +1,11 @@ +/* + * This file is automatically generated by Qt Design Studio. + * Do not change. +*/ + +#include + +void set_qt_environment() +{ +%1 +} diff --git a/src/plugins/qmldesigner/qmlprojectmaincpp.tpl b/src/plugins/qmldesigner/qmlprojectmaincpp.tpl index 7b68c637d05..f6d614c3bb4 100644 --- a/src/plugins/qmldesigner/qmlprojectmaincpp.tpl +++ b/src/plugins/qmldesigner/qmlprojectmaincpp.tpl @@ -30,9 +30,12 @@ #include #include +#include "app_environment.h" +#include "import_qml_plugins.h" + int main(int argc, char *argv[]) { - qputenv("QT_LOGGING_RULES", "qt.qml.connections=false"); + set_qt_environment(); QGuiApplication app(argc, argv); QQmlApplicationEngine engine;