CMakePM: Detect CMAKE_PREFIX_PATH from qmake's path when empty

If qmake -query fails for some reason then %{Qt:QT_INSTALL_PREFIX} would
evaluate to an empty string and CMAKE_PREFIX_PATH will not help CMake
find Qt packages.

By using the path to qmake itself we can safely determine a valid
CMAKE_PREFIX_PATH and CMAKE_FIND_ROOT_PATH.

Fixes: QTCREATORBUG-31194
Change-Id: Ib649dd57bfe3a97ef93a42603d83331922f99612
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Cristian Adam
2024-07-04 15:37:55 +02:00
parent 8da67b75c5
commit 412eeefafa

View File

@@ -26,6 +26,43 @@ namespace CMakeProjectManager::Internal {
BuildDirParameters::BuildDirParameters() = default; BuildDirParameters::BuildDirParameters() = default;
static void updateCMakePathsFromQMake(QStringList &initialCMakeArguments)
{
const CMakeConfigItem qmake = CMakeConfigItem::fromString(
Utils::findOrDefault(initialCMakeArguments, [](const QString &arg) {
return arg.startsWith("-DQT_QMAKE_EXECUTABLE");
}));
const FilePath qmakeFilePath = FilePath::fromUtf8(qmake.value);
if (qmakeFilePath.isEmpty())
return;
// ~Qt/6.x/platform/bin/qmake -> ~Qt/6.x/platform
const QByteArray qmakePrefixPath = qmakeFilePath.parentDir().parentDir().toString().toUtf8();
const QByteArrayList cmakePathsVariables = {"CMAKE_PREFIX_PATH", "CMAKE_FIND_ROOT_PATH"};
for (const QByteArray &var : cmakePathsVariables) {
const QString varPrefix = QString("-D") + var;
auto it = std::find_if(
initialCMakeArguments.begin(),
initialCMakeArguments.end(),
[varPrefix](const QString &arg) { return arg.startsWith(varPrefix); });
if (it == initialCMakeArguments.end())
continue;
CMakeConfigItem cmakeVar = CMakeConfigItem::fromString(*it);
if (cmakeVar.isNull())
continue;
if (cmakeVar.value.isEmpty())
cmakeVar.value = qmakePrefixPath;
else
cmakeVar.value += ";" + qmakePrefixPath;
*it = cmakeVar.toString();
}
}
BuildDirParameters::BuildDirParameters(CMakeBuildSystem *buildSystem) BuildDirParameters::BuildDirParameters(CMakeBuildSystem *buildSystem)
{ {
QTC_ASSERT(buildSystem, return); QTC_ASSERT(buildSystem, return);
@@ -40,6 +77,11 @@ BuildDirParameters::BuildDirParameters(CMakeBuildSystem *buildSystem)
}); });
initialCMakeArguments = Utils::filtered(expandedArguments, initialCMakeArguments = Utils::filtered(expandedArguments,
[](const QString &s) { return !s.isEmpty(); }); [](const QString &s) { return !s.isEmpty(); });
const bool noQtInstallPrefix = expander->expand(QString("%{Qt:QT_INSTALL_PREFIX}")).isEmpty();
if (noQtInstallPrefix)
updateCMakePathsFromQMake(initialCMakeArguments);
configurationChangesArguments = Utils::transform(buildSystem->configurationChangesArguments(), configurationChangesArguments = Utils::transform(buildSystem->configurationChangesArguments(),
[this](const QString &s) { [this](const QString &s) {
return expander->expand(s); return expander->expand(s);