QmakeProjectManager: Provide generators for Xcode and Visual Studio

Task-number: QTCREATORBUG-28149
Change-Id: I6c012224900de7835c2e617e262db676ddbbd465
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2022-12-01 17:32:26 +01:00
parent a86679d00d
commit 858d496113
2 changed files with 80 additions and 1 deletions

View File

@@ -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 <projectexplorer/buildinfo.h>
#include <projectexplorer/buildmanager.h>
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/buildtargetinfo.h>
#include <projectexplorer/deploymentdata.h>
#include <projectexplorer/headerpath.h>
@@ -45,6 +45,7 @@
#include <qtsupport/qtversionmanager.h>
#include <utils/algorithm.h>
#include <utils/qtcprocess.h>
#include <utils/runextensions.h>
#include <qmljs/qmljsmodelmanagerinterface.h>
@@ -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<QPair<Id, QString>> 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<QMakeStep>();
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)
{

View File

@@ -88,6 +88,8 @@ public:
Utils::FilePaths filesGeneratedFrom(const Utils::FilePath &file) const final;
QVariant additionalData(Utils::Id id) const final;
QList<QPair<Utils::Id, QString>> generators() const override;
void runGenerator(Utils::Id id) override;
void asyncUpdate();
void buildFinished(bool success);