forked from qt-creator/qt-creator
CMake supports the use of custom startup programs that are provided in the IDE to simplify execution. If the build system provides launchers, these are provided as an additional selection field of the run configuration including an entry without launcher. As of cmake version 3.29, the start programs are extracted from the API of the cmake file. For older cmake versions, a launcher is initialized from the cmake variable CMAKE_CROSSCOMPILING_EMULATOR, if available. Fixes: QTCREATORBUG-29880 Change-Id: I4345b56c9ca5befb5876a361e7da4675590399ca Reviewed-by: Christian Kandeler <christian.kandeler@qt.io> Reviewed-by: Cristian Adam <cristian.adam@qt.io>
240 lines
4.6 KiB
C++
240 lines
4.6 KiB
C++
// Copyright (C) 2016 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
|
|
|
#pragma once
|
|
|
|
#include "cmakeconfigitem.h"
|
|
|
|
#include "fileapidataextractor.h"
|
|
|
|
#include <projectexplorer/headerpath.h>
|
|
#include <projectexplorer/projectmacro.h>
|
|
|
|
#include <utils/filesystemwatcher.h>
|
|
#include <utils/fileutils.h>
|
|
|
|
#include <QString>
|
|
#include <QVector>
|
|
#include <QVersionNumber>
|
|
|
|
#include <vector>
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
template <typename Ret>
|
|
class QPromise;
|
|
QT_END_NAMESPACE
|
|
|
|
namespace CMakeProjectManager::Internal {
|
|
|
|
namespace FileApiDetails {
|
|
|
|
class ReplyObject
|
|
{
|
|
public:
|
|
QString kind;
|
|
QString file;
|
|
std::pair<int, int> version;
|
|
};
|
|
|
|
class ReplyFileContents
|
|
{
|
|
public:
|
|
QString generator;
|
|
bool isMultiConfig = false;
|
|
QString cmakeExecutable;
|
|
QString ctestExecutable;
|
|
QString cmakeRoot;
|
|
|
|
QVector<ReplyObject> replies;
|
|
QVersionNumber cmakeVersion;
|
|
|
|
Utils::FilePath jsonFile(const QString &kind, const Utils::FilePath &replyDir) const;
|
|
};
|
|
|
|
class Directory
|
|
{
|
|
public:
|
|
QString buildPath;
|
|
QString sourcePath;
|
|
int parent = -1;
|
|
int project = -1;
|
|
std::vector<int> children;
|
|
std::vector<int> targets;
|
|
bool hasInstallRule = false;
|
|
};
|
|
|
|
class Project
|
|
{
|
|
public:
|
|
QString name;
|
|
int parent = -1;
|
|
std::vector<int> children;
|
|
std::vector<int> directories;
|
|
std::vector<int> targets;
|
|
};
|
|
|
|
class Target
|
|
{
|
|
public:
|
|
// From codemodel file:
|
|
QString name;
|
|
QString id;
|
|
int directory = -1;
|
|
int project = -1;
|
|
QString jsonFile;
|
|
};
|
|
|
|
class Configuration
|
|
{
|
|
public:
|
|
QString name;
|
|
std::vector<Directory> directories;
|
|
std::vector<Project> projects;
|
|
std::vector<Target> targets;
|
|
};
|
|
|
|
class InstallDestination
|
|
{
|
|
public:
|
|
QString path;
|
|
int backtrace;
|
|
};
|
|
|
|
class FragmentInfo
|
|
{
|
|
public:
|
|
QString fragment;
|
|
QString role;
|
|
};
|
|
|
|
class LinkInfo
|
|
{
|
|
public:
|
|
QString language;
|
|
std::vector<FragmentInfo> fragments;
|
|
bool isLto = false;
|
|
QString sysroot;
|
|
};
|
|
|
|
class ArchiveInfo
|
|
{
|
|
public:
|
|
std::vector<FragmentInfo> fragments;
|
|
bool isLto = false;
|
|
};
|
|
|
|
class DependencyInfo
|
|
{
|
|
public:
|
|
QString targetId;
|
|
int backtrace;
|
|
};
|
|
|
|
class SourceInfo
|
|
{
|
|
public:
|
|
QString path;
|
|
int compileGroup = -1;
|
|
int sourceGroup = -1;
|
|
int backtrace = -1;
|
|
bool isGenerated = false;
|
|
};
|
|
|
|
class IncludeInfo
|
|
{
|
|
public:
|
|
ProjectExplorer::HeaderPath path;
|
|
int backtrace;
|
|
};
|
|
|
|
class DefineInfo
|
|
{
|
|
public:
|
|
ProjectExplorer::Macro define;
|
|
int backtrace;
|
|
};
|
|
|
|
class CompileInfo
|
|
{
|
|
public:
|
|
std::vector<int> sources;
|
|
QString language;
|
|
QStringList fragments;
|
|
std::vector<IncludeInfo> includes;
|
|
std::vector<DefineInfo> defines;
|
|
QString sysroot;
|
|
};
|
|
|
|
class BacktraceNode
|
|
{
|
|
public:
|
|
int file = -1;
|
|
int line = -1;
|
|
int command = -1;
|
|
int parent = -1;
|
|
};
|
|
|
|
class BacktraceInfo
|
|
{
|
|
public:
|
|
std::vector<QString> commands;
|
|
std::vector<QString> files;
|
|
std::vector<BacktraceNode> nodes;
|
|
};
|
|
|
|
class TargetDetails
|
|
{
|
|
public:
|
|
QString name;
|
|
QString id;
|
|
QString type;
|
|
QString folderTargetProperty;
|
|
Utils::FilePath sourceDir;
|
|
Utils::FilePath buildDir;
|
|
int backtrace = -1;
|
|
bool isGeneratorProvided = false;
|
|
QString nameOnDisk;
|
|
QList<Utils::FilePath> artifacts;
|
|
QString installPrefix;
|
|
std::vector<InstallDestination> installDestination;
|
|
QList<ProjectExplorer::LauncherInfo> launcherInfos;
|
|
std::optional<LinkInfo> link;
|
|
std::optional<ArchiveInfo> archive;
|
|
std::vector<DependencyInfo> dependencies;
|
|
std::vector<SourceInfo> sources;
|
|
std::vector<QString> sourceGroups;
|
|
std::vector<CompileInfo> compileGroups;
|
|
BacktraceInfo backtraceGraph;
|
|
};
|
|
|
|
} // namespace FileApiDetails
|
|
|
|
class FileApiData
|
|
{
|
|
public:
|
|
FileApiDetails::ReplyFileContents replyFile;
|
|
CMakeConfig cache;
|
|
std::vector<CMakeFileInfo> cmakeFiles;
|
|
FileApiDetails::Configuration codemodel;
|
|
std::vector<FileApiDetails::TargetDetails> targetDetails;
|
|
};
|
|
|
|
class FileApiParser
|
|
{
|
|
public:
|
|
static FileApiData parseData(QPromise<std::shared_ptr<FileApiQtcData>> &promise,
|
|
const Utils::FilePath &replyFilePath,
|
|
const Utils::FilePath &buildDir,
|
|
const QString &cmakeBuildType,
|
|
QString &errorMessage);
|
|
|
|
static bool setupCMakeFileApi(const Utils::FilePath &buildDirectory);
|
|
|
|
static Utils::FilePath cmakeReplyDirectory(const Utils::FilePath &buildDirectory);
|
|
static Utils::FilePaths cmakeQueryFilePaths(const Utils::FilePath &buildDirectory);
|
|
|
|
static Utils::FilePath scanForCMakeReplyFile(const Utils::FilePath &buildDirectory);
|
|
};
|
|
|
|
} // CMakeProjectManager::Internal
|