diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2017-10-17 10:47:06 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2017-11-07 15:56:33 +0000 |
commit | 8ca922793f2a7a10023784d1c18e4b86f552209d (patch) | |
tree | 5150fddc8c4fb0e79fc41f65af210feb41a67c38 /tests | |
parent | 98e4cef3ea23842d6bceb438e0f1f8285a01d979 (diff) |
Enable modules to declare target artifacts
Such artifacts appear to rules just like target artifacts of products.
This functionality will be useful for auto-generating qbs modules from
products.
[ChangeLog] Modules can now declare target artifacts using the new
filesAreTargets property of the Group item.
Task-number: QBS-882
Change-Id: I3bba000be9a1057d9fef01e5576363719ff1f244
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'tests')
20 files changed, 292 insertions, 0 deletions
diff --git a/tests/auto/api/testdata/tool-in-module/use-outside-project/modules/thetool/thetool.qbs b/tests/auto/api/testdata/tool-in-module/use-outside-project/modules/thetool/thetool.qbs new file mode 100644 index 000000000..36c2cbdc7 --- /dev/null +++ b/tests/auto/api/testdata/tool-in-module/use-outside-project/modules/thetool/thetool.qbs @@ -0,0 +1,27 @@ +import qbs +import qbs.FileInfo + +Module { + Group { + name: "thetool binary" + files: FileInfo.cleanPath(FileInfo.joinPaths(path, "..", "..", + "thetool" + (qbs.hostOS.contains("windows") ? ".exe" : ""))); + fileTags: ["thetool.thetool"] + filesAreTargets: true + } + + Rule { + multiplex: true + explicitlyDependsOn: ["thetool.thetool"] + Artifact { + filePath: "tool-output.txt" + fileTags: ["thetool.output"] + } + prepare: { + var cmd = new Command(explicitlyDependsOn["thetool.thetool"][0].filePath, + output.filePath); + cmd.description = "running the tool"; + return [cmd]; + } + } +} diff --git a/tests/auto/api/testdata/tool-in-module/use-outside-project/use-outside-project.qbs b/tests/auto/api/testdata/tool-in-module/use-outside-project/use-outside-project.qbs new file mode 100644 index 000000000..439e68f51 --- /dev/null +++ b/tests/auto/api/testdata/tool-in-module/use-outside-project/use-outside-project.qbs @@ -0,0 +1,7 @@ +import qbs + +Product { + name: "user-outside-project" + type: ["thetool.output"] + Depends { name: "thetool" } +} diff --git a/tests/auto/api/testdata/tool-in-module/use-within-project/main.cpp b/tests/auto/api/testdata/tool-in-module/use-within-project/main.cpp new file mode 100644 index 000000000..723b8a3bf --- /dev/null +++ b/tests/auto/api/testdata/tool-in-module/use-within-project/main.cpp @@ -0,0 +1,10 @@ +#include <cassert> +#include <fstream> + +int main(int argc, char *argv[]) +{ + assert(argc == 2); + std::ofstream file(argv[1]); + assert(file.is_open()); + file << "content"; +} diff --git a/tests/auto/api/testdata/tool-in-module/use-within-project/tool-input.txt b/tests/auto/api/testdata/tool-in-module/use-within-project/tool-input.txt new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/auto/api/testdata/tool-in-module/use-within-project/tool-input.txt diff --git a/tests/auto/api/testdata/tool-in-module/use-within-project/use-within-project.qbs b/tests/auto/api/testdata/tool-in-module/use-within-project/use-within-project.qbs new file mode 100644 index 000000000..ecfef55c3 --- /dev/null +++ b/tests/auto/api/testdata/tool-in-module/use-within-project/use-within-project.qbs @@ -0,0 +1,37 @@ +import qbs + +Project { + CppApplication { + name: "thetool" + files: "main.cpp" + + Group { + fileTagsFilter: ["application"] + fileTags: ["thetool.thetool"] + qbs.install: true + } + + Export { + Rule { + multiplex: true + explicitlyDependsOn: ["thetool.thetool"] + Artifact { + filePath: "tool-output.txt" + fileTags: ["thetool.output"] + } + prepare: { + var cmd = new Command(explicitlyDependsOn["thetool.thetool"][0].filePath, + output.filePath); + cmd.description = "running the tool"; + return [cmd]; + } + } + } + } + + Product { + name: "user-in-project" + type: ["thetool.output"] + Depends { name: "thetool" } + } +} diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index 3229d6c16..6b64bc2ea 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -2629,6 +2629,39 @@ void TestApi::subProjects() qPrintable(errorInfo.toString())); } +void TestApi::toolInModule() +{ + QVariantMap overrides({std::make_pair("qbs.installRoot", m_workingDataDir + + "/tool-in-module/use-outside-project")}); + const qbs::ErrorInfo error + = doBuildProject("tool-in-module/use-within-project/use-within-project.qbs", nullptr, + nullptr, nullptr, qbs::BuildOptions(), overrides); + QVERIFY2(!error.hasError(), qPrintable(error.toString())); + const QString toolOutput = relativeProductBuildDir("user-in-project") + "/tool-output.txt"; + QVERIFY2(QFile::exists(toolOutput), qPrintable(toolOutput)); + + const qbs::SetupProjectParameters params + = defaultSetupParameters("tool-in-module/use-outside-project/use-outside-project.qbs"); + const std::unique_ptr<qbs::SetupProjectJob> setupJob(qbs::Project().setupProject(params, + m_logSink, 0)); + QVERIFY(waitForFinished(setupJob.get())); + QVERIFY2(!setupJob->error().hasError(), qPrintable(setupJob->error().toString())); + const qbs::Project project = setupJob->project(); + const qbs::ProjectData projectData = project.projectData(); + const QList<qbs::ProductData> products = projectData.products(); + QCOMPARE(products.count(), 1); + const qbs::ProductData product = products.first(); + for (const qbs::GroupData &group : product.groups()) + QVERIFY(group.name() != "thetool binary"); + const std::unique_ptr<qbs::BuildJob> buildJob(setupJob->project() + .buildAllProducts(qbs::BuildOptions())); + QVERIFY(waitForFinished(buildJob.get())); + QVERIFY2(!buildJob->error().hasError(), qPrintable(buildJob->error().toString())); + const QString toolOutput2 = relativeProductBuildDir("user-outside-project") + + "/tool-output.txt"; + QVERIFY2(QFile::exists(toolOutput2), qPrintable(toolOutput2)); +} + void TestApi::trackAddQObjectHeader() { const qbs::SetupProjectParameters params diff --git a/tests/auto/api/tst_api.h b/tests/auto/api/tst_api.h index b70c69afb..1bdcdb980 100644 --- a/tests/auto/api/tst_api.h +++ b/tests/auto/api/tst_api.h @@ -136,6 +136,7 @@ private slots: void softDependency(); void sourceFileInBuildDir(); void subProjects(); + void toolInModule(); void trackAddQObjectHeader(); void trackRemoveQObjectHeader(); void transformers(); diff --git a/tests/auto/blackbox/testdata/dynamic-library-in-module/Dll.qbs b/tests/auto/blackbox/testdata/dynamic-library-in-module/Dll.qbs new file mode 100644 index 000000000..0f897df67 --- /dev/null +++ b/tests/auto/blackbox/testdata/dynamic-library-in-module/Dll.qbs @@ -0,0 +1,16 @@ +import qbs + +DynamicLibrary { + Depends { name: "cpp" } + Depends { name: "bundle"; condition: qbs.targetOS.contains("darwin") } + Properties { + condition: qbs.targetOS.contains("darwin") + bundle.isBundle: false + cpp.minimumMacosVersion: "10.5" // For -rpath + } + + Group { + fileTagsFilter: ["dynamiclibrary", "dynamiclibrary_import"] + qbs.install: true + } +} diff --git a/tests/auto/blackbox/testdata/dynamic-library-in-module/lib1.cpp b/tests/auto/blackbox/testdata/dynamic-library-in-module/lib1.cpp new file mode 100644 index 000000000..ccf9e47ab --- /dev/null +++ b/tests/auto/blackbox/testdata/dynamic-library-in-module/lib1.cpp @@ -0,0 +1,7 @@ +#include "../dllexport.h" +#include <iostream> + +DLL_EXPORT void theLibFunc() +{ + std::cout << "Hello from thelib!" << std::endl; +} diff --git a/tests/auto/blackbox/testdata/dynamic-library-in-module/lib2.cpp b/tests/auto/blackbox/testdata/dynamic-library-in-module/lib2.cpp new file mode 100644 index 000000000..f3f0711f3 --- /dev/null +++ b/tests/auto/blackbox/testdata/dynamic-library-in-module/lib2.cpp @@ -0,0 +1,7 @@ +#include "../dllexport.h" +#include <iostream> + +DLL_EXPORT void theOtherLibFunc() +{ + std::cout << "Hello from theotherlib!" << std::endl; +} diff --git a/tests/auto/blackbox/testdata/dynamic-library-in-module/lib3.cpp b/tests/auto/blackbox/testdata/dynamic-library-in-module/lib3.cpp new file mode 100644 index 000000000..d2beebbb4 --- /dev/null +++ b/tests/auto/blackbox/testdata/dynamic-library-in-module/lib3.cpp @@ -0,0 +1,7 @@ +#include "../dllexport.h" +#include <iostream> + +DLL_EXPORT void theThirdLibFunc() +{ + std::cout << "Hello from thethirdlib!" << std::endl; +} diff --git a/tests/auto/blackbox/testdata/dynamic-library-in-module/lib4.cpp b/tests/auto/blackbox/testdata/dynamic-library-in-module/lib4.cpp new file mode 100644 index 000000000..9e43fe56f --- /dev/null +++ b/tests/auto/blackbox/testdata/dynamic-library-in-module/lib4.cpp @@ -0,0 +1,8 @@ +#include "../dllexport.h" + +DLL_IMPORT void theLibFunc(); + +DLL_EXPORT void theFourthLibFunc() +{ + theLibFunc(); +} diff --git a/tests/auto/blackbox/testdata/dynamic-library-in-module/main.cpp b/tests/auto/blackbox/testdata/dynamic-library-in-module/main.cpp new file mode 100644 index 000000000..75d272c64 --- /dev/null +++ b/tests/auto/blackbox/testdata/dynamic-library-in-module/main.cpp @@ -0,0 +1,13 @@ +#include "../dllexport.h" + +DLL_IMPORT void theOtherLibFunc(); +DLL_IMPORT void theFourthLibFunc(); + +void theThirdLibFunc() { } + +int main() +{ + theOtherLibFunc(); + theThirdLibFunc(); + theFourthLibFunc(); +} diff --git a/tests/auto/blackbox/testdata/dynamic-library-in-module/modules/thelib/thelib.qbs b/tests/auto/blackbox/testdata/dynamic-library-in-module/modules/thelib/thelib.qbs new file mode 100644 index 000000000..b45bba50a --- /dev/null +++ b/tests/auto/blackbox/testdata/dynamic-library-in-module/modules/thelib/thelib.qbs @@ -0,0 +1,22 @@ +import qbs +import qbs.FileInfo + +Module { + Depends { name: "cpp" } + property string baseDir: FileInfo.cleanPath(FileInfo.joinPaths(path, "..", "..")) + cpp.rpaths: [product.thelib.baseDir] + Group { + name: "thelib dll" + files: FileInfo.joinPaths(product.thelib.baseDir, + cpp.dynamicLibraryPrefix + "thelib" + cpp.dynamicLibrarySuffix) + fileTags: ["dynamiclibrary"] + filesAreTargets: true + } + Group { + name: "thelib dll import" + condition: qbs.targetOS.contains("windows") && !qbs.toolchain.contains("mingw") + files: FileInfo.joinPaths(product.thelib.baseDir, "thelib.lib") + fileTags: ["dynamiclibrary_import"] + filesAreTargets: true + } +} diff --git a/tests/auto/blackbox/testdata/dynamic-library-in-module/modules/theotherlib/theotherlib.qbs b/tests/auto/blackbox/testdata/dynamic-library-in-module/modules/theotherlib/theotherlib.qbs new file mode 100644 index 000000000..2a9a7314f --- /dev/null +++ b/tests/auto/blackbox/testdata/dynamic-library-in-module/modules/theotherlib/theotherlib.qbs @@ -0,0 +1,22 @@ +import qbs +import qbs.FileInfo + +Module { + Depends { name: "cpp" } + property string baseDir: FileInfo.cleanPath(FileInfo.joinPaths(path, "..", "..")) + cpp.rpaths: [product.theotherlib.baseDir] + Group { + name: "theotherlib dll" + files: FileInfo.joinPaths(product.theotherlib.baseDir, cpp.dynamicLibraryPrefix + + "theotherlib" + cpp.dynamicLibrarySuffix) + fileTags: ["dynamiclibrary"] + filesAreTargets: true + } + Group { + name: "theotherlib dll import" + condition: qbs.targetOS.contains("windows") && !qbs.toolchain.contains("mingw") + files: FileInfo.joinPaths(product.theotherlib.baseDir, "theotherlib.lib") + fileTags: ["dynamiclibrary_import"] + filesAreTargets: true + } +} diff --git a/tests/auto/blackbox/testdata/dynamic-library-in-module/modules/thethirdlib/thethirdlib.qbs b/tests/auto/blackbox/testdata/dynamic-library-in-module/modules/thethirdlib/thethirdlib.qbs new file mode 100644 index 000000000..d422d3f2c --- /dev/null +++ b/tests/auto/blackbox/testdata/dynamic-library-in-module/modules/thethirdlib/thethirdlib.qbs @@ -0,0 +1,22 @@ +import qbs +import qbs.FileInfo + +Module { + Depends { name: "cpp" } + property string baseDir: FileInfo.cleanPath(FileInfo.joinPaths(path, "..", "..")) + Group { + name: "thethirdlib dll" + condition: false + files: FileInfo.joinPaths(product.theotherlib.baseDir, cpp.dynamicLibraryPrefix + + "thethirdlib" + cpp.dynamicLibrarySuffix) + fileTags: ["dynamiclibrary"] + filesAreTargets: true + } + Group { + name: "thethirdlib dll import" + condition: false + files: FileInfo.joinPaths(product.thethirdlib.baseDir, "thethirdlib.lib") + fileTags: ["dynamiclibrary_import"] + filesAreTargets: true + } +} diff --git a/tests/auto/blackbox/testdata/dynamic-library-in-module/theapp.qbs b/tests/auto/blackbox/testdata/dynamic-library-in-module/theapp.qbs new file mode 100644 index 000000000..50acfd447 --- /dev/null +++ b/tests/auto/blackbox/testdata/dynamic-library-in-module/theapp.qbs @@ -0,0 +1,21 @@ +import qbs + +Project { + CppApplication { + name: "theapp" + cpp.minimumMacosVersion: "10.5" // For -rpath + Depends { name: "theotherlib" } + Depends { name: "thethirdlib" } + Depends { name: "thefourthlib" } + files: "main.cpp" + } + Dll { + name: "thefourthlib" + Depends { name: "thelib" } + files: "lib4.cpp" + Export { + Depends { name: "cpp" } + cpp.rpaths: [qbs.installRoot] + } + } +} diff --git a/tests/auto/blackbox/testdata/dynamic-library-in-module/thelibs.qbs b/tests/auto/blackbox/testdata/dynamic-library-in-module/thelibs.qbs new file mode 100644 index 000000000..361642cca --- /dev/null +++ b/tests/auto/blackbox/testdata/dynamic-library-in-module/thelibs.qbs @@ -0,0 +1,16 @@ +import qbs + +Project { + Dll { + name: "thelib" + files: "lib1.cpp" + } + Dll { + name: "theotherlib" + files: "lib2.cpp" + } + Dll { + name: "thethirdlib" + files: "lib3.cpp" + } +} diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index af8edb489..d4e4c81ca 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -863,6 +863,21 @@ void TestBlackbox::driverLinkerFlags_data() QTest::newRow("link using linker") << "manual" << false; } +void TestBlackbox::dynamicLibraryInModule() +{ + QDir::setCurrent(testDataDir + "/dynamic-library-in-module"); + const QString installRootSpec = QString("qbs.installRoot:") + QDir::currentPath(); + QbsRunParameters libParams(QStringList({"-f", "thelibs.qbs", installRootSpec})); + libParams.buildDirectory = "libbuild"; + QCOMPARE(runQbs(libParams), 0); + QbsRunParameters appParams("run", QStringList({"-f", "theapp.qbs", installRootSpec})); + appParams.buildDirectory = "appbuild"; + QCOMPARE(runQbs(appParams), 0); + QVERIFY2(m_qbsStdout.contains("Hello from thelib"), m_qbsStdout.constData()); + QVERIFY2(m_qbsStdout.contains("Hello from theotherlib"), m_qbsStdout.constData()); + QVERIFY2(!m_qbsStdout.contains("thirdlib"), m_qbsStdout.constData()); +} + void TestBlackbox::symlinkRemoval() { if (HostOsInfo::isWindowsHost()) diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h index 67c9d152a..05b8d4838 100644 --- a/tests/auto/blackbox/tst_blackbox.h +++ b/tests/auto/blackbox/tst_blackbox.h @@ -79,6 +79,7 @@ private slots: void discardUnusedData_data(); void driverLinkerFlags(); void driverLinkerFlags_data(); + void dynamicLibraryInModule(); void dynamicMultiplexRule(); void dynamicProject(); void dynamicRuleOutputs(); |