Kaynağa Gözat

Merge topic 'gui-relative-build-path' into release-3.30

a872844908 cmake-gui: Handle relative paths in the build directory text input

Acked-by: Kitware Robot <[email protected]>
Acked-by: buildbot <[email protected]>
Merge-request: !9459
Brad King 1 yıl önce
ebeveyn
işleme
2f657e448b

+ 31 - 3
Source/QtDialog/CMakeSetupDialog.cxx

@@ -350,8 +350,24 @@ void CMakeSetupDialog::initialize()
   if (!this->SourceDirectory->text().isEmpty() &&
       !this->DeferredPreset.isNull()) {
     this->onSourceDirectoryChanged(this->SourceDirectory->text());
+    if (!this->BinaryDirectory->lineEdit()->text().isEmpty()) {
+      this->onBinaryDirectoryChanged(
+        this->BinaryDirectory->lineEdit()->text());
+    }
   } else if (!this->SourceDirectory->text().isEmpty() ||
              !this->BinaryDirectory->lineEdit()->text().isEmpty()) {
+    if (this->SourceDirectory->text().isEmpty() &&
+        !cmSystemTools::FileIsFullPath(
+          this->BinaryDirectory->lineEdit()->text().toStdString())) {
+      // If the binary directory is relative, load the previous source path
+      // from the config
+      QSettings settings;
+      settings.beginGroup("Settings/StartPath");
+      QString srcDir = settings.value(QString("WhereSource")).toString();
+      this->SourceDirectory->blockSignals(true);
+      this->SourceDirectory->setText(srcDir);
+      this->SourceDirectory->blockSignals(false);
+    }
     this->onSourceDirectoryChanged(this->SourceDirectory->text());
     this->onBinaryDirectoryChanged(this->BinaryDirectory->lineEdit()->text());
   } else {
@@ -411,8 +427,13 @@ bool CMakeSetupDialog::prepareConfigure()
     }
   }
 
-  // remember path
-  this->addBinaryPath(dir.absolutePath());
+  // remember paths
+  this->addBinaryPath(
+    this->CMakeThread->cmakeInstance()->relativeBinaryDirectory());
+  QSettings settings;
+  settings.beginGroup("Settings/StartPath");
+  settings.setValue("WhereSource",
+                    this->CMakeThread->cmakeInstance()->sourceDirectory());
 
   return true;
 }
@@ -742,8 +763,15 @@ void CMakeSetupDialog::showPresetLoadError(const QString& dir,
 
 void CMakeSetupDialog::doBinaryBrowse()
 {
+  QString abs_path = this->BinaryDirectory->currentText();
+  if (!cmSystemTools::FileIsFullPath(abs_path.toStdString())) {
+    if (!this->SourceDirectory->text().endsWith("/")) {
+      abs_path = "/" + abs_path;
+    }
+    abs_path = this->SourceDirectory->text() + abs_path;
+  }
   QString dir = QFileDialog::getExistingDirectory(
-    this, tr("Enter Path to Build"), this->BinaryDirectory->currentText(),
+    this, tr("Enter Path to Build"), abs_path,
     QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
   if (!dir.isEmpty() && dir != this->BinaryDirectory->currentText()) {
     this->setBinaryDirectory(dir);

+ 26 - 3
Source/QtDialog/QCMake.cxx

@@ -94,6 +94,10 @@ void QCMake::setSourceDirectory(const QString& _dir)
     emit this->sourceDirChanged(this->SourceDirectory);
     this->loadPresets();
     this->setPreset(QString{});
+    if (!cmSystemTools::FileIsFullPath(
+          this->MaybeRelativeBinaryDirectory.toStdString())) {
+      this->setBinaryDirectory(this->MaybeRelativeBinaryDirectory);
+    }
   }
 }
 
@@ -101,9 +105,23 @@ void QCMake::setBinaryDirectory(const QString& _dir)
 {
   QString dir = QString::fromStdString(
     cmSystemTools::GetActualCaseForPath(_dir.toStdString()));
-  if (this->BinaryDirectory != dir) {
-    this->BinaryDirectory = QDir::fromNativeSeparators(dir);
-    emit this->binaryDirChanged(this->BinaryDirectory);
+
+  QString absDir = dir;
+
+  if (!cmSystemTools::FileIsFullPath(absDir.toStdString())) {
+    if (!this->SourceDirectory.isEmpty()) {
+      if (!this->SourceDirectory.endsWith("/")) {
+        absDir = "/" + absDir;
+      }
+      absDir = this->SourceDirectory + absDir;
+    }
+  }
+
+  if (this->BinaryDirectory != absDir ||
+      this->MaybeRelativeBinaryDirectory != dir) {
+    this->MaybeRelativeBinaryDirectory = QDir::fromNativeSeparators(dir);
+    this->BinaryDirectory = QDir::fromNativeSeparators(absDir);
+    emit this->binaryDirChanged(this->MaybeRelativeBinaryDirectory);
     cmState* state = this->CMakeInstance->GetState();
     this->setGenerator(QString());
     this->setToolset(QString());
@@ -600,6 +618,11 @@ QString QCMake::binaryDirectory() const
   return this->BinaryDirectory;
 }
 
+QString QCMake::relativeBinaryDirectory() const
+{
+  return this->MaybeRelativeBinaryDirectory;
+}
+
 QString QCMake::sourceDirectory() const
 {
   return this->SourceDirectory;

+ 3 - 0
Source/QtDialog/QCMake.h

@@ -130,6 +130,8 @@ public:
   QCMakePropertyList properties() const;
   /// get the current binary directory
   QString binaryDirectory() const;
+  /// get the current binary directory, possibly a relative path
+  QString relativeBinaryDirectory() const;
   /// get the current source directory
   QString sourceDirectory() const;
   /// get the current generator
@@ -196,6 +198,7 @@ protected:
   bool WarnUninitializedMode;
   QString SourceDirectory;
   QString BinaryDirectory;
+  QString MaybeRelativeBinaryDirectory;
   QString Generator;
   QString Platform;
   QString Toolset;