forked from qt-creator/qt-creator
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:
@@ -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)
|
||||
{
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user