diff options
10 files changed, 74 insertions, 12 deletions
diff --git a/share/qbs/module-providers/qbspkgconfig.qbs b/share/qbs/module-providers/qbspkgconfig.qbs index 52344d0b8..261758026 100644 --- a/share/qbs/module-providers/qbspkgconfig.qbs +++ b/share/qbs/module-providers/qbspkgconfig.qbs @@ -168,6 +168,11 @@ ModuleProvider { } } + var moduleMapping = { + "protobuf": "protobuflib", + "grpc++": "grpcpp" + } + var pkgConfig = new PkgConfig(options); var brokenPackages = []; @@ -178,7 +183,9 @@ ModuleProvider { brokenPackages.push(pkg); continue; } - var moduleName = getModuleName(packageName); + var moduleName = moduleMapping[packageName] + ? moduleMapping[packageName] + : getModuleName(packageName); var moduleInfo = getModuleInfo(pkg, staticMode); var deps = getModuleDependencies(pkg, staticMode); diff --git a/share/qbs/modules/protobuf/cpp/protobufcpp.qbs b/share/qbs/modules/protobuf/cpp/protobufcpp.qbs index e1459658d..f377c63cf 100644 --- a/share/qbs/modules/protobuf/cpp/protobufcpp.qbs +++ b/share/qbs/modules/protobuf/cpp/protobufcpp.qbs @@ -12,6 +12,7 @@ ProtobufBase { property bool useGrpc: false property bool _linkLibraries: true + readonly property bool _hasModules: protobuflib.present && (!useGrpc || grpcpp.present) property string grpcIncludePath: grpcIncludeProbe.found ? grpcIncludeProbe.path : undefined property string grpcLibraryPath: grpcLibraryProbe.found ? grpcLibraryProbe.path : undefined @@ -27,6 +28,18 @@ ProtobufBase { } Depends { name: "cpp" } + Depends { + name: "protobuflib"; + condition: _linkLibraries; + required: false; + enableFallback: false + } + Depends { + name: "grpcpp"; + condition: _linkLibraries && useGrpc; + required: false; + enableFallback: false + } property path grpcPluginPath: grpcPluginProbe.filePath @@ -37,7 +50,7 @@ ProtobufBase { } cpp.libraryPaths: { - if (!_linkLibraries) + if (!_linkLibraries || _hasModules) return []; var result = []; @@ -48,7 +61,7 @@ ProtobufBase { return result; } cpp.dynamicLibraries: { - if (!_linkLibraries) + if (!_linkLibraries || _hasModules) return []; var result = []; @@ -61,7 +74,7 @@ ProtobufBase { return result; } cpp.includePaths: { - if (!_linkLibraries) + if (!_linkLibraries || _hasModules) return [outputDir]; var result = [outputDir]; @@ -139,6 +152,9 @@ ProtobufBase { validate: { HelperFunctions.validateCompiler(compilerName, compilerPath); + if (_hasModules) + return; + if (_linkLibraries && !includeProbe.found) throw "Can't find cpp protobuf include files. Please set the includePath property."; if (_linkLibraries && !libraryProbe.found) diff --git a/tests/auto/blackbox/testdata/grpc/grpc_cpp.qbs b/tests/auto/blackbox/testdata/grpc/grpc_cpp.qbs index 4e46da210..1ecbd0394 100644 --- a/tests/auto/blackbox/testdata/grpc/grpc_cpp.qbs +++ b/tests/auto/blackbox/testdata/grpc/grpc_cpp.qbs @@ -18,6 +18,7 @@ CppApplication { property bool hasDependencies: { console.info("has grpc: " + protobuf.cpp.present); + console.info("has modules: " + grpcpp.present); return protobuf.cpp.present; } diff --git a/tests/auto/blackbox/testdata/protobuf/addressbook_cpp.qbs b/tests/auto/blackbox/testdata/protobuf/addressbook_cpp.qbs index ac97f6bd5..8e8735b69 100644 --- a/tests/auto/blackbox/testdata/protobuf/addressbook_cpp.qbs +++ b/tests/auto/blackbox/testdata/protobuf/addressbook_cpp.qbs @@ -15,6 +15,7 @@ CppApplication { Depends { name: "protobuf.cpp"; required: false } property bool hasProtobuf: { console.info("has protobuf: " + protobuf.cpp.present); + console.info("has modules: " + protobuflib.present); return protobuf.cpp.present; } diff --git a/tests/auto/blackbox/testdata/protobuf/addressbook_nanopb.qbs b/tests/auto/blackbox/testdata/protobuf/addressbook_nanopb.qbs index 92243d31f..61a44fc0f 100644 --- a/tests/auto/blackbox/testdata/protobuf/addressbook_nanopb.qbs +++ b/tests/auto/blackbox/testdata/protobuf/addressbook_nanopb.qbs @@ -15,6 +15,7 @@ CppApplication { Depends { name: "protobuf.nanopb"; required: false } property bool hasProtobuf: { console.info("has protobuf: " + protobuf.nanopb.present); + console.info("has modules: false"); return protobuf.nanopb.present; } protobuf.nanopb.importPaths: product.sourceDirectory diff --git a/tests/auto/blackbox/testdata/protobuf/addressbook_objc.qbs b/tests/auto/blackbox/testdata/protobuf/addressbook_objc.qbs index 448a9284a..95b03d7d7 100644 --- a/tests/auto/blackbox/testdata/protobuf/addressbook_objc.qbs +++ b/tests/auto/blackbox/testdata/protobuf/addressbook_objc.qbs @@ -12,6 +12,7 @@ CppApplication { Depends { name: "protobuf.objc"; required: false } property bool hasProtobuf: { console.info("has protobuf: " + protobuf.objc.present); + console.info("has modules: false"); return protobuf.objc.present; } diff --git a/tests/auto/blackbox/testdata/protobuf/create-proto-library.qbs b/tests/auto/blackbox/testdata/protobuf/create-proto-library.qbs index d888937f1..9938fcdd4 100644 --- a/tests/auto/blackbox/testdata/protobuf/create-proto-library.qbs +++ b/tests/auto/blackbox/testdata/protobuf/create-proto-library.qbs @@ -17,6 +17,7 @@ Project { Depends { name: "protobuf.cpp"; required: false } property bool hasProtobuf: { console.info("has protobuf: " + protobuf.cpp.present); + console.info("has modules: " + protobuflib.present); return protobuf.cpp.present; } diff --git a/tests/auto/blackbox/testdata/protobuf/import.qbs b/tests/auto/blackbox/testdata/protobuf/import.qbs index 4d7e1b5c9..d7ae5e1a2 100644 --- a/tests/auto/blackbox/testdata/protobuf/import.qbs +++ b/tests/auto/blackbox/testdata/protobuf/import.qbs @@ -16,6 +16,7 @@ CppApplication { Depends { name: "protobuf.cpp"; required: false } property bool hasProtobuf: { console.info("has protobuf: " + protobuf.cpp.present); + console.info("has modules: " + protobuflib.present); return protobuf.cpp.present; } diff --git a/tests/auto/blackbox/testdata/protobuf/needs-import-dir.qbs b/tests/auto/blackbox/testdata/protobuf/needs-import-dir.qbs index 4914ea484..80a9d9a88 100644 --- a/tests/auto/blackbox/testdata/protobuf/needs-import-dir.qbs +++ b/tests/auto/blackbox/testdata/protobuf/needs-import-dir.qbs @@ -17,6 +17,7 @@ CppApplication { Depends { name: "protobuf.cpp"; required: false } property bool hasProtobuf: { console.info("has protobuf: " + protobuf.cpp.present); + console.info("has modules: " + protobuflib.present); return protobuf.cpp.present; } diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index c64976e36..437a8f70a 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -5803,18 +5803,24 @@ void TestBlackbox::protobuf_data() { QTest::addColumn<QString>("projectFile"); QTest::addColumn<QStringList>("properties"); + QTest::addColumn<bool>("hasModules"); QTest::addColumn<bool>("successExpected"); - QTest::newRow("cpp") << QString("addressbook_cpp.qbs") << QStringList() << true; - QTest::newRow("objc") << QString("addressbook_objc.qbs") << QStringList() << true; - QTest::newRow("nanopb") << QString("addressbook_nanopb.qbs") << QStringList() << true; - QTest::newRow("import") << QString("import.qbs") << QStringList() << true; + QTest::newRow("cpp") << QString("addressbook_cpp.qbs") << QStringList() << false << true; + QTest::newRow("cpp-pkgconfig") + << QString("addressbook_cpp.qbs") + << QStringList("project.qbsModuleProviders:qbspkgconfig") + << true + << true; + QTest::newRow("objc") << QString("addressbook_objc.qbs") << QStringList() << false << true; + QTest::newRow("nanopb") << QString("addressbook_nanopb.qbs") << QStringList() << false << true; + QTest::newRow("import") << QString("import.qbs") << QStringList() << false << true; QTest::newRow("missing import dir") << QString("needs-import-dir.qbs") - << QStringList() << false; + << QStringList() << false << false; QTest::newRow("provided import dir") << QString("needs-import-dir.qbs") - << QStringList("products.app.theImportDir:subdir") << true; + << QStringList("products.app.theImportDir:subdir") << false << true; QTest::newRow("create proto library") - << QString("create-proto-library.qbs") << QStringList() << true; + << QString("create-proto-library.qbs") << QStringList() << false << true; } void TestBlackbox::protobuf() @@ -5822,6 +5828,7 @@ void TestBlackbox::protobuf() QDir::setCurrent(testDataDir + "/protobuf"); QFETCH(QString, projectFile); QFETCH(QStringList, properties); + QFETCH(bool, hasModules); QFETCH(bool, successExpected); rmDirR(relativeBuildDir()); QbsRunParameters resolveParams("resolve", QStringList{"-f", projectFile} << properties); @@ -5833,6 +5840,10 @@ void TestBlackbox::protobuf() QVERIFY2(withProtobuf || withoutProtobuf, m_qbsStdout.constData()); if (withoutProtobuf) QSKIP("protobuf module not present"); + const bool hasMods = m_qbsStdout.contains("has modules: true"); + const bool dontHaveMods = m_qbsStdout.contains("has modules: false"); + QVERIFY2(hasMods == !dontHaveMods, m_qbsStdout.constData()); + QCOMPARE(hasMods, hasModules); QbsRunParameters runParams("run"); runParams.expectFailure = !successExpected; QCOMPARE(runQbs(runParams) == 0, successExpected); @@ -8355,21 +8366,42 @@ void TestBlackbox::groupsInModules() void TestBlackbox::grpc_data() { QTest::addColumn<QString>("projectFile"); - QTest::newRow("cpp") << QString("grpc_cpp.qbs"); + QTest::addColumn<QStringList>("arguments"); + QTest::addColumn<bool>("hasModules"); + + QTest::newRow("cpp") << QString("grpc_cpp.qbs") << QStringList() << false; + + QStringList pkgConfigArgs("project.qbsModuleProviders:qbspkgconfig"); + // on macOS, openSSL is hidden from pkg-config by default + if (qbs::Internal::HostOsInfo::isMacosHost()) { + pkgConfigArgs + << "moduleProviders.qbspkgconfig.extraPaths:/usr/local/opt/openssl@1.1/lib/pkgconfig"; + } + QTest::newRow("cpp-pkgconfig") << QString("grpc_cpp.qbs") << pkgConfigArgs << true; } void TestBlackbox::grpc() { QDir::setCurrent(testDataDir + "/grpc"); QFETCH(QString, projectFile); + QFETCH(QStringList, arguments); + QFETCH(bool, hasModules); + rmDirR(relativeBuildDir()); QbsRunParameters resolveParams("resolve", QStringList{"-f", projectFile}); + resolveParams.arguments << arguments; QCOMPARE(runQbs(resolveParams), 0); const bool withGrpc = m_qbsStdout.contains("has grpc: true"); const bool withoutGrpc = m_qbsStdout.contains("has grpc: false"); QVERIFY2(withGrpc || withoutGrpc, m_qbsStdout.constData()); if (withoutGrpc) QSKIP("grpc module not present"); + + const bool hasMods = m_qbsStdout.contains("has modules: true"); + const bool dontHaveMods = m_qbsStdout.contains("has modules: false"); + QVERIFY2(hasMods == !dontHaveMods, m_qbsStdout.constData()); + QCOMPARE(hasMods, hasModules); + if (m_qbsStdout.contains("targetPlatform differs from hostPlatform")) QSKIP("Cannot run binaries in cross-compiled build"); |