ProjectExplorer: Replace unusual ExecutableAspect constructor

... by an (only) slightly less weird setter.

Helps with a more uniform aspect API.

Task-number: QTCREATORBUG-29168
Change-Id: I40d2e878987ed7b817e08d250566bc548712749d
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2023-06-29 17:45:09 +02:00
parent 914bc626e7
commit 2cc4967451
14 changed files with 89 additions and 70 deletions

View File

@@ -25,7 +25,8 @@ public:
explicit BareMetalRunConfiguration(Target *target, Id id)
: RunConfiguration(target, id)
{
const auto exeAspect = addAspect<ExecutableAspect>(target, ExecutableAspect::RunDevice);
const auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::RunDevice);
exeAspect->setPlaceHolderText(Tr::tr("Unknown"));
addAspect<ArgumentsAspect>(macroExpander());
@@ -46,7 +47,8 @@ public:
explicit BareMetalCustomRunConfiguration(Target *target, Id id)
: RunConfiguration(target, id)
{
const auto exeAspect = addAspect<ExecutableAspect>(target, ExecutableAspect::RunDevice);
const auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::RunDevice);
exeAspect->setSettingsKey("BareMetal.CustomRunConfig.Executable");
exeAspect->setPlaceHolderText(Tr::tr("Unknown"));
exeAspect->setReadOnly(false);

View File

@@ -67,7 +67,8 @@ private:
QdbRunConfiguration::QdbRunConfiguration(Target *target, Id id)
: RunConfiguration(target, id)
{
auto exeAspect = addAspect<ExecutableAspect>(target, ExecutableAspect::RunDevice);
auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::RunDevice);
exeAspect->setSettingsKey("QdbRunConfig.RemoteExecutable");
exeAspect->setLabelText(Tr::tr("Executable on device:"));
exeAspect->setPlaceHolderText(Tr::tr("Remote path not set"));

View File

@@ -58,7 +58,8 @@ static IosDeviceType toIosDeviceType(const SimulatorInfo &device)
IosRunConfiguration::IosRunConfiguration(Target *target, Id id)
: RunConfiguration(target, id)
{
auto executableAspect = addAspect<ExecutableAspect>(target, ExecutableAspect::RunDevice);
auto executableAspect = addAspect<ExecutableAspect>();
executableAspect->setDeviceSelector(target, ExecutableAspect::RunDevice);
addAspect<ArgumentsAspect>(macroExpander());

View File

@@ -26,7 +26,9 @@ public:
auto envAspect = addAspect<EnvironmentAspect>();
envAspect->setSupportForBuildEnvironment(target);
addAspect<ExecutableAspect>(target, ExecutableAspect::RunDevice);
auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::RunDevice);
addAspect<ArgumentsAspect>(macroExpander());
addAspect<WorkingDirectoryAspect>(macroExpander(), envAspect);
addAspect<TerminalAspect>();

View File

@@ -29,7 +29,9 @@ public:
auto envAspect = addAspect<EnvironmentAspect>();
envAspect->setSupportForBuildEnvironment(target);
addAspect<ExecutableAspect>(target, ExecutableAspect::RunDevice);
auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::RunDevice);
addAspect<ArgumentsAspect>(macroExpander());
addAspect<WorkingDirectoryAspect>(macroExpander(), envAspect);
addAspect<TerminalAspect>();
@@ -64,8 +66,10 @@ public:
NimbleTestConfiguration(ProjectExplorer::Target *target, Utils::Id id)
: RunConfiguration(target, id)
{
addAspect<ExecutableAspect>(target, ExecutableAspect::BuildDevice)
->setExecutable(Nim::nimblePathFromKit(target->kit()));
auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::BuildDevice);
exeAspect->setExecutable(Nim::nimblePathFromKit(target->kit()));
addAspect<ArgumentsAspect>(macroExpander())->setArguments("test");
addAspect<WorkingDirectoryAspect>(macroExpander(), nullptr)
->setDefaultWorkingDirectory(project()->projectDirectory());

