summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphael Cotty <raphael.cotty@gmail.com>2022-01-21 16:09:20 +0100
committerRaphaƫl Cotty <raphael.cotty@gmail.com>2022-02-08 08:06:50 +0000
commitafcda641beb222811d82d1fc75efd8a82653b66f (patch)
tree0fdc02f1317d837b5646951c54383b53c7fd6189
parent916ff690b3acaf89a499628b8489f2f2d5649bde (diff)
downloadqbs-afcda641beb222811d82d1fc75efd8a82653b66f.tar.gz
Add probe items in module providers
Probes can now be used in the ModuleProvider item. Change-Id: If1bf07269aa7d9c3c9dd8a41ac4bd3d259393a49 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io> Reviewed-by: Ivan Komissarov <ABBAPOH@gmail.com>
-rw-r--r--doc/reference/items/language/moduleprovider.qdoc2
-rw-r--r--doc/reference/items/language/probe.qdoc2
-rw-r--r--src/lib/corelib/language/builtindeclarations.cpp1
-rw-r--r--src/lib/corelib/language/moduleloader.cpp3
-rw-r--r--src/lib/corelib/language/moduleproviderloader.cpp8
-rw-r--r--src/lib/corelib/language/moduleproviderloader.h5
-rw-r--r--tests/auto/blackbox/testdata/probe-in-module-provider/module-providers/provider_a.qbs16
-rw-r--r--tests/auto/blackbox/testdata/probe-in-module-provider/probe-in-module-provider.qbs8
-rw-r--r--tests/auto/blackbox/testdata/qbs-module-providers-helpers.js6
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp17
-rw-r--r--tests/auto/blackbox/tst_blackbox.h1
11 files changed, 64 insertions, 5 deletions
diff --git a/doc/reference/items/language/moduleprovider.qdoc b/doc/reference/items/language/moduleprovider.qdoc
index ac3b4f0bf..81a09a66b 100644
--- a/doc/reference/items/language/moduleprovider.qdoc
+++ b/doc/reference/items/language/moduleprovider.qdoc
@@ -40,6 +40,8 @@
The actual module creation is done on the right-hand side of the
\l{ModuleProvider::relativeSearchPaths}{relativeSearchPaths} property.
+ A ModuleProvider item may contain \l{Probe} items.
+
Here is a complete minimal example of a module provider. It just creates an empty module.
If you put this item into the file \c {module-providers/mymodule/provider.qbs}
in your project source directory, you will be able to successfully build a product which
diff --git a/doc/reference/items/language/probe.qdoc b/doc/reference/items/language/probe.qdoc
index f0deb4c75..8e31d8827 100644
--- a/doc/reference/items/language/probe.qdoc
+++ b/doc/reference/items/language/probe.qdoc
@@ -35,7 +35,7 @@
\brief Locates files outside the project.
- Probe items can appear inside \l{Product} and \l{Project} items.
+ Probe items can appear inside \l{Product}, \l{Project} and \l{ModuleProvider} items.
They are run prior to building, for instance to locate dependent headers, libraries, and other
files outside the project directory whose locations are not known ahead of time.
Probes can be parameterized via their properties and typically store results in
diff --git a/src/lib/corelib/language/builtindeclarations.cpp b/src/lib/corelib/language/builtindeclarations.cpp
index 7266333f5..7004244fa 100644
--- a/src/lib/corelib/language/builtindeclarations.cpp
+++ b/src/lib/corelib/language/builtindeclarations.cpp
@@ -328,6 +328,7 @@ void BuiltinDeclarations::addModuleProviderItem()
<< PropertyDeclaration(QStringLiteral("outputBaseDir"), PropertyDeclaration::String)
<< PropertyDeclaration(QStringLiteral("relativeSearchPaths"),
PropertyDeclaration::StringList);
+ item.setAllowedChildTypes({ItemType::Probe});
insert(item);
}
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp
index 52381465a..574c03bfb 100644
--- a/src/lib/corelib/language/moduleloader.cpp
+++ b/src/lib/corelib/language/moduleloader.cpp
@@ -242,7 +242,8 @@ ModuleLoader::ModuleLoader(Evaluator *evaluator, Logger &logger)
, m_evaluator(evaluator)
, m_probesResolver(std::make_unique<ProbesResolver>(m_evaluator, m_logger))
, m_moduleProviderLoader(
- std::make_unique<ModuleProviderLoader>(m_reader.get(), m_evaluator, m_logger))
+ std::make_unique<ModuleProviderLoader>(m_reader.get(), m_evaluator, m_probesResolver.get(),
+ m_logger))
{
}
diff --git a/src/lib/corelib/language/moduleproviderloader.cpp b/src/lib/corelib/language/moduleproviderloader.cpp
index 309e01e2c..49c77b7fc 100644
--- a/src/lib/corelib/language/moduleproviderloader.cpp
+++ b/src/lib/corelib/language/moduleproviderloader.cpp
@@ -44,6 +44,7 @@
#include "evaluator.h"
#include "itemreader.h"
#include "moduleloader.h"
+#include "probesresolver.h"
#include <language/scriptengine.h>
#include <language/value.h>
@@ -61,9 +62,11 @@
namespace qbs {
namespace Internal {
-ModuleProviderLoader::ModuleProviderLoader(ItemReader *reader, Evaluator *evaluator, Logger &logger)
+ModuleProviderLoader::ModuleProviderLoader(ItemReader *reader, Evaluator *evaluator,
+ ProbesResolver *probesResolver, Logger &logger)
: m_reader(reader)
, m_evaluator(evaluator)
+ , m_probesResolver(probesResolver)
, m_logger(logger)
{
}
@@ -302,6 +305,9 @@ QStringList ModuleProviderLoader::getProviderSearchPaths(
}
providerItem->setParent(product.item);
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"));
}
diff --git a/src/lib/corelib/language/moduleproviderloader.h b/src/lib/corelib/language/moduleproviderloader.h
index 13eddc2b0..b0571a548 100644
--- a/src/lib/corelib/language/moduleproviderloader.h
+++ b/src/lib/corelib/language/moduleproviderloader.h
@@ -43,6 +43,7 @@
#include "moduleloader.h"
#include "moduleproviderinfo.h"
+#include "probesresolver.h"
#include <QtCore/qmap.h>
#include <QtCore/qvariant.h>
@@ -57,7 +58,8 @@ class ModuleProviderLoader
public:
using ProductContext = ModuleLoader::ProductContext;
using FallbackMode = ModuleLoader::FallbackMode;
- explicit ModuleProviderLoader(ItemReader *itemReader, Evaluator *evaluator, Logger &logger);
+ explicit ModuleProviderLoader(ItemReader *itemReader, Evaluator *evaluator,
+ ProbesResolver *probesResolver, Logger &logger);
enum class ModuleProviderLookup { Scoped, Named, Fallback };
@@ -118,6 +120,7 @@ private:
private:
ItemReader *const m_reader{nullptr};
Evaluator *const m_evaluator{nullptr};
+ ProbesResolver *const m_probesResolver{nullptr};
SetupProjectParameters m_parameters;
Logger &m_logger;
diff --git a/tests/auto/blackbox/testdata/probe-in-module-provider/module-providers/provider_a.qbs b/tests/auto/blackbox/testdata/probe-in-module-provider/module-providers/provider_a.qbs
new file mode 100644
index 000000000..8a7c7d6ed
--- /dev/null
+++ b/tests/auto/blackbox/testdata/probe-in-module-provider/module-providers/provider_a.qbs
@@ -0,0 +1,16 @@
+import "../../qbs-module-providers-helpers.js" as Helpers
+
+ModuleProvider {
+ Probe {
+ id: theProbe
+ configure: {
+ console.info("Running probe");
+ found = true;
+ }
+ }
+ property bool found: theProbe.found
+ relativeSearchPaths: {
+ Helpers.writeModule(outputBaseDir, "qbsmetatestmodule", undefined, undefined, found);
+ return "";
+ }
+}
diff --git a/tests/auto/blackbox/testdata/probe-in-module-provider/probe-in-module-provider.qbs b/tests/auto/blackbox/testdata/probe-in-module-provider/probe-in-module-provider.qbs
new file mode 100644
index 000000000..cb346beeb
--- /dev/null
+++ b/tests/auto/blackbox/testdata/probe-in-module-provider/probe-in-module-provider.qbs
@@ -0,0 +1,8 @@
+Product {
+ qbsModuleProviders: ["provider_a"]
+ name: "p"
+ Depends { name: "qbsmetatestmodule" }
+ property bool dummy: {
+ console.info("p.qbsmetatestmodule.boolProp: " + JSON.stringify(qbsmetatestmodule.boolProp));
+ }
+}
diff --git a/tests/auto/blackbox/testdata/qbs-module-providers-helpers.js b/tests/auto/blackbox/testdata/qbs-module-providers-helpers.js
index b33b87329..8b6d9e275 100644
--- a/tests/auto/blackbox/testdata/qbs-module-providers-helpers.js
+++ b/tests/auto/blackbox/testdata/qbs-module-providers-helpers.js
@@ -3,7 +3,7 @@ var FileInfo = require("qbs.FileInfo");
var TextFile = require("qbs.TextFile");
var ModUtils = require("qbs.ModUtils");
-function writeModule(outputBaseDir, name, prop, listProp) {
+function writeModule(outputBaseDir, name, prop, listProp, boolProp) {
console.info("Running setup script for " + name);
var moduleDir = FileInfo.joinPaths(outputBaseDir, "modules", name);
File.makePath(moduleDir);
@@ -14,6 +14,10 @@ function writeModule(outputBaseDir, name, prop, listProp) {
module.writeLine(" property stringList listProp: "
+ ModUtils.toJSLiteral(listProp));
}
+ if (boolProp) {
+ module.writeLine(" property bool boolProp: "
+ + ModUtils.toJSLiteral(boolProp));
+ }
module.writeLine("}");
module.close();
}
diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp
index 7aa6607fd..45953a88c 100644
--- a/tests/auto/blackbox/tst_blackbox.cpp
+++ b/tests/auto/blackbox/tst_blackbox.cpp
@@ -3333,6 +3333,23 @@ void TestBlackbox::probeInExportedModule()
QVERIFY2(m_qbsStdout.contains("listProp: myother,my"), m_qbsStdout.constData());
}
+void TestBlackbox::probeInModuleProvider()
+{
+ QDir::setCurrent(testDataDir + "/probe-in-module-provider");
+
+ QbsRunParameters params;
+ params.command = "build";
+ params.arguments << "--force-probe-execution";
+ QCOMPARE(runQbs(params), 0);
+ QVERIFY2(m_qbsStdout.contains("Running probe"), m_qbsStdout);
+ QVERIFY2(m_qbsStdout.contains("p.qbsmetatestmodule.boolProp: true"), m_qbsStdout);
+ WAIT_FOR_NEW_TIMESTAMP();
+ touch("probe-in-module-provider.qbs");
+ QCOMPARE(runQbs(), 0);
+ QVERIFY2(m_qbsStdout.contains("p.qbsmetatestmodule.boolProp: true"), m_qbsStdout);
+ QVERIFY2(!m_qbsStdout.contains("Running probe"), m_qbsStdout);
+}
+
void TestBlackbox::probesAndArrayProperties()
{
QDir::setCurrent(testDataDir + "/probes-and-array-properties");
diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h
index 87761c09b..ea3a8597d 100644
--- a/tests/auto/blackbox/tst_blackbox.h
+++ b/tests/auto/blackbox/tst_blackbox.h
@@ -241,6 +241,7 @@ private slots:
void probeProperties();
void probesAndShadowProducts();
void probeInExportedModule();
+ void probeInModuleProvider();
void probesAndArrayProperties();
void probesInNestedModules();
void productDependenciesByType();