From 00f77c9f2397f805e3a5cb8162fa7e458a47ff77 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Wed, 1 Mar 2017 15:10:20 +0100 Subject: Add failing autotest for linking dynamic libs and static libs This test builds an application with the following dependencies: app -> dynamiclib1 -> staticlib1 -> dynamiclib2 -> staticlib2 Change-Id: I1cd53d20eed7462ef8417ef61ce8e599bc0ecd8e Reviewed-by: Christian Kandeler --- .../link-dynamiclibs-staticlibs/dynamic1.cpp | 18 ++++++++++ .../link-dynamiclibs-staticlibs/dynamic2.cpp | 15 ++++++++ .../link-dynamiclibs-staticlibs.qbs | 41 ++++++++++++++++++++++ .../testdata/link-dynamiclibs-staticlibs/main.cpp | 16 +++++++++ .../link-dynamiclibs-staticlibs/static1.cpp | 17 +++++++++ .../link-dynamiclibs-staticlibs/static2.cpp | 7 ++++ .../testdata/link-dynamiclibs-staticlibs/static2.h | 10 ++++++ tests/auto/api/tst_api.cpp | 32 +++++++++++++++++ tests/auto/api/tst_api.h | 1 + 9 files changed, 157 insertions(+) create mode 100644 tests/auto/api/testdata/link-dynamiclibs-staticlibs/dynamic1.cpp create mode 100644 tests/auto/api/testdata/link-dynamiclibs-staticlibs/dynamic2.cpp create mode 100644 tests/auto/api/testdata/link-dynamiclibs-staticlibs/link-dynamiclibs-staticlibs.qbs create mode 100644 tests/auto/api/testdata/link-dynamiclibs-staticlibs/main.cpp create mode 100644 tests/auto/api/testdata/link-dynamiclibs-staticlibs/static1.cpp create mode 100644 tests/auto/api/testdata/link-dynamiclibs-staticlibs/static2.cpp create mode 100644 tests/auto/api/testdata/link-dynamiclibs-staticlibs/static2.h (limited to 'tests') diff --git a/tests/auto/api/testdata/link-dynamiclibs-staticlibs/dynamic1.cpp b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/dynamic1.cpp new file mode 100644 index 000000000..18842f105 --- /dev/null +++ b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/dynamic1.cpp @@ -0,0 +1,18 @@ +#include + +#if defined(_WIN32) || defined(WIN32) +# define EXPORT __declspec(dllexport) +# define IMPORT __declspec(dllimport) +#else +# define EXPORT +# define IMPORT +#endif + +IMPORT void static1_hello(); + +EXPORT int dynamic1_hello() +{ + static1_hello(); + puts("dynamic1 says hello!"); + return 0; +} diff --git a/tests/auto/api/testdata/link-dynamiclibs-staticlibs/dynamic2.cpp b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/dynamic2.cpp new file mode 100644 index 000000000..04255d459 --- /dev/null +++ b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/dynamic2.cpp @@ -0,0 +1,15 @@ +#include "static2.h" +#include + +#if defined(_WIN32) || defined(WIN32) +# define EXPORT __declspec(dllexport) +#else +# define EXPORT __attribute__((visibility("default"))) +#endif + +EXPORT void dynamic2_hello() +{ + TestMe tm; + tm.hello(); + puts("dynamic2 says hello!"); +} diff --git a/tests/auto/api/testdata/link-dynamiclibs-staticlibs/link-dynamiclibs-staticlibs.qbs b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/link-dynamiclibs-staticlibs.qbs new file mode 100644 index 000000000..2020752e6 --- /dev/null +++ b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/link-dynamiclibs-staticlibs.qbs @@ -0,0 +1,41 @@ +import qbs 1.0 + +Project { + Application { + name : "HelloWorld" + files : [ "main.cpp" ] + Depends { name: "cpp" } + Depends { name: "dynamic1" } + } + + DynamicLibrary { + name : "dynamic1" + files : [ "dynamic1.cpp" ] + Depends { name: "cpp" } + Depends { name: "static1" } + bundle.isBundle: false + } + + StaticLibrary { + name: "static1" + files: [ "static1.cpp" ] + Depends { name: "cpp" } + Depends { name: "dynamic2" } + } + + DynamicLibrary { + name: "dynamic2" + files: [ "dynamic2.cpp" ] + Depends { name: "cpp" } + Depends { name: "static2" } + cpp.visibility: 'hidden' + bundle.isBundle: false + } + + StaticLibrary { + name: "static2" + files: [ "static2.cpp", "static2.h" ] + Depends { name: "cpp" } + } +} + diff --git a/tests/auto/api/testdata/link-dynamiclibs-staticlibs/main.cpp b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/main.cpp new file mode 100644 index 000000000..f996157e9 --- /dev/null +++ b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/main.cpp @@ -0,0 +1,16 @@ +#include + +#if defined(_WIN32) || defined(WIN32) +# define IMPORT __declspec(dllimport) +#else +# define IMPORT +#endif + +IMPORT int dynamic1_hello(); + +int main() +{ + int result = dynamic1_hello(); + puts("application says hello!"); + return result; +} diff --git a/tests/auto/api/testdata/link-dynamiclibs-staticlibs/static1.cpp b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/static1.cpp new file mode 100644 index 000000000..87b713757 --- /dev/null +++ b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/static1.cpp @@ -0,0 +1,17 @@ +#include + +#if defined(_WIN32) || defined(WIN32) +# define EXPORT __declspec(dllexport) +# define IMPORT __declspec(dllimport) +#else +# define EXPORT __attribute__((visibility("default"))) +# define IMPORT +#endif + +IMPORT void dynamic2_hello(); + +EXPORT void static1_hello() +{ + dynamic2_hello(); + puts("static1 says hello!"); +} diff --git a/tests/auto/api/testdata/link-dynamiclibs-staticlibs/static2.cpp b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/static2.cpp new file mode 100644 index 000000000..073b13609 --- /dev/null +++ b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/static2.cpp @@ -0,0 +1,7 @@ +#include "static2.h" +#include + +void TestMe::hello() const +{ + puts("static2 says hello!"); +} diff --git a/tests/auto/api/testdata/link-dynamiclibs-staticlibs/static2.h b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/static2.h new file mode 100644 index 000000000..2e07ef32a --- /dev/null +++ b/tests/auto/api/testdata/link-dynamiclibs-staticlibs/static2.h @@ -0,0 +1,10 @@ +#ifndef STATIC2_H +#define STATIC2_H + +class TestMe +{ +public: + void hello() const; +}; + +#endif // STATIC2_H diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index bf1a066ef..e0bdbb949 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -41,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -78,9 +80,11 @@ class BuildDescriptionReceiver : public QObject Q_OBJECT public: QString descriptions; + QStringList descriptionLines; void handleDescription(const QString &, const QString &description) { descriptions += description; + descriptionLines << description; } }; @@ -1336,6 +1340,34 @@ void TestApi::linkDynamicLibs() VERIFY_NO_ERROR(errorInfo); } +void TestApi::linkDynamicAndStaticLibs() +{ + BuildDescriptionReceiver bdr; + qbs::BuildOptions options; + options.setEchoMode(qbs::CommandEchoModeCommandLine); + const qbs::ErrorInfo errorInfo = doBuildProject("link-dynamiclibs-staticlibs", &bdr, nullptr, + nullptr, options); + QEXPECT_FAIL("", "currently broken; about to be fixed", Abort); + VERIFY_NO_ERROR(errorInfo); + + // The dependent static libs should not appear in the link command for the executable. + qbs::Settings settings((QString())); + const qbs::Profile buildProfile(profileName(), &settings); + if (buildProfile.value("qbs.toolchain").toStringList().contains("gcc")) { + QRegularExpression appLinkCmdRex(" -o [^ ]*/HelloWorld "); + QString appLinkCmd; + for (const QString &line : qAsConst(bdr.descriptionLines)) { + if (line.contains(appLinkCmdRex)) { + appLinkCmd = line; + break; + } + } + QVERIFY(!appLinkCmd.isEmpty()); + QVERIFY(!appLinkCmd.contains("static1")); + QVERIFY(!appLinkCmd.contains("static2")); + } +} + void TestApi::listBuildSystemFiles() { qbs::SetupProjectParameters setupParams diff --git a/tests/auto/api/tst_api.h b/tests/auto/api/tst_api.h index 6df3bedab..7a89eb621 100644 --- a/tests/auto/api/tst_api.h +++ b/tests/auto/api/tst_api.h @@ -95,6 +95,7 @@ private slots: void installableFiles(); void isRunnable(); void linkDynamicLibs(); + void linkDynamicAndStaticLibs(); void listBuildSystemFiles(); void missingSourceFile(); void mocCppIncluded(); -- cgit v1.2.3