diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 4aa81cde687..9e15ba7c74c 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -4,7 +4,6 @@ #include "qmakeproject.h" #include "qmakebuildconfiguration.h" -#include "qmakebuildinfo.h" #include "qmakenodes.h" #include "qmakenodetreebuilder.h" #include "qmakeprojectimporter.h" @@ -24,6 +23,7 @@ #include #include +#include #include #include #include @@ -45,6 +45,7 @@ #include #include +#include #include #include @@ -1514,6 +1515,82 @@ QVariant QmakeBuildSystem::additionalData(Id id) const return BuildSystem::additionalData(id); } +static const Id xcodeGeneratorId() { return "QMAKE_GENERATOR_XCODE"; } +static const Id vsGeneratorId() { return "QMAKE_GENERATOR_VS"; } + +QList> QmakeBuildSystem::generators() const +{ + if (HostOsInfo::isMacHost()) + return {{xcodeGeneratorId(), Tr::tr("Generate Xcode project (via qmake)")}}; + if (HostOsInfo::isWindowsHost()) + return {{vsGeneratorId(), Tr::tr("Generate Visual Studio project (via qmake)")}}; + return {}; +} + +void QmakeBuildSystem::runGenerator(Utils::Id id) +{ + QTC_ASSERT(buildConfiguration(), return); + const auto showError = [](const QString &detail) { + Core::MessageManager::writeDisrupting(Tr::tr("qmake generator failed: %1.").arg(detail)); + }; + const QtVersion * const qtVersion = QtKitAspect::qtVersion(kit()); + if (!qtVersion) { + showError(Tr::tr("No Qt in kit")); + return; + } + const FilePath qmake = qtVersion->qmakeFilePath(); + if (!qmake.isExecutableFile()) { + showError(Tr::tr("No valid qmake executable")); + return; + } + const QMakeStep * const step = buildConfiguration()->buildSteps()->firstOfType(); + if (!step) { + showError(Tr::tr("No qmake step in active build configuration")); + return; + } + FilePath outDir = buildConfiguration()->buildDirectory(); + CommandLine cmdLine(qmake, {"-r"}); + cmdLine.addArgs(step->allArguments(qtVersion), CommandLine::Raw); + if (id == xcodeGeneratorId()) { + QStringList args = cmdLine.splitArguments(); + for (auto it = args.begin(); it != args.end(); ++it) { + if (*it == "-spec") { + it = args.erase(it); + if (it != args.end()) + args.erase(it); + break; + } + } + args << "-spec" << "macx-xcode"; + cmdLine.setArguments({}); + cmdLine.addArgs(args); + outDir = outDir / "qtcgen_xcode"; + } else if (id == vsGeneratorId()) { + cmdLine.addArgs({"-tp", "vc"}); + outDir = outDir / "qtcgen_vs"; + } else { + QTC_ASSERT(false, return); + } + if (!outDir.ensureWritableDir()) { + showError(Tr::tr("Cannot create output directory \"%1\"").arg(outDir.toUserOutput())); + return; + } + const auto proc = new QtcProcess(this); + connect(proc, &QtcProcess::done, proc, &QtcProcess::deleteLater); + connect(proc, &QtcProcess::readyReadStandardOutput, this, [proc] { + Core::MessageManager::writeFlashing(QString::fromLocal8Bit(proc->readAllStandardOutput())); + }); + connect(proc, &QtcProcess::readyReadStandardError, this, [proc] { + Core::MessageManager::writeDisrupting(QString::fromLocal8Bit(proc->readAllStandardError())); + }); + proc->setWorkingDirectory(outDir); + proc->setEnvironment(buildConfiguration()->environment()); + proc->setCommand(cmdLine); + Core::MessageManager::writeFlashing(Tr::tr("Running in %1: %2") + .arg(outDir.toUserOutput(), cmdLine.toUserOutput())); + proc->start(); +} + void QmakeBuildSystem::buildHelper(Action action, bool isFileBuild, QmakeProFileNode *profile, FileNode *buildableFile) { diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.h b/src/plugins/qmakeprojectmanager/qmakeproject.h index a0507795d35..d6ae9313d27 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.h +++ b/src/plugins/qmakeprojectmanager/qmakeproject.h @@ -88,6 +88,8 @@ public: Utils::FilePaths filesGeneratedFrom(const Utils::FilePath &file) const final; QVariant additionalData(Utils::Id id) const final; + QList> generators() const override; + void runGenerator(Utils::Id id) override; void asyncUpdate(); void buildFinished(bool success);