View File

@@ -29,7 +29,9 @@ public:
auto envAspect = addAspect<EnvironmentAspect>();
envAspect->setSupportForBuildEnvironment(target);
addAspect<ExecutableAspect>(target, ExecutableAspect::RunDevice);
auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::RunDevice);
addAspect<ArgumentsAspect>(macroExpander());
addAspect<WorkingDirectoryAspect>(macroExpander(), envAspect);
addAspect<TerminalAspect>();

View File

@@ -26,7 +26,8 @@ CustomExecutableRunConfiguration::CustomExecutableRunConfiguration(Target *targe
auto envAspect = addAspect<EnvironmentAspect>();
envAspect->setSupportForBuildEnvironment(target);
auto exeAspect = addAspect<ExecutableAspect>(target, ExecutableAspect::HostDevice);
auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::HostDevice);
exeAspect->setSettingsKey("ProjectExplorer.CustomExecutableRunConfiguration.Executable");
exeAspect->setReadOnly(false);
exeAspect->setHistoryCompleter("Qt.CustomExecutable.History");

View File

@@ -45,7 +45,9 @@ DesktopRunConfiguration::DesktopRunConfiguration(Target *target, Id id, Kind kin
auto envAspect = addAspect<EnvironmentAspect>();
envAspect->setSupportForBuildEnvironment(target);
addAspect<ExecutableAspect>(target, ExecutableAspect::RunDevice);
auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::RunDevice);
addAspect<ArgumentsAspect>(macroExpander());
addAspect<WorkingDirectoryAspect>(macroExpander(), envAspect);
addAspect<TerminalAspect>();

View File

