void AndroidQmakeBuildConfiguration::manifestSaved() { QString androidNdkPlatform = AndroidConfigurations::currentConfig().bestNdkPlatformMatch(AndroidManager::minimumSDK(target())); if (m_androidNdkPlatform == androidNdkPlatform) return; updateCacheAndEmitEnvironmentChanged(); QMakeStep *qs = qmakeStep(); if (!qs) return; qs->setForced(true); BuildManager::buildList(stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); BuildManager::appendStep(qs, ProjectExplorerPlugin::displayNameForStepId(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)); setSubNodeBuild(0); }
void IosBuildConfiguration::updateQmakeCommand() { QMakeStep *qmakeStepInstance = qmakeStep(); const QString forceOverrideArg("-after"); if (qmakeStepInstance) { QStringList extraArgs = qmakeStepInstance->extraArguments(); // remove old extra arguments. Utils::erase(extraArgs, [forceOverrideArg](const QString& arg) { return arg.startsWith(qmakeIosTeamSettings) || arg.startsWith(qmakeProvisioningProfileSettings) || arg == forceOverrideArg; }); // Set force ovveride qmake switch if (!m_signingIdentifier.isEmpty() ) extraArgs << forceOverrideArg; Core::Id devType = ProjectExplorer::DeviceTypeKitAspect::deviceTypeId(target()->kit()); if (devType == Constants::IOS_DEVICE_TYPE && !m_signingIdentifier.isEmpty()) { if (m_autoManagedSigning) { extraArgs << qmakeIosTeamSettings + m_signingIdentifier; } else { // Get the team id from provisioning profile ProvisioningProfilePtr profile = IosConfigurations::provisioningProfile(m_signingIdentifier); QString teamId; if (profile) teamId = profile->developmentTeam()->identifier(); else qCDebug(iosLog) << "No provisioing profile found for id:"<< m_signingIdentifier; if (!teamId.isEmpty()) { extraArgs << qmakeProvisioningProfileSettings + m_signingIdentifier; extraArgs << qmakeIosTeamSettings + teamId; } else { qCDebug(iosLog) << "Development team unavailable for profile:" << profile; } } } qmakeStepInstance->setExtraArguments(extraArgs); } }
// Returns true if both are equal. Qt4BuildConfiguration::MakefileState Qt4BuildConfiguration::compareToImportFrom(const QString &makefile) { QMakeStep *qs = qmakeStep(); if (QFileInfo(makefile).exists() && qs) { FileName qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(makefile); BaseQtVersion *version = QtKitInformation::qtVersion(target()->kit()); if (!version) return MakefileForWrongProject; if (version->qmakeCommand() == qmakePath) { // same qtversion QPair<BaseQtVersion::QmakeBuildConfigs, QString> result = QtVersionManager::scanMakeFile(makefile, version->defaultBuildConfig()); if (qmakeBuildConfiguration() == result.first) { // The qmake Build Configuration are the same, // now compare arguments lists // we have to compare without the spec/platform cmd argument // and compare that on its own QString workingDirectory = QFileInfo(makefile).absolutePath(); QStringList actualArgs; QString userArgs = qs->userArguments(); // This copies the settings from userArgs to actualArgs (minus some we // are not interested in), splitting them up into individual strings: extractSpecFromArguments(&userArgs, workingDirectory, version, &actualArgs); actualArgs = qs->deducedArguments() + actualArgs + qs->deducedArgumentsAfter(); FileName actualSpec = qs->mkspec(); QString qmakeArgs = result.second; QStringList parsedArgs; FileName parsedSpec = extractSpecFromArguments(&qmakeArgs, workingDirectory, version, &parsedArgs); if (debug) { qDebug() << "Actual args:" << actualArgs; qDebug() << "Parsed args:" << parsedArgs; qDebug() << "Actual spec:" << actualSpec.toString(); qDebug() << "Parsed spec:" << parsedSpec.toString(); } // Comparing the sorted list is obviously wrong // Though haven written a more complete version // that managed had around 200 lines and yet faild // to be actually foolproof at all, I think it's // not feasible without actually taking the qmake // command line parsing code // Things, sorting gets wrong: // parameters to positional parameters matter // e.g. -o -spec is different from -spec -o // -o 1 -spec 2 is diffrent from -spec 1 -o 2 // variable assignment order matters // variable assignment vs -after // -norecursive vs. recursive actualArgs.sort(); parsedArgs.sort(); if (actualArgs == parsedArgs) { // Specs match exactly if (actualSpec == parsedSpec) return MakefileMatches; // Actual spec is the default one // qDebug() << "AS vs VS" << actualSpec << version->mkspec(); if ((actualSpec == version->mkspec() || actualSpec == FileName::fromString(QLatin1String("default"))) && (parsedSpec == version->mkspec() || parsedSpec == FileName::fromString(QLatin1String("default")) || parsedSpec.isEmpty())) return MakefileMatches; } return MakefileIncompatible; } else { if (debug) qDebug() << "different qmake buildconfigurations buildconfiguration:" << qmakeBuildConfiguration() << " Makefile:" << result.first; return MakefileIncompatible; } } else { if (debug) qDebug() << "different Qt versions, buildconfiguration:" << version->qmakeCommand().toString() << " Makefile:"<< qmakePath.toString(); return MakefileForWrongProject; } } return MakefileMissing; }