diff options
Diffstat (limited to 'src/lib/corelib/language/moduleproviderloader.cpp')
-rw-r--r-- | src/lib/corelib/language/moduleproviderloader.cpp | 105 |
1 files changed, 57 insertions, 48 deletions
diff --git a/src/lib/corelib/language/moduleproviderloader.cpp b/src/lib/corelib/language/moduleproviderloader.cpp index dae8bba15..22605bf9f 100644 --- a/src/lib/corelib/language/moduleproviderloader.cpp +++ b/src/lib/corelib/language/moduleproviderloader.cpp @@ -42,8 +42,8 @@ #include "builtindeclarations.h" #include "evaluator.h" +#include "item.h" #include "itemreader.h" -#include "moduleloader.h" #include "probesresolver.h" #include <language/scriptengine.h> @@ -55,6 +55,7 @@ #include <tools/fileinfo.h> #include <tools/jsliterals.h> #include <tools/scripttools.h> +#include <tools/setupprojectparameters.h> #include <tools/stlutils.h> #include <tools/stringconstants.h> @@ -63,9 +64,11 @@ namespace qbs { namespace Internal { -ModuleProviderLoader::ModuleProviderLoader(ItemReader *reader, Evaluator *evaluator, - ProbesResolver *probesResolver, Logger &logger) - : m_reader(reader) +ModuleProviderLoader::ModuleProviderLoader( + const SetupProjectParameters ¶meters, ItemReader &reader, Evaluator &evaluator, + ProbesResolver &probesResolver, Logger &logger) + : m_parameters(parameters) + , m_reader(reader) , m_evaluator(evaluator) , m_probesResolver(probesResolver) , m_logger(logger) @@ -73,7 +76,7 @@ ModuleProviderLoader::ModuleProviderLoader(ItemReader *reader, Evaluator *evalua } ModuleProviderLoader::ModuleProviderResult ModuleProviderLoader::executeModuleProviders( - ProductContext &productContext, + const ProductContext &productContext, const CodeLocation &dependsItemLocation, const QualifiedId &moduleName, FallbackMode fallbackMode) @@ -82,7 +85,7 @@ ModuleProviderLoader::ModuleProviderResult ModuleProviderLoader::executeModulePr std::vector<Provider> providersToRun; qCDebug(lcModuleLoader) << "Module" << moduleName.toString() << "not found, checking for module providers"; - const auto providerNames = getModuleProviders(productContext.item); + const auto providerNames = getModuleProviders(productContext.productItem); if (providerNames) { providersToRun = transformed<std::vector<Provider>>(*providerNames, [](const auto &name) { return Provider{name, ModuleProviderLookup::Named}; }); @@ -109,7 +112,7 @@ ModuleProviderLoader::ModuleProviderResult ModuleProviderLoader::executeModulePr } ModuleProviderLoader::ModuleProviderResult ModuleProviderLoader::executeModuleProvidersHelper( - ProductContext &product, + const ProductContext &product, const CodeLocation &dependsItemLocation, const std::vector<Provider> &providers) { @@ -117,9 +120,11 @@ ModuleProviderLoader::ModuleProviderResult ModuleProviderLoader::executeModulePr return {}; QStringList allSearchPaths; ModuleProviderResult result; + result.providerConfig = product.providerConfig ? *product.providerConfig + : getModuleProviderConfig(product); const auto qbsModule = evaluateQbsModule(product); for (const auto &[name, lookupType] : providers) { - const QVariantMap config = getModuleProviderConfig(product).value(name.toString()).toMap(); + const QVariantMap config = result.providerConfig.value(name.toString()).toMap(); ModuleProviderInfo &info = m_storedModuleProviderInfo.providers[ {name.toString(), config, qbsModule, int(lookupType)}]; const bool fromCache = !info.name.isEmpty(); @@ -129,8 +134,10 @@ ModuleProviderLoader::ModuleProviderResult ModuleProviderLoader::executeModulePr info.providerFile = findModuleProviderFile(name, lookupType); if (!info.providerFile.isEmpty()) { qCDebug(lcModuleLoader) << "Running provider" << name << "at" << info.providerFile; - info.searchPaths = evaluateModuleProvider( - product, dependsItemLocation, name, info.providerFile, config, qbsModule); + const auto evalResult = evaluateModuleProvider( + product, dependsItemLocation, name, info.providerFile, config, qbsModule); + info.searchPaths = evalResult.first; + result.probes << evalResult.second; info.transientOutput = m_parameters.dryRun(); } } @@ -140,7 +147,7 @@ ModuleProviderLoader::ModuleProviderResult ModuleProviderLoader::executeModulePr continue; } if (fromCache) - qCDebug(lcModuleLoader) << "Re-using provider" << name << "from cache"; + qCDebug(lcModuleLoader) << "Re-using provider" << name.toString() << "from cache"; result.providerFound = true; if (info.searchPaths.empty()) { @@ -156,20 +163,16 @@ ModuleProviderLoader::ModuleProviderResult ModuleProviderLoader::executeModulePr if (allSearchPaths.isEmpty()) return result; - m_reader->pushExtraSearchPaths(allSearchPaths); - result.providerAddedSearchPaths = true; + result.searchPaths = std::move(allSearchPaths); return result; } -QVariantMap ModuleProviderLoader::getModuleProviderConfig( - ProductContext &product) +QVariantMap ModuleProviderLoader::getModuleProviderConfig(const ProductContext &product) { - if (product.theModuleProviderConfig) - return *product.theModuleProviderConfig; QVariantMap providerConfig; const ItemValueConstPtr configItemValue = - product.item->itemProperty(StringConstants::moduleProviders()); + product.productItem->itemProperty(StringConstants::moduleProviders()); if (configItemValue) { const std::function<void(const Item *, QualifiedId)> collectMap = [this, &providerConfig, &collectMap](const Item *item, const QualifiedId &name) { @@ -184,9 +187,9 @@ QVariantMap ModuleProviderLoader::getModuleProviderConfig( continue; } case Value::JSSourceValueType: { - const ScopedJsValue sv(m_evaluator->engine()->context(), - m_evaluator->value(item, it.key())); - value = getJsVariant(m_evaluator->engine()->context(), sv); + const ScopedJsValue sv(m_evaluator.engine()->context(), + m_evaluator.value(item, it.key())); + value = getJsVariant(m_evaluator.engine()->context(), sv); break; } case Value::VariantValueType: @@ -198,7 +201,7 @@ QVariantMap ModuleProviderLoader::getModuleProviderConfig( providerConfig.insert(name.toString(), m); } }; - configItemValue->item()->setScope(product.item); + configItemValue->item()->setScope(product.productItem); collectMap(configItemValue->item(), QualifiedId()); } for (auto it = product.moduleProperties.begin(); it != product.moduleProperties.end(); ++it) { @@ -215,14 +218,14 @@ QVariantMap ModuleProviderLoader::getModuleProviderConfig( } providerConfig.insert(provider, currentMapForProvider); } - return *(product.theModuleProviderConfig = std::move(providerConfig)); + return providerConfig; } std::optional<std::vector<QualifiedId>> ModuleProviderLoader::getModuleProviders(Item *item) { while (item) { const auto providers = - m_evaluator->optionalStringListValue(item, StringConstants::qbsModuleProviders()); + m_evaluator.optionalStringListValue(item, StringConstants::qbsModuleProviders()); if (providers) { return transformed<std::vector<QualifiedId>>(*providers, [](const auto &provider) { return QualifiedId::fromString(provider); }); @@ -235,7 +238,7 @@ std::optional<std::vector<QualifiedId>> ModuleProviderLoader::getModuleProviders QString ModuleProviderLoader::findModuleProviderFile( const QualifiedId &name, ModuleProviderLookup lookupType) { - for (const QString &path : m_reader->allSearchPaths()) { + for (const QString &path : m_reader.allSearchPaths()) { QString fullPath = FileInfo::resolvePath(path, QStringLiteral("module-providers")); switch (lookupType) { case ModuleProviderLookup::Named: { @@ -265,44 +268,50 @@ QString ModuleProviderLoader::findModuleProviderFile( return {}; } -QVariantMap ModuleProviderLoader::evaluateQbsModule(ProductContext &product) const +QVariantMap ModuleProviderLoader::evaluateQbsModule(const ProductContext &product) const { const QString properties[] = { QStringLiteral("sysroot"), + QStringLiteral("toolchain"), }; const auto qbsItemValue = std::static_pointer_cast<ItemValue>( - product.item->property(StringConstants::qbsModule())); + product.productItem->property(StringConstants::qbsModule())); QVariantMap result; for (const auto &property : properties) { - const ScopedJsValue val(m_evaluator->engine()->context(), - m_evaluator->value(qbsItemValue->item(), property)); - auto value = getJsVariant(m_evaluator->engine()->context(), val); - if (value.isValid()) - result[property] = std::move(value); + const ScopedJsValue val(m_evaluator.engine()->context(), + m_evaluator.value(qbsItemValue->item(), property)); + auto value = getJsVariant(m_evaluator.engine()->context(), val); + if (!value.isValid()) + continue; + + // The xcode module sets qbs.sysroot; the resulting value is bogus before the probes + // have run. + if (property == QLatin1String("sysroot") && !FileInfo::isAbsolute(value.toString())) + continue; + + result[property] = std::move(value); } return result; } -Item *ModuleProviderLoader::createProviderScope( - ProductContext &product, const QVariantMap &qbsModule) +Item *ModuleProviderLoader::createProviderScope(const ProductContext &product, const QVariantMap &qbsModule) { const auto qbsItemValue = std::static_pointer_cast<ItemValue>( - product.item->property(StringConstants::qbsModule())); + product.productItem->property(StringConstants::qbsModule())); - Item *fakeQbsModule = Item::create(product.item->pool(), ItemType::Scope); + Item *fakeQbsModule = Item::create(product.productItem->pool(), ItemType::Scope); for (auto it = qbsModule.begin(), end = qbsModule.end(); it != end; ++it) { fakeQbsModule->setProperty(it.key(), VariantValue::create(it.value())); } - Item *scope = Item::create(product.item->pool(), ItemType::Scope); + Item *scope = Item::create(product.productItem->pool(), ItemType::Scope); scope->setFile(qbsItemValue->item()->file()); scope->setProperty(StringConstants::qbsModule(), ItemValue::create(fakeQbsModule)); return scope; } -QStringList ModuleProviderLoader::evaluateModuleProvider( - ProductContext &product, +std::pair<QStringList, std::vector<ProbeConstPtr> > ModuleProviderLoader::evaluateModuleProvider(const ProductContext &product, const CodeLocation &dependsItemLocation, const QualifiedId &name, const QString &providerFile, @@ -317,7 +326,7 @@ QStringList ModuleProviderLoader::evaluateModuleProvider( } m_tempQbsFiles << dummyItemFile.fileName(); qCDebug(lcModuleLoader) << "Instantiating module provider at" << providerFile; - const QString projectBuildDir = product.project->item->variantProperty( + const QString projectBuildDir = product.projectItem->variantProperty( StringConstants::buildDirectoryProperty())->value().toString(); const QString searchPathBaseDir = ModuleProviderInfo::outputDirPath(projectBuildDir, name); @@ -342,8 +351,8 @@ QStringList ModuleProviderLoader::evaluateModuleProvider( << endl; stream << "}" << endl; stream.flush(); - Item * const providerItem = - m_reader->readFile(dummyItemFile.fileName(), dependsItemLocation); + Item * const providerItem = m_reader.setupItemFromFile( + dummyItemFile.fileName(), dependsItemLocation, m_evaluator); if (providerItem->type() != ItemType::ModuleProvider) { throw ErrorInfo(Tr::tr("File '%1' declares an item of type '%2', " "but '%3' was expected.") @@ -352,13 +361,13 @@ QStringList ModuleProviderLoader::evaluateModuleProvider( } providerItem->setScope(createProviderScope(product, qbsModule)); + providerItem->overrideProperties(moduleConfig, name, m_parameters, m_logger); + std::vector<ProbeConstPtr> probes = m_probesResolver.resolveProbes( + {product.name, product.uniqueName}, providerItem); - providerItem->overrideProperties(moduleConfig, name.toString(), m_parameters, m_logger); - - m_probesResolver->resolveProbes(&product, providerItem); - - EvalContextSwitcher contextSwitcher(m_evaluator->engine(), EvalContext::ModuleProvider); - return m_evaluator->stringListValue(providerItem, QStringLiteral("searchPaths")); + EvalContextSwitcher contextSwitcher(m_evaluator.engine(), EvalContext::ModuleProvider); + return std::make_pair(m_evaluator.stringListValue(providerItem, QStringLiteral("searchPaths")), + std::move(probes)); } } // namespace Internal |