aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2017-03-01 15:10:20 +0100
committerJoerg Bornemann <joerg.bornemann@qt.io>2017-03-02 09:43:16 +0000
commit00f77c9f2397f805e3a5cb8162fa7e458a47ff77 (patch)
tree4381c0214c9f9ea7f3f9bfbf41ebaa0ced702502 /tests
parenta758307ada12890315258d413c6a4a3d8247f72b (diff)
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 <christian.kandeler@qt.io>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/api/testdata/link-dynamiclibs-staticlibs/dynamic1.cpp18
-rw-r--r--tests/auto/api/testdata/link-dynamiclibs-staticlibs/dynamic2.cpp15
-rw-r--r--tests/auto/api/testdata/link-dynamiclibs-staticlibs/link-dynamiclibs-staticlibs.qbs41
-rw-r--r--tests/auto/api/testdata/link-dynamiclibs-staticlibs/main.cpp16
-rw-r--r--tests/auto/api/testdata/link-dynamiclibs-staticlibs/static1.cpp17
-rw-r--r--tests/auto/api/testdata/link-dynamiclibs-staticlibs/static2.cpp7
-rw-r--r--tests/auto/api/testdata/link-dynamiclibs-staticlibs/static2.h10
-rw-r--r--tests/auto/api/tst_api.cpp32
-rw-r--r--tests/auto/api/tst_api.h1
9 files changed, 157 insertions, 0 deletions
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 <stdio.h>
+
+#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 <stdio.h>
+
+#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 <stdio.h>
+
+#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 <stdio.h>
+
+#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 <stdio.h>
+
+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 <qbs.h>
#include <tools/fileinfo.h>
#include <tools/hostosinfo.h>
+#include <tools/qttools.h>
#include <tools/toolchains.h>
#include <QtCore/qcoreapplication.h>
@@ -41,6 +42,7 @@
#include <QtCore/qeventloop.h>
#include <QtCore/qfile.h>
#include <QtCore/qfileinfo.h>
+#include <QtCore/qregularexpression.h>
#include <QtCore/qscopedpointer.h>
#include <QtCore/qstringlist.h>
#include <QtCore/qtimer.h>
@@ -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();