From d8a5edfb8c5bb0556d33d8eac512be41472585fb Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 20 Dec 2018 15:12:19 +0100 Subject: 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 Reviewed-by: Joerg Bornemann --- doc/reference/modules/cpp-module.qdoc | 14 +++++++++++ share/qbs/modules/cpp/GenericGCC.qbs | 12 ++++++++++ .../testdata/linker-variant/linker-variant.qbs | 20 ++++++++++++++++ .../auto/blackbox/testdata/linker-variant/main.cpp | 1 + tests/auto/blackbox/tst_blackbox.cpp | 28 ++++++++++++++++++++++ tests/auto/blackbox/tst_blackbox.h | 2 ++ 6 files changed, 77 insertions(+) create mode 100644 tests/auto/blackbox/testdata/linker-variant/linker-variant.qbs create mode 100644 tests/auto/blackbox/testdata/linker-variant/main.cpp 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 @@ -1207,6 +1207,20 @@ \defaultvalue \c "automatic" */ +/*! + \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("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(); -- cgit v1.2.3