diff --git a/src/plugins/docker/dockerdevice.cpp b/src/plugins/docker/dockerdevice.cpp index 8561764688c..1ebe044a913 100644 --- a/src/plugins/docker/dockerdevice.cpp +++ b/src/plugins/docker/dockerdevice.cpp @@ -540,6 +540,9 @@ bool isValidMountInfo(const DockerDevicePrivate::TemporaryMountInfo &mi) if (!mi.path.isAbsolutePath() || !mi.containerPath.isAbsolutePath()) return false; + if (mi.containerPath.isRootPath()) + return false; + if (!mi.path.exists()) return false; diff --git a/src/plugins/projectexplorer/buildaspects.cpp b/src/plugins/projectexplorer/buildaspects.cpp index 02cc62b69e2..919bd837e6f 100644 --- a/src/plugins/projectexplorer/buildaspects.cpp +++ b/src/plugins/projectexplorer/buildaspects.cpp @@ -5,7 +5,11 @@ #include "buildconfiguration.h" #include "buildpropertiessettings.h" +#include "devicesupport/idevice.h" +#include "kitinformation.h" +#include "projectexplorerconstants.h" #include "projectexplorer.h" +#include "target.h" #include @@ -24,13 +28,17 @@ namespace ProjectExplorer { class BuildDirectoryAspect::Private { public: + Private(Target *target) : target(target) {} + FilePath sourceDir; + Target * const target; FilePath savedShadowBuildDir; QString problem; QPointer problemLabel; }; -BuildDirectoryAspect::BuildDirectoryAspect(const BuildConfiguration *bc) : d(new Private) +BuildDirectoryAspect::BuildDirectoryAspect(const BuildConfiguration *bc) + : d(new Private(bc->target())) { setSettingsKey("ProjectExplorer.BuildConfiguration.BuildDirectory"); setLabelText(tr("Build directory:")); @@ -40,6 +48,16 @@ BuildDirectoryAspect::BuildDirectoryAspect(const BuildConfiguration *bc) : d(new const FilePath fixedDir = fixupDir(FilePath::fromUserInput(edit->text())); if (!fixedDir.isEmpty()) edit->setText(fixedDir.toUserOutput()); + + const FilePath newPath = FilePath::fromUserInput(edit->text()); + const auto buildDevice = DeviceKitAspect::device(d->target->kit()); + + if (buildDevice && buildDevice->type() != ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE + && !buildDevice->rootPath().ensureReachable(newPath)) { + *error = tr("The build directory is not reachable from the build device."); + return false; + } + return pathChooser() ? pathChooser()->defaultValidationFunction()(edit, error) : true; }); setOpenTerminalHandler([this, bc] { @@ -109,6 +127,12 @@ void BuildDirectoryAspect::addToLayout(LayoutBuilder &builder) } }); } + + const auto buildDevice = DeviceKitAspect::device(d->target->kit()); + if (buildDevice && buildDevice->type() != ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) + pathChooser()->setAllowPathFromDevice(true); + else + pathChooser()->setAllowPathFromDevice(false); } FilePath BuildDirectoryAspect::fixupDir(const FilePath &dir)