CMakePM: Allow using CMakeCache.txt as project file

The CMakeCache.txt file has CMAKE_HOME_DIRECTORY pointing to the
project source directory used to configure the project.

Use that as source directory, and the directory of CMakeCache.txt as the
build directory.

Task-number: QTCREATORBUG-24439
Task-number: QTCREATORBUG-30507
Change-Id: Ib032406b014f8f7ee5fc1d47bbe3796c6b8f8060
Reviewed-by: Marcus Tillmanns <marcus.tillmanns@qt.io>
This commit is contained in:
Cristian Adam
2020-12-02 19:16:40 +01:00
parent 79774519cc
commit c9b438c04a
5 changed files with 36 additions and 1 deletions

View File

@@ -38,6 +38,7 @@
" <sub-class-of type='text/x-cmake'/>", " <sub-class-of type='text/x-cmake'/>",
" <comment>CMake Project file</comment>", " <comment>CMake Project file</comment>",
" <glob pattern='CMakeLists.txt'/>", " <glob pattern='CMakeLists.txt'/>",
" <glob pattern='CMakeCache.txt'/>",
" </mime-type>", " </mime-type>",
"</mime-info>" "</mime-info>"
] ]

View File

@@ -5,6 +5,7 @@
#include "cmakebuildconfiguration.h" #include "cmakebuildconfiguration.h"
#include "cmakebuildsystem.h" #include "cmakebuildsystem.h"
#include "cmakeprojectconstants.h"
#include "cmakekitaspect.h" #include "cmakekitaspect.h"
#include "cmaketoolmanager.h" #include "cmaketoolmanager.h"

View File

@@ -29,11 +29,24 @@ using namespace CMakeProjectManager::Internal;
namespace CMakeProjectManager { namespace CMakeProjectManager {
static FilePath cmakeListTxtFromFilePath(const FilePath &filepath)
{
if (filepath.endsWith(Constants::CMAKE_CACHE_TXT)) {
QString errorMessage;
const CMakeConfig config = CMakeConfig::fromFile(filepath, &errorMessage);
const FilePath cmakeListsTxt = config.filePathValueOf("CMAKE_HOME_DIRECTORY")
.pathAppended(Constants::CMAKE_LISTS_TXT);
if (cmakeListsTxt.exists())
return cmakeListsTxt;
}
return filepath;
}
/*! /*!
\class CMakeProject \class CMakeProject
*/ */
CMakeProject::CMakeProject(const FilePath &fileName) CMakeProject::CMakeProject(const FilePath &fileName)
: Project(Utils::Constants::CMAKE_MIMETYPE, fileName) : Project(Utils::Constants::CMAKE_MIMETYPE, cmakeListTxtFromFilePath(fileName))
, m_settings(this, true) , m_settings(this, true)
{ {
setId(CMakeProjectManager::Constants::CMAKE_PROJECT_ID); setId(CMakeProjectManager::Constants::CMAKE_PROJECT_ID);
@@ -47,6 +60,9 @@ CMakeProject::CMakeProject(const FilePath &fileName)
setHasMakeInstallEquivalent(false); setHasMakeInstallEquivalent(false);
readPresets(); readPresets();
if (fileName.endsWith(Constants::CMAKE_CACHE_TXT))
m_buildDirToImport = fileName.parentDir();
} }
CMakeProject::~CMakeProject() CMakeProject::~CMakeProject()
@@ -332,6 +348,11 @@ void CMakeProject::readPresets()
} }
} }
FilePath CMakeProject::buildDirectoryToImport() const
{
return m_buildDirToImport;
}
bool CMakeProject::setupTarget(Target *t) bool CMakeProject::setupTarget(Target *t)
{ {
t->updateDefaultBuildConfigurations(); t->updateDefaultBuildConfigurations();

View File

@@ -31,6 +31,7 @@ public:
Internal::PresetsData presetsData() const; Internal::PresetsData presetsData() const;
void readPresets(); void readPresets();
Utils::FilePath buildDirectoryToImport() const;
void setOldPresetKits(const QList<ProjectExplorer::Kit *> &presetKits) const; void setOldPresetKits(const QList<ProjectExplorer::Kit *> &presetKits) const;
QList<ProjectExplorer::Kit *> oldPresetKits() const; QList<ProjectExplorer::Kit *> oldPresetKits() const;
@@ -54,6 +55,7 @@ private:
ProjectExplorer::Tasks m_issues; ProjectExplorer::Tasks m_issues;
Internal::PresetsData m_presetsData; Internal::PresetsData m_presetsData;
Internal::CMakeSpecificSettings m_settings; Internal::CMakeSpecificSettings m_settings;
Utils::FilePath m_buildDirToImport;
}; };
} // namespace CMakeProjectManager } // namespace CMakeProjectManager

View File

@@ -167,6 +167,9 @@ static QString displayPresetName(const QString &presetName)
FilePaths CMakeProjectImporter::importCandidates() FilePaths CMakeProjectImporter::importCandidates()
{ {
if (!m_project->buildDirectoryToImport().isEmpty())
return {m_project->buildDirectoryToImport()};
FilePaths candidates = presetCandidates(); FilePaths candidates = presetCandidates();
if (candidates.isEmpty()) { if (candidates.isEmpty()) {
@@ -299,6 +302,13 @@ static QVariant findOrRegisterDebugger(
Target *CMakeProjectImporter::preferredTarget(const QList<Target *> &possibleTargets) Target *CMakeProjectImporter::preferredTarget(const QList<Target *> &possibleTargets)
{ {
if (!m_project->buildDirectoryToImport().isEmpty()) {
return Utils::findOrDefault(possibleTargets, [this](const Target *t) {
return t->activeBuildConfiguration()->buildDirectory()
== m_project->buildDirectoryToImport();
});
}
for (Kit *kit : m_project->oldPresetKits()) { for (Kit *kit : m_project->oldPresetKits()) {
const bool haveKit = Utils::contains(possibleTargets, [kit](const auto &target) { const bool haveKit = Utils::contains(possibleTargets, [kit](const auto &target) {
return target->kit() == kit; return target->kit() == kit;