forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/3.5'
Change-Id: Iebaabfc2f724cd493b7cab025406531cea5cd2dc
This commit is contained in:
@@ -177,7 +177,7 @@ void CMakeProject::changeBuildDirectory(CMakeBuildConfiguration *bc, const QStri
|
||||
parseCMakeLists();
|
||||
}
|
||||
|
||||
QStringList CMakeProject::getCXXFlagsFor(const CMakeBuildTarget &buildTarget)
|
||||
QStringList CMakeProject::getCXXFlagsFor(const CMakeBuildTarget &buildTarget, QByteArray *cachedBuildNinja)
|
||||
{
|
||||
QString makeCommand = QDir::fromNativeSeparators(buildTarget.makeCommand);
|
||||
int startIndex = makeCommand.indexOf(QLatin1Char('\"'));
|
||||
@@ -206,32 +206,43 @@ QStringList CMakeProject::getCXXFlagsFor(const CMakeBuildTarget &buildTarget)
|
||||
// found
|
||||
// Get "all" target's working directory
|
||||
if (!buildTargets().empty()) {
|
||||
QString buildNinjaFile = QDir::fromNativeSeparators(buildTargets().at(0).workingDirectory);
|
||||
buildNinjaFile += QLatin1String("/build.ninja");
|
||||
QFile buildNinja(buildNinjaFile);
|
||||
if (buildNinja.exists()) {
|
||||
buildNinja.open(QIODevice::ReadOnly | QIODevice::Text);
|
||||
QTextStream stream(&buildNinja);
|
||||
bool targetFound = false;
|
||||
bool cxxFound = false;
|
||||
QString targetSearchPattern = QString::fromLatin1("target %1").arg(buildTarget.title);
|
||||
|
||||
while (!stream.atEnd()) {
|
||||
// 1. Look for a block that refers to the current target
|
||||
// 2. Look for a build rule which invokes CXX_COMPILER
|
||||
// 3. Return the FLAGS definition
|
||||
QString line = stream.readLine().trimmed();
|
||||
if (line.startsWith(QLatin1String("#"))) {
|
||||
if (!line.startsWith(QLatin1String("# Object build statements for"))) continue;
|
||||
targetFound = line.endsWith(targetSearchPattern);
|
||||
} else if (targetFound && line.startsWith(QLatin1String("build"))) {
|
||||
cxxFound = line.indexOf(QLatin1String("CXX_COMPILER")) != -1;
|
||||
} else if (cxxFound && line.startsWith(QLatin1String("FLAGS ="))) {
|
||||
// Skip past =
|
||||
return line.mid(7).trimmed().split(QLatin1Char(' '), QString::SkipEmptyParts);
|
||||
}
|
||||
if (cachedBuildNinja->isNull()) {
|
||||
QString buildNinjaFile = QDir::fromNativeSeparators(buildTargets().at(0).workingDirectory);
|
||||
buildNinjaFile += QLatin1String("/build.ninja");
|
||||
QFile buildNinja(buildNinjaFile);
|
||||
if (buildNinja.exists()) {
|
||||
buildNinja.open(QIODevice::ReadOnly | QIODevice::Text);
|
||||
*cachedBuildNinja = buildNinja.readAll();
|
||||
buildNinja.close();
|
||||
} else {
|
||||
*cachedBuildNinja = QByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
if (cachedBuildNinja->isEmpty())
|
||||
return QStringList();
|
||||
|
||||
QTextStream stream(cachedBuildNinja);
|
||||
bool targetFound = false;
|
||||
bool cxxFound = false;
|
||||
QString targetSearchPattern = QString::fromLatin1("target %1").arg(buildTarget.title);
|
||||
|
||||
while (!stream.atEnd()) {
|
||||
// 1. Look for a block that refers to the current target
|
||||
// 2. Look for a build rule which invokes CXX_COMPILER
|
||||
// 3. Return the FLAGS definition
|
||||
QString line = stream.readLine().trimmed();
|
||||
if (line.startsWith(QLatin1String("#"))) {
|
||||
if (!line.startsWith(QLatin1String("# Object build statements for"))) continue;
|
||||
targetFound = line.endsWith(targetSearchPattern);
|
||||
} else if (targetFound && line.startsWith(QLatin1String("build"))) {
|
||||
cxxFound = line.indexOf(QLatin1String("CXX_COMPILER")) != -1;
|
||||
} else if (cxxFound && line.startsWith(QLatin1String("FLAGS ="))) {
|
||||
// Skip past =
|
||||
return line.mid(7).trimmed().split(QLatin1Char(' '), QString::SkipEmptyParts);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return QStringList();
|
||||
}
|
||||
@@ -338,13 +349,15 @@ bool CMakeProject::parseCMakeLists()
|
||||
|
||||
ppBuilder.setQtVersion(activeQtVersion);
|
||||
|
||||
QByteArray cachedBuildNinja;
|
||||
foreach (const CMakeBuildTarget &cbt, m_buildTargets) {
|
||||
// This explicitly adds -I. to the include paths
|
||||
QStringList includePaths = cbt.includeFiles;
|
||||
includePaths += projectDirectory().toString();
|
||||
ppBuilder.setIncludePaths(includePaths);
|
||||
ppBuilder.setCFlags(getCXXFlagsFor(cbt));
|
||||
ppBuilder.setCxxFlags(getCXXFlagsFor(cbt));
|
||||
QStringList cxxflags = getCXXFlagsFor(cbt, &cachedBuildNinja);
|
||||
ppBuilder.setCFlags(cxxflags);
|
||||
ppBuilder.setCxxFlags(cxxflags);
|
||||
ppBuilder.setDefines(cbt.defines);
|
||||
ppBuilder.setDisplayName(cbt.title);
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ private:
|
||||
QString uiHeaderFile(const QString &uiFile);
|
||||
void updateRunConfigurations(ProjectExplorer::Target *t);
|
||||
void updateApplicationAndDeploymentTargets();
|
||||
QStringList getCXXFlagsFor(const CMakeBuildTarget &buildTarget);
|
||||
QStringList getCXXFlagsFor(const CMakeBuildTarget &buildTarget, QByteArray *cachedBuildNinja);
|
||||
|
||||
Internal::CMakeManager *m_manager;
|
||||
ProjectExplorer::Target *m_activeTarget;
|
||||
|
||||
@@ -39,9 +39,11 @@
|
||||
#include <coreplugin/actionmanager/actionmanager.h>
|
||||
#include <coreplugin/actionmanager/command.h>
|
||||
#include <coreplugin/actionmanager/actioncontainer.h>
|
||||
#include <projectexplorer/buildmanager.h>
|
||||
#include <projectexplorer/projectexplorer.h>
|
||||
#include <projectexplorer/projectexplorerconstants.h>
|
||||
#include <projectexplorer/projecttree.h>
|
||||
#include <projectexplorer/session.h>
|
||||
|
||||
#include <utils/synchronousprocess.h>
|
||||
|
||||
@@ -52,10 +54,6 @@ using namespace CMakeProjectManager::Internal;
|
||||
|
||||
CMakeManager::CMakeManager()
|
||||
{
|
||||
ProjectExplorer::ProjectTree *tree = ProjectExplorer::ProjectTree::instance();
|
||||
connect(tree, &ProjectExplorer::ProjectTree::aboutToShowContextMenu,
|
||||
this, &CMakeManager::updateContextMenu);
|
||||
|
||||
Core::ActionContainer *mbuild =
|
||||
Core::ActionManager::actionContainer(ProjectExplorer::Constants::M_BUILDPROJECT);
|
||||
Core::ActionContainer *mproject =
|
||||
@@ -64,14 +62,15 @@ CMakeManager::CMakeManager()
|
||||
Core::ActionManager::actionContainer(ProjectExplorer::Constants::M_SUBPROJECTCONTEXT);
|
||||
|
||||
const Core::Context projectContext(CMakeProjectManager::Constants::PROJECTCONTEXT);
|
||||
const Core::Context globalcontext(Core::Constants::C_GLOBAL);
|
||||
|
||||
m_runCMakeAction = new QAction(QIcon(), tr("Run CMake"), this);
|
||||
Core::Command *command = Core::ActionManager::registerAction(m_runCMakeAction,
|
||||
Constants::RUNCMAKE, projectContext);
|
||||
Constants::RUNCMAKE, globalcontext);
|
||||
command->setAttribute(Core::Command::CA_Hide);
|
||||
mbuild->addAction(command, ProjectExplorer::Constants::G_BUILD_DEPLOY);
|
||||
connect(m_runCMakeAction, &QAction::triggered, [this]() {
|
||||
runCMake(ProjectExplorer::ProjectTree::currentProject());
|
||||
runCMake(ProjectExplorer::SessionManager::startupProject());
|
||||
});
|
||||
|
||||
m_runCMakeActionContextMenu = new QAction(QIcon(), tr("Run CMake"), this);
|
||||
@@ -81,14 +80,20 @@ CMakeManager::CMakeManager()
|
||||
mproject->addAction(command, ProjectExplorer::Constants::G_PROJECT_BUILD);
|
||||
msubproject->addAction(command, ProjectExplorer::Constants::G_PROJECT_BUILD);
|
||||
connect(m_runCMakeActionContextMenu, &QAction::triggered, [this]() {
|
||||
runCMake(m_contextProject);
|
||||
runCMake(ProjectExplorer::ProjectTree::currentProject());
|
||||
});
|
||||
|
||||
connect(ProjectExplorer::SessionManager::instance(), &ProjectExplorer::SessionManager::startupProjectChanged,
|
||||
this, &CMakeManager::updateRunCmakeAction);
|
||||
connect(ProjectExplorer::BuildManager::instance(), &ProjectExplorer::BuildManager::buildStateChanged,
|
||||
this, &CMakeManager::updateRunCmakeAction);
|
||||
|
||||
}
|
||||
|
||||
void CMakeManager::updateContextMenu(ProjectExplorer::Project *project, ProjectExplorer::Node *)
|
||||
void CMakeManager::updateRunCmakeAction()
|
||||
{
|
||||
m_contextProject = project;
|
||||
auto project = qobject_cast<CMakeProject *>(ProjectExplorer::SessionManager::startupProject());
|
||||
m_runCMakeAction->setVisible(project && !ProjectExplorer::BuildManager::isBuilding(project));
|
||||
}
|
||||
|
||||
void CMakeManager::runCMake(ProjectExplorer::Project *project)
|
||||
|
||||
@@ -69,14 +69,13 @@ public:
|
||||
static QString findCbpFile(const QDir &);
|
||||
|
||||
private:
|
||||
void updateContextMenu(ProjectExplorer::Project *project, ProjectExplorer::Node *node);
|
||||
void updateRunCmakeAction();
|
||||
void runCMake(ProjectExplorer::Project *project);
|
||||
|
||||
private:
|
||||
CMakeSettingsPage *m_settingsPage;
|
||||
QAction *m_runCMakeAction;
|
||||
QAction *m_runCMakeActionContextMenu;
|
||||
ProjectExplorer::Project *m_contextProject;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
Reference in New Issue
Block a user