aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-12-20 15:12:19 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2019-01-07 13:31:51 +0000
commitd8a5edfb8c5bb0556d33d8eac512be41472585fb (patch)
treeffab1b0caab481bdc30a427d11a382fafba513de
parente5ba24302d9e1d55c544c8616f837af9cfbbf710 (diff)
GCC: Make it possible to force the linker variant
...via cpp.linkerVariant. [ChangeLog] Added new cpp property linkerVariant to force use of gold, bfd or lld. Task-number: QBS-1421 Change-Id: I98f9d2581515ac8e9c984a2f8d70f4a7a3ab230b Reviewed-by: Orgad Shaneh <orgads@gmail.com> Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
-rw-r--r--doc/reference/modules/cpp-module.qdoc14
-rw-r--r--share/qbs/modules/cpp/GenericGCC.qbs12
-rw-r--r--tests/auto/blackbox/testdata/linker-variant/linker-variant.qbs20
-rw-r--r--tests/auto/blackbox/testdata/linker-variant/main.cpp1
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp28
-rw-r--r--tests/auto/blackbox/tst_blackbox.h2
6 files changed, 77 insertions, 0 deletions
diff --git a/doc/reference/modules/cpp-module.qdoc b/doc/reference/modules/cpp-module.qdoc
index 9cf7d6a0f..940e837ae 100644
--- a/doc/reference/modules/cpp-module.qdoc
+++ b/doc/reference/modules/cpp-module.qdoc
@@ -1208,6 +1208,20 @@
*/
/*!
+ \qmlproperty string cpp::linkerVariant
+ \since Qbs 1.13
+
+ \unixproperty
+
+ Set this property to force the use of a specific \c ld implementation. A non-empty value
+ will result in the \c {-fuse-ld} option being emitted when linking with \c gcc or \c clang.
+
+ The possible values are \c "bfd", \c "gold" and \c "lld".
+
+ \nodefaultvalue
+*/
+
+/*!
\qmlproperty string cpp::nmName
\since Qbs 1.2
diff --git a/share/qbs/modules/cpp/GenericGCC.qbs b/share/qbs/modules/cpp/GenericGCC.qbs
index 972555ed7..60288e76a 100644
--- a/share/qbs/modules/cpp/GenericGCC.qbs
+++ b/share/qbs/modules/cpp/GenericGCC.qbs
@@ -173,6 +173,18 @@ CppModule {
+ "such as \"--no-undefined\", then you should set this property to \"strict\"."
}
+ property string linkerVariant
+ PropertyOptions {
+ name: "linkerVariant"
+ allowedValues: ["bfd", "gold", "lld"]
+ description: "Allows to specify the linker variant. Maps to gcc's and clang's -fuse-ld "
+ + "option."
+ }
+ Properties {
+ condition: linkerVariant
+ driverLinkerFlags: "-fuse-ld=" + linkerVariant
+ }
+
property string toolchainPathPrefix: Gcc.pathPrefix(toolchainInstallPath, toolchainPrefix)
property string binutilsPathPrefix: Gcc.pathPrefix(binutilsPath, toolchainPrefix)
diff --git a/tests/auto/blackbox/testdata/linker-variant/linker-variant.qbs b/tests/auto/blackbox/testdata/linker-variant/linker-variant.qbs
new file mode 100644
index 000000000..57bd4ccba
--- /dev/null
+++ b/tests/auto/blackbox/testdata/linker-variant/linker-variant.qbs
@@ -0,0 +1,20 @@
+CppApplication {
+ name: "p"
+ property string linkerVariant
+ Probe {
+ id: gccProbe
+ property bool isGcc: qbs.toolchain.contains("gcc")
+ configure: {
+ console.info("is GCC: " + isGcc);
+ if (isGcc)
+ found = true;
+ }
+ }
+
+ Properties {
+ condition: gccProbe.found
+ cpp.linkerVariant: linkerVariant
+ }
+
+ files: "main.cpp"
+}
diff --git a/tests/auto/blackbox/testdata/linker-variant/main.cpp b/tests/auto/blackbox/testdata/linker-variant/main.cpp
new file mode 100644
index 000000000..237c8ce18
--- /dev/null
+++ b/tests/auto/blackbox/testdata/linker-variant/main.cpp
@@ -0,0 +1 @@
+int main() {}
diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp
index 50a3bb9c5..d1cd1d503 100644
--- a/tests/auto/blackbox/tst_blackbox.cpp
+++ b/tests/auto/blackbox/tst_blackbox.cpp
@@ -4245,6 +4245,34 @@ void TestBlackbox::linkerMode()
testCondition(lang, [](const QByteArray &lddOutput) { return lddOutput.contains("objc"); });
}
+void TestBlackbox::linkerVariant_data()
+{
+ QTest::addColumn<QString>("theType");
+ QTest::newRow("default") << QString();
+ QTest::newRow("bfd") << QString("bfd");
+ QTest::newRow("gold") << QString("gold");
+}
+
+void TestBlackbox::linkerVariant()
+{
+ QDir::setCurrent(testDataDir + "/linker-variant");
+ QFETCH(QString, theType);
+ QStringList resolveArgs("--force-probe-execution");
+ if (!theType.isEmpty())
+ resolveArgs << ("products.p.linkerVariant:" + theType);
+ QCOMPARE(runQbs(QbsRunParameters("resolve", resolveArgs)), 0);
+ const bool isGcc = m_qbsStdout.contains("is GCC: true");
+ const bool isNotGcc = m_qbsStdout.contains("is GCC: false");
+ QVERIFY2(isGcc != isNotGcc, m_qbsStdout.constData());
+ QbsRunParameters buildParams("build", QStringList{"--command-echo-mode", "command-line"});
+ buildParams.expectFailure = true;
+ runQbs(buildParams);
+ if (isGcc && !theType.isEmpty())
+ QCOMPARE(m_qbsStdout.count("-fuse-ld=" + theType.toLocal8Bit()), 1);
+ else
+ QVERIFY2(!m_qbsStdout.contains("-fuse-ld"), m_qbsStdout.constData());
+}
+
void TestBlackbox::lexyacc()
{
if (!lexYaccExist())
diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h
index 874690ad2..9a715e721 100644
--- a/tests/auto/blackbox/tst_blackbox.h
+++ b/tests/auto/blackbox/tst_blackbox.h
@@ -160,6 +160,8 @@ private slots:
void jsExtensionsBinaryFile();
void ld();
void linkerMode();
+ void linkerVariant_data();
+ void linkerVariant();
void lexyacc();
void lexyaccOutputs();
void lexyaccOutputs_data();