@@ -495,8 +495,8 @@ void ArgumentsAspect::addToLayout(LayoutItem &builder)
by the build system's parsing results with an optional manual override.
*/
ExecutableAspect::ExecutableAspect(Target *target, ExecutionDeviceSelector selector)
: m_target(target), m_selector(selector)
ExecutableAspect::ExecutableAspect(AspectContainer *container)
: BaseAspect(container)
{
setDisplayName(Tr::tr("Executable"));
setId("ExecutableAspect");
@@ -506,8 +506,6 @@ ExecutableAspect::ExecutableAspect(Target *target, ExecutionDeviceSelector selec
m_executable.setPlaceHolderText(Tr::tr("Enter the path to the executable"));
m_executable.setLabelText(Tr::tr("Executable:"));
updateDevice();
connect(&m_executable, &StringAspect::changed, this, &ExecutableAspect::changed);
}
@@ -533,8 +531,11 @@ ExecutableAspect::~ExecutableAspect()
m_alternativeExecutable = nullptr;
}
void ExecutableAspect::updateDevice()
void ExecutableAspect::setDeviceSelector(Target *target, ExecutionDeviceSelector selector)
{
m_target = target;
m_selector = selector;
const IDevice::ConstPtr dev = executionDevice(m_target, m_selector);
const OsType osType = dev ? dev->osType() : HostOsInfo::hostOs();

View File

@@ -155,12 +155,13 @@ class PROJECTEXPLORER_EXPORT ExecutableAspect : public Utils::BaseAspect
public:
enum ExecutionDeviceSelector { HostDevice, BuildDevice, RunDevice };
explicit ExecutableAspect(Target *target, ExecutionDeviceSelector selector);
explicit ExecutableAspect(Utils::AspectContainer *container = nullptr);
~ExecutableAspect() override;
Utils::FilePath executable() const;
void setExecutable(const Utils::FilePath &executable);
void setDeviceSelector(Target *target, ExecutionDeviceSelector selector);
void setSettingsKey(const QString &key);
void makeOverridable(const QString &overridingKey, const QString &useOverridableKey);
void addToLayout(Layouting::LayoutItem &parent) override;
@@ -182,7 +183,6 @@ protected:
private:
QString executableText() const;
void updateDevice();
Utils::FilePathAspect m_executable;
Utils::FilePathAspect *m_alternativeExecutable = nullptr;

View File

@@ -22,59 +22,60 @@ using namespace Utils;
namespace Qnx::Internal {
class QnxRunConfiguration final : public ProjectExplorer::RunConfiguration
class QnxRunConfiguration final : public RunConfiguration
{
public:
QnxRunConfiguration(ProjectExplorer::Target *target, Utils::Id id);
QnxRunConfiguration(Target *target, Id id)
: RunConfiguration(target, id)
{
auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::RunDevice);
exeAspect->setLabelText(Tr::tr("Executable on device:"));
exeAspect->setPlaceHolderText(Tr::tr("Remote path not set"));
exeAspect->makeOverridable("RemoteLinux.RunConfig.AlternateRemoteExecutable",
"RemoteLinux.RunConfig.UseAlternateRemoteExecutable");
exeAspect->setHistoryCompleter("RemoteLinux.AlternateExecutable.History");
auto symbolsAspect = addAspect<SymbolFileAspect>();
symbolsAspect->setLabelText(Tr::tr("Executable on host:"));
symbolsAspect->setDisplayStyle(SymbolFileAspect::LabelDisplay);
auto envAspect = addAspect<RemoteLinuxEnvironmentAspect>(target);
addAspect<ArgumentsAspect>(macroExpander());
addAspect<WorkingDirectoryAspect>(macroExpander(), envAspect);
addAspect<TerminalAspect>();
auto libAspect = addAspect<StringAspect>();
libAspect->setSettingsKey("Qt4ProjectManager.QnxRunConfiguration.QtLibPath");
libAspect->setLabelText(Tr::tr("Path to Qt libraries on device"));
libAspect->setDisplayStyle(StringAspect::LineEditDisplay);
setUpdater([this, target, exeAspect, symbolsAspect] {
const BuildTargetInfo bti = buildTargetInfo();
const FilePath localExecutable = bti.targetFilePath;
const DeployableFile depFile = target->deploymentData()
.deployableForLocalFile(localExecutable);
exeAspect->setExecutable(FilePath::fromString(depFile.remoteFilePath()));
symbolsAspect->setValue(localExecutable);
});
setRunnableModifier([libAspect](Runnable &r) {
QString libPath = libAspect->value();
if (!libPath.isEmpty()) {
r.environment.appendOrSet("LD_LIBRARY_PATH", libPath + "/lib:$LD_LIBRARY_PATH");
r.environment.appendOrSet("QML_IMPORT_PATH", libPath + "/imports:$QML_IMPORT_PATH");
r.environment.appendOrSet("QML2_IMPORT_PATH", libPath + "/qml:$QML2_IMPORT_PATH");
r.environment.appendOrSet("QT_PLUGIN_PATH", libPath + "/plugins:$QT_PLUGIN_PATH");
r.environment.set("QT_QPA_FONTDIR", libPath + "/lib/fonts");
}
});
connect(target, &Target::buildSystemUpdated, this, &RunConfiguration::update);
}
};
QnxRunConfiguration::QnxRunConfiguration(Target *target, Id id)
: RunConfiguration(target, id)
{
auto exeAspect = addAspect<ExecutableAspect>(target, ExecutableAspect::RunDevice);
exeAspect->setLabelText(Tr::tr("Executable on device:"));
exeAspect->setPlaceHolderText(Tr::tr("Remote path not set"));
exeAspect->makeOverridable("RemoteLinux.RunConfig.AlternateRemoteExecutable",
"RemoteLinux.RunConfig.UseAlternateRemoteExecutable");
exeAspect->setHistoryCompleter("RemoteLinux.AlternateExecutable.History");
auto symbolsAspect = addAspect<SymbolFileAspect>();
symbolsAspect->setLabelText(Tr::tr("Executable on host:"));
symbolsAspect->setDisplayStyle(SymbolFileAspect::LabelDisplay);
auto envAspect = addAspect<RemoteLinuxEnvironmentAspect>(target);
addAspect<ArgumentsAspect>(macroExpander());
addAspect<WorkingDirectoryAspect>(macroExpander(), envAspect);
addAspect<TerminalAspect>();
auto libAspect = addAspect<StringAspect>();
libAspect->setSettingsKey("Qt4ProjectManager.QnxRunConfiguration.QtLibPath");
libAspect->setLabelText(Tr::tr("Path to Qt libraries on device"));
libAspect->setDisplayStyle(StringAspect::LineEditDisplay);
setUpdater([this, target, exeAspect, symbolsAspect] {
const BuildTargetInfo bti = buildTargetInfo();
const FilePath localExecutable = bti.targetFilePath;
const DeployableFile depFile = target->deploymentData()
.deployableForLocalFile(localExecutable);
exeAspect->setExecutable(FilePath::fromString(depFile.remoteFilePath()));
symbolsAspect->setValue(localExecutable);
});
setRunnableModifier([libAspect](Runnable &r) {
QString libPath = libAspect->value();
if (!libPath.isEmpty()) {
r.environment.appendOrSet("LD_LIBRARY_PATH", libPath + "/lib:$LD_LIBRARY_PATH");
r.environment.appendOrSet("QML_IMPORT_PATH", libPath + "/imports:$QML_IMPORT_PATH");
r.environment.appendOrSet("QML2_IMPORT_PATH", libPath + "/qml:$QML2_IMPORT_PATH");
r.environment.appendOrSet("QT_PLUGIN_PATH", libPath + "/plugins:$QT_PLUGIN_PATH");
r.environment.set("QT_QPA_FONTDIR", libPath + "/lib/fonts");
}
});
connect(target, &Target::buildSystemUpdated, this, &RunConfiguration::update);
}
// QnxRunConfigurationFactory

View File

@@ -87,8 +87,8 @@ MakeInstallStep::MakeInstallStep(BuildStepList *parent, Id id) : MakeStep(parent
rootPath = FilePath::fromString(tmpDir.path());
}
const auto makeAspect = addAspect<ExecutableAspect>(parent->target(),
ExecutableAspect::BuildDevice);
const auto makeAspect = addAspect<ExecutableAspect>();
makeAspect->setDeviceSelector(parent->target(), ExecutableAspect::BuildDevice);
makeAspect->setId(MakeAspectId);
makeAspect->setSettingsKey(MakeAspectId);
makeAspect->setReadOnly(false);

View File

@@ -34,7 +34,8 @@ RemoteLinuxCustomRunConfiguration::RemoteLinuxCustomRunConfiguration(Target *tar
{
auto envAspect = addAspect<RemoteLinuxEnvironmentAspect>(target);
auto exeAspect = addAspect<ExecutableAspect>(target, ExecutableAspect::RunDevice);
auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::RunDevice);
exeAspect->setSettingsKey("RemoteLinux.CustomRunConfig.RemoteExecutable");
exeAspect->setLabelText(Tr::tr("Remote executable:"));
exeAspect->setReadOnly(false);

View File

@@ -35,7 +35,8 @@ RemoteLinuxRunConfiguration::RemoteLinuxRunConfiguration(Target *target, Id id)
{
auto envAspect = addAspect<RemoteLinuxEnvironmentAspect>(target);
auto exeAspect = addAspect<ExecutableAspect>(target, ExecutableAspect::RunDevice);
auto exeAspect = addAspect<ExecutableAspect>();
exeAspect->setDeviceSelector(target, ExecutableAspect::RunDevice);
exeAspect->setLabelText(Tr::tr("Executable on device:"));
exeAspect->setPlaceHolderText(Tr::tr("Remote path not set"));
exeAspect->makeOverridable("RemoteLinux.RunConfig.AlternateRemoteExecutable",