diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-12-20 15:12:19 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2019-01-07 13:31:51 +0000 |
commit | d8a5edfb8c5bb0556d33d8eac512be41472585fb (patch) | |
tree | ffab1b0caab481bdc30a427d11a382fafba513de | |
parent | e5ba24302d9e1d55c544c8616f837af9cfbbf710 (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.qdoc | 14 | ||||
-rw-r--r-- | share/qbs/modules/cpp/GenericGCC.qbs | 12 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/linker-variant/linker-variant.qbs | 20 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/linker-variant/main.cpp | 1 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackbox.cpp | 28 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackbox.h | 2 |
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(); |