aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCristian Adam <cristian.adam@qt.io>2022-10-20 16:22:28 +0200
committerCristian Adam <cristian.adam@qt.io>2022-10-21 13:09:35 +0000
commitbf83f63a1301f09501c097a162063dd25aef4168 (patch)
tree0628bd8a711f638dd3b004d442b6d64ef03b4a1e
parent430ff621aa203bb13242e91a8892c757480a3a64 (diff)
CMakePM: Add installDir CMakePresets support
Is part of CMakePrests v3, and slipped at the implementation time. Task-number: QTCREATORBUG-24555 Change-Id: Id3ce90c0a979d44287fc03ae1dd49a64e964cdf2 Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp1
-rw-r--r--src/plugins/cmakeprojectmanager/presetsmacros.cpp38
-rw-r--r--src/plugins/cmakeprojectmanager/presetsmacros.h7
-rw-r--r--src/plugins/cmakeprojectmanager/presetsparser.cpp5
-rw-r--r--src/plugins/cmakeprojectmanager/presetsparser.h1
-rw-r--r--tests/manual/cmakepresets/CMakePresets.json1
6 files changed, 53 insertions, 0 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
index 817d02ed638..b6b0947dd59 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp
@@ -1241,6 +1241,7 @@ static void addCMakeConfigurePresetToInitialArguments(QStringList &initialArgume
env,
project->projectDirectory(),
buildDirectory);
+ CMakePresets::Macros::updateInstallDir(configurePreset, env, project->projectDirectory());
// Merge the presets cache variables
CMakeConfig cache;
diff --git a/src/plugins/cmakeprojectmanager/presetsmacros.cpp b/src/plugins/cmakeprojectmanager/presetsmacros.cpp
index 1a7b884ca9d..0e156ab4a47 100644
--- a/src/plugins/cmakeprojectmanager/presetsmacros.cpp
+++ b/src/plugins/cmakeprojectmanager/presetsmacros.cpp
@@ -253,6 +253,44 @@ void updateToolchainFile(
configurePreset.cacheVariables = cache;
}
+void updateInstallDir(PresetsDetails::ConfigurePreset &configurePreset,
+ const Utils::Environment &env,
+ const Utils::FilePath &sourceDirectory)
+{
+ if (!configurePreset.installDir)
+ return;
+
+ QString installDirString = configurePreset.installDir.value();
+ CMakePresets::Macros::expand(configurePreset, env, sourceDirectory, installDirString);
+
+ // Resolve the relative path first to source and afterwards to build directory
+ Utils::FilePath installDir = Utils::FilePath::fromString(installDirString);
+ if (installDir.isRelativePath()) {
+ Utils::FilePath probePath = sourceDirectory.resolvePath(installDir);
+ if (probePath != sourceDirectory) {
+ installDir = probePath;
+ }
+ }
+ installDirString = installDir.cleanPath().toString();
+
+ // installDir takes precedence to CMAKE_INSTALL_PREFIX
+ CMakeConfig cache = configurePreset.cacheVariables ? configurePreset.cacheVariables.value()
+ : CMakeConfig();
+
+ auto it = std::find_if(cache.begin(), cache.end(), [](const CMakeConfigItem &item) {
+ return item.key == "CMAKE_INSTALL_PREFIX";
+ });
+ if (it != cache.end())
+ it->value = installDirString.toUtf8();
+ else
+ cache << CMakeConfigItem("CMAKE_INSTALL_PREFIX",
+ CMakeConfigItem::PATH,
+ installDirString.toUtf8());
+
+ configurePreset.cacheVariables = cache;
+}
+
+
template<class PresetType>
void expandConditionValues(const PresetType &preset,
const Utils::Environment &env,
diff --git a/src/plugins/cmakeprojectmanager/presetsmacros.h b/src/plugins/cmakeprojectmanager/presetsmacros.h
index 0acf4d37cb6..09083b11fa5 100644
--- a/src/plugins/cmakeprojectmanager/presetsmacros.h
+++ b/src/plugins/cmakeprojectmanager/presetsmacros.h
@@ -54,6 +54,13 @@ void updateToolchainFile(PresetsDetails::ConfigurePreset &configurePreset,
const Utils::FilePath &buildDirectory);
/**
+ * Updates the cacheVariables parameter of the configurePreset with the expanded installDir parameter.
+ * Including macro expansion and relative paths resolving.
+ */
+void updateInstallDir(PresetsDetails::ConfigurePreset &configurePreset,
+ const Utils::Environment &env,
+ const Utils::FilePath &sourceDirectory);
+/**
* Expands the condition values and then evaluates the condition object of the preset and returns
* the boolean result.
*/
diff --git a/src/plugins/cmakeprojectmanager/presetsparser.cpp b/src/plugins/cmakeprojectmanager/presetsparser.cpp
index 441709109db..bd0d17d8cb8 100644
--- a/src/plugins/cmakeprojectmanager/presetsparser.cpp
+++ b/src/plugins/cmakeprojectmanager/presetsparser.cpp
@@ -177,6 +177,8 @@ bool parseConfigurePresets(const QJsonValue &jsonValue,
preset.generator = object.value("generator").toString();
if (object.contains("binaryDir"))
preset.binaryDir = object.value("binaryDir").toString();
+ if (object.contains("installDir"))
+ preset.installDir = object.value("installDir").toString();
if (object.contains("toolchainFile"))
preset.toolchainFile = object.value("toolchainFile").toString();
if (object.contains("cmakeExecutable"))
@@ -462,6 +464,9 @@ void PresetsDetails::ConfigurePreset::inheritFrom(const ConfigurePreset &other)
if (!binaryDir && other.binaryDir)
binaryDir = other.binaryDir;
+ if (!installDir && other.installDir)
+ installDir = other.installDir;
+
if (!cmakeExecutable && other.cmakeExecutable)
cmakeExecutable = other.cmakeExecutable;
diff --git a/src/plugins/cmakeprojectmanager/presetsparser.h b/src/plugins/cmakeprojectmanager/presetsparser.h
index 5577620d5d8..7717f19c666 100644
--- a/src/plugins/cmakeprojectmanager/presetsparser.h
+++ b/src/plugins/cmakeprojectmanager/presetsparser.h
@@ -100,6 +100,7 @@ public:
std::optional<ValueStrategyPair> toolset;
std::optional<QString> toolchainFile;
std::optional<QString> binaryDir;
+ std::optional<QString> installDir;
std::optional<QString> cmakeExecutable;
std::optional<CMakeConfig> cacheVariables;
std::optional<QHash<QString, QString>> environment;
diff --git a/tests/manual/cmakepresets/CMakePresets.json b/tests/manual/cmakepresets/CMakePresets.json
index 8f0ef76f8fc..f4eb2283263 100644
--- a/tests/manual/cmakepresets/CMakePresets.json
+++ b/tests/manual/cmakepresets/CMakePresets.json
@@ -10,6 +10,7 @@
"name": "mingw",
"displayName": "MinGW 11.2.0",
"generator": "Ninja",
+ "installDir": "../inst-${presetName}",
"cacheVariables": {
"CMAKE_PREFIX_PATH": "c:/Qt/6.3.2/mingw_64"
},