Skip to content

Commit

Permalink
Partial toolchain support returns back
Browse files Browse the repository at this point in the history
Note, currently C++ compiler settings overrides by the Kit CMake
settings. This case currently under inverstigation.
  • Loading branch information
h4tr3d committed Feb 20, 2016
1 parent c378dfd commit bb5f74b
Show file tree
Hide file tree
Showing 13 changed files with 363 additions and 140 deletions.
72 changes: 62 additions & 10 deletions builddirmanager.cpp
Expand Up @@ -89,13 +89,14 @@ static QStringList toArguments(const CMakeConfig &config) {
// --------------------------------------------------------------------

BuildDirManager::BuildDirManager(const Utils::FileName &sourceDir, const ProjectExplorer::Kit *k,
const CMakeConfig &inputConfig, const Utils::Environment &env,
const Utils::FileName &buildDir) :
const CMakeConfig &inputConfig, const CMakeToolchainInfo &inputToolchainInfo,
const Utils::Environment &env, const Utils::FileName &buildDir) :
m_sourceDir(sourceDir),
m_buildDir(buildDir),
m_kit(k),
m_environment(env),
m_inputConfig(inputConfig),
m_inputToolchainInfo(inputToolchainInfo),
m_watcher(new QFileSystemWatcher(this))
{
QTC_CHECK(!sourceDir.isEmpty());
Expand All @@ -109,7 +110,7 @@ BuildDirManager::BuildDirManager(const Utils::FileName &sourceDir, const Project

m_reparseTimer.setSingleShot(true);
m_reparseTimer.setInterval(500);
connect(&m_reparseTimer, &QTimer::timeout, this, &BuildDirManager::forceReparse);
connect(&m_reparseTimer, &QTimer::timeout, this, &BuildDirManager::forceReparseTimer);

connect(m_watcher, &QFileSystemWatcher::fileChanged, this, [this]() {
if (!isBusy())
Expand All @@ -131,27 +132,77 @@ bool BuildDirManager::isBusy() const
return false;
}

void BuildDirManager::forceReparse()
namespace {
bool removePath(QString path)
{
bool result = true;
QFileInfo fi(path);

if (fi.isDir()) {
QDir dir(path);
if (dir.exists(path)) {
for (QFileInfo &info : dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::AllDirs | QDir::Files, QDir::DirsFirst)) {
if (info.isDir()) {
result = removePath(info.absoluteFilePath());
}
else {
result = QFile::remove(info.absoluteFilePath());
}

if (!result) {
return result;
}
}
result = dir.rmdir(path);
}
} else {
result = QFile::remove(path);
}
return result;
}
} // ::anonymous

void BuildDirManager::forceReparse(bool clearCache)
{
if (isBusy()) {
m_cmakeProcess->disconnect();
m_cmakeProcess->deleteLater();
m_cmakeProcess = nullptr;
}

if (clearCache) {
QString cmakeCache(m_buildDir.toString() + QLatin1String("/CMakeCache.txt"));
QString cmakeFiles(m_buildDir.toString() + QLatin1String("/CMakeFiles"));

if (QFileInfo::exists(cmakeCache)) {
removePath(cmakeCache);
}

if (QFileInfo::exists(cmakeFiles)) {
removePath(cmakeFiles);
}
}

CMakeTool *tool = CMakeKitInformation::cmakeTool(m_kit);
const QString generator = CMakeGeneratorKitInformation::generator(m_kit);

QTC_ASSERT(tool, return);
QTC_ASSERT(!generator.isEmpty(), return);

startCMake(tool, generator, m_inputConfig);
startCMake(tool, generator, m_inputConfig, m_inputToolchainInfo);
}

void BuildDirManager::forceReparseTimer()
{
forceReparse(false);
}

void BuildDirManager::setInputConfiguration(const CMakeConfig &config)
void BuildDirManager::setInputConfiguration(const CMakeConfig &config, const CMakeToolchainInfo &info)
{
bool clearCache = m_inputToolchainInfo != info;
m_inputConfig = config;
forceReparse();
m_inputToolchainInfo = info;
forceReparse(clearCache);
}

void BuildDirManager::parse()
Expand All @@ -168,7 +219,7 @@ void BuildDirManager::parse()

if (!cbpFileFi.exists()) {
// Initial create:
startCMake(tool, generator, m_inputConfig);
startCMake(tool, generator, m_inputConfig, m_inputToolchainInfo);
return;
}

Expand All @@ -177,7 +228,7 @@ void BuildDirManager::parse()
return f.toFileInfo().lastModified() > cbpFileFi.lastModified();
});
if (mustUpdate) {
startCMake(tool, generator, CMakeConfig());
startCMake(tool, generator, CMakeConfig(), CMakeToolchainInfo());
} else {
extractData();
emit dataAvailable();
Expand Down Expand Up @@ -263,7 +314,7 @@ void BuildDirManager::extractData()
}

void BuildDirManager::startCMake(CMakeTool *tool, const QString &generator,
const CMakeConfig &config)
const CMakeConfig &config, const CMakeToolchainInfo &toolchain)
{
QTC_ASSERT(tool && tool->isValid(), return);
QTC_ASSERT(!m_cmakeProcess, return);
Expand Down Expand Up @@ -308,6 +359,7 @@ void BuildDirManager::startCMake(CMakeTool *tool, const QString &generator,
if (!generator.isEmpty())
Utils::QtcProcess::addArg(&args, QString::fromLatin1("-G%1").arg(generator));
Utils::QtcProcess::addArgs(&args, toArguments(config));
Utils::QtcProcess::addArgs(&args, toolchain.arguments(toArguments(config), buildDirStr));

ProjectExplorer::TaskHub::clearTasks(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM);

Expand Down
11 changes: 7 additions & 4 deletions builddirmanager.h
Expand Up @@ -28,6 +28,7 @@

#include "cmakecbpparser.h"
#include "cmakeconfigitem.h"
#include "cmaketoolchaininfo.h"

#include <projectexplorer/task.h>

Expand Down Expand Up @@ -63,7 +64,7 @@ class BuildDirManager : public QObject

public:
BuildDirManager(const Utils::FileName &sourceDir, const ProjectExplorer::Kit *k,
const CMakeConfig &inputConfig, const Utils::Environment &env,
const CMakeConfig &inputConfig, const CMakeToolchainInfo &inputToolchainInfo, const Utils::Environment &env,
const Utils::FileName &buildDir);
~BuildDirManager() override;

Expand All @@ -73,9 +74,10 @@ class BuildDirManager : public QObject
bool isBusy() const;

void parse();
void forceReparse();
void forceReparse(bool clearCache = false);
void forceReparseTimer();

void setInputConfiguration(const CMakeConfig &config);
void setInputConfiguration(const CMakeConfig &config, const CMakeToolchainInfo &info);

bool isProjectFile(const Utils::FileName &fileName) const;
QString projectName() const;
Expand All @@ -92,7 +94,7 @@ class BuildDirManager : public QObject
private:
void extractData();

void startCMake(CMakeTool *tool, const QString &generator, const CMakeConfig &config);
void startCMake(CMakeTool *tool, const QString &generator, const CMakeConfig &config, const CMakeToolchainInfo &toolchain);

void cmakeFinished(int code, QProcess::ExitStatus status);
void processCMakeOutput();
Expand All @@ -106,6 +108,7 @@ class BuildDirManager : public QObject
const ProjectExplorer::Kit *const m_kit;
Utils::Environment m_environment;
CMakeConfig m_inputConfig;
CMakeToolchainInfo m_inputToolchainInfo;

QTemporaryDir *m_tempDir = nullptr;
Utils::QtcProcess *m_cmakeProcess = nullptr;
Expand Down
27 changes: 12 additions & 15 deletions cmakebuildconfiguration.cpp
Expand Up @@ -109,9 +109,9 @@ QVariantMap CMakeBuildConfiguration::toMap() const
const QStringList config
= Utils::transform(m_configuration, [](const CMakeConfigItem &i) { return i.toString(); });
map.insert(QLatin1String(CONFIGURATION_KEY), config);
map.insert(QLatin1String(CMAKE_TOOLCHAIN_TYPE_KEY), static_cast<int>(m_cmakeParamsExt.toolchainOverride));
map.insert(QLatin1String(CMAKE_TOOLCHAIN_FILE_KEY), m_cmakeParamsExt.toolchainFile);
map.insert(QLatin1String(CMAKE_TOOLCHAIN_INLINE_KEY), m_cmakeParamsExt.toolchainInline);
map.insert(QLatin1String(CMAKE_TOOLCHAIN_TYPE_KEY), static_cast<int>(m_cmakeToolchainInfo.toolchainOverride));
map.insert(QLatin1String(CMAKE_TOOLCHAIN_FILE_KEY), m_cmakeToolchainInfo.toolchainFile);
map.insert(QLatin1String(CMAKE_TOOLCHAIN_INLINE_KEY), m_cmakeToolchainInfo.toolchainInline);
return map;
}

Expand Down Expand Up @@ -142,30 +142,27 @@ bool CMakeBuildConfiguration::fromMap(const QVariantMap &map)

setCMakeConfiguration(legacyConf + conf);

m_cmakeParamsExt.toolchainOverride =
m_cmakeToolchainInfo.toolchainOverride =
static_cast<CMakeToolchainOverrideType>(
map.value(QLatin1String(CMAKE_TOOLCHAIN_TYPE_KEY), static_cast<int>(CMakeToolchainOverrideType::Disabled)).toInt());
m_cmakeParamsExt.toolchainFile =
m_cmakeToolchainInfo.toolchainFile =
map.value(QLatin1String(CMAKE_TOOLCHAIN_FILE_KEY), QLatin1String("")).toString();
m_cmakeParamsExt.toolchainInline =
m_cmakeToolchainInfo.toolchainInline =
map.value(QLatin1String(CMAKE_TOOLCHAIN_INLINE_KEY), QLatin1String("")).toString();

return true;
}

const CMakeParamsExt &CMakeBuildConfiguration::cmakeParamsExt() const
const CMakeToolchainInfo &CMakeBuildConfiguration::cmakeToolchainInfo() const
{
return m_cmakeParamsExt;
return m_cmakeToolchainInfo;
}

void CMakeBuildConfiguration::setCMakeParamsExt(const CMakeParamsExt &cmakeParamsExt)
void CMakeBuildConfiguration::setCMakeToolchainInfo(const CMakeToolchainInfo &cmakeToolchainInfo)
{
if (m_cmakeParamsExt == cmakeParamsExt)
if (m_cmakeToolchainInfo == cmakeToolchainInfo)
return;
m_cmakeParamsExt = cmakeParamsExt;
// TODO: is this need?
emit buildDirectoryChanged();
emit environmentChanged();
m_cmakeToolchainInfo = cmakeToolchainInfo;
}

void CMakeBuildConfiguration::emitBuildTypeChanged()
Expand Down Expand Up @@ -305,7 +302,7 @@ ProjectExplorer::BuildConfiguration *CMakeBuildConfigurationFactory::create(Proj

bc->setBuildDirectory(copy.buildDirectory);
bc->setCMakeConfiguration(copy.configuration);
bc->setCMakeParamsExt(copy.cmakeParamsExt);
bc->setCMakeToolchainInfo(copy.cmakeToolchainInfo);

// Default to all
if (project->hasBuildTarget(QLatin1String("all")))
Expand Down
8 changes: 4 additions & 4 deletions cmakebuildconfiguration.h
Expand Up @@ -30,7 +30,7 @@
#include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/abi.h>

#include "cmakeparamsext.h"
#include "cmaketoolchaininfo.h"

namespace ProjectExplorer { class ToolChain; }

Expand Down Expand Up @@ -59,8 +59,8 @@ class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration

BuildType buildType() const override;

const CMakeParamsExt& cmakeParamsExt() const;
void setCMakeParamsExt(const CMakeParamsExt &cmakeParamsExt);
const CMakeToolchainInfo& cmakeToolchainInfo() const;
void setCMakeToolchainInfo(const CMakeToolchainInfo &cmakeToolchainInfo);

void emitBuildTypeChanged();

Expand All @@ -80,7 +80,7 @@ class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration
private:
QString m_initialArguments;
CMakeConfig m_configuration;
CMakeParamsExt m_cmakeParamsExt;
CMakeToolchainInfo m_cmakeToolchainInfo;
QString m_error;

friend class CMakeProjectManager::CMakeProject;
Expand Down
5 changes: 2 additions & 3 deletions cmakebuildinfo.h
Expand Up @@ -49,7 +49,7 @@ class CMakeBuildInfo : public ProjectExplorer::BuildInfo
displayName = bc->displayName();
buildDirectory = bc->buildDirectory();
kitId = bc->target()->kit()->id();
cmakeParamsExt = bc->cmakeParamsExt();
cmakeToolchainInfo = bc->cmakeToolchainInfo();

QTC_ASSERT(bc->target()->project(), return);
sourceDirectory = bc->target()->project()->projectDirectory().toString();
Expand All @@ -58,8 +58,7 @@ class CMakeBuildInfo : public ProjectExplorer::BuildInfo

QString sourceDirectory;
CMakeConfig configuration;
//QString cmakeParams;
CMakeParamsExt cmakeParamsExt;
CMakeToolchainInfo cmakeToolchainInfo;
};

} // namespace CMakeProjectManager

0 comments on commit bb5f74b

Please sign in to comment.