From 80f6d7862c0e2e41768620d5bd81b0e1d5e3f61f Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Thu, 20 Sep 2012 14:11:25 +0200 Subject: Blackberry mkspecs: Refine compiler options stack-protector-strong gives performance benefits over stack-protector-all and is still checking more than -stack-protector, so seems to be a good middle way and we want to use it when it is there. The -shared option for the compiler (not the linker) prevents a RIM internal version of qcc from forcing -fPIE, and should not harm in general when set. In addition, add a method "compilerSupportsFlag" for Windows as is present in the Unix configure script. Change-Id: Iba300e9cb82f34043e7b36f8e45287a1aed2a1a5 Original-patch-by: Greg Bentz Reviewed-by: Sean Harmer --- configure | 17 ++++++++++++++-- mkspecs/blackberry-armv7le-qcc/qmake.conf | 8 +++++++- mkspecs/blackberry-x86-qcc/qmake.conf | 8 +++++++- mkspecs/common/qcc-base.conf | 2 +- tools/configure/configureapp.cpp | 32 +++++++++++++++++++++++++++++++ tools/configure/configureapp.h | 1 + 6 files changed, 63 insertions(+), 5 deletions(-) diff --git a/configure b/configure index 58d7a86ad7..19eef3f4bb 100755 --- a/configure +++ b/configure @@ -230,9 +230,9 @@ compilerSupportsFlag() cat >conftest.cpp <::iterator i = dictionary.begin(); i != dictionary.end(); ++i) { if (i.value() == "auto") @@ -2511,6 +2519,9 @@ void Configure::generateOutputVars() if (dictionary["QT_GLIB"] == "yes") qtConfig += "glib"; + if (dictionary["STACK_PROTECTOR_STRONG"] == "yes") + qtConfig += "stack-protector-strong"; + // We currently have no switch for QtConcurrent, so add it unconditionally. qtConfig += "concurrent"; @@ -2872,6 +2883,27 @@ bool Configure::tryCompileProject(const QString &projectPath, const QString &ext return code == 0; } +bool Configure::compilerSupportsFlag(const QString &compilerAndArgs) +{ + QFile file("conftest.cpp"); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { + cout << "could not open temp file for writing" << endl; + return false; + } + if (!file.write("int main() { return 0; }\r\n")) { + cout << "could not write to temp file" << endl; + return false; + } + file.close(); + // compilerAndArgs contains compiler because there is no way to query it + QString command = compilerAndArgs + " -o conftest-out.o conftest.cpp"; + int code = 0; + QString output = Environment::execute(command, &code); + file.remove(); + QFile::remove("conftest-out.o"); + return code == 0; +} + void Configure::generateQConfigPri() { // Generate qconfig.pri diff --git a/tools/configure/configureapp.h b/tools/configure/configureapp.h index 3261f4f80d..8cae9da4f8 100644 --- a/tools/configure/configureapp.h +++ b/tools/configure/configureapp.h @@ -175,6 +175,7 @@ private: #endif bool tryCompileProject(const QString &projectPath, const QString &extraOptions = QString()); + bool compilerSupportsFlag(const QString &compilerAndArgs); void desc(const char *description, int startingAt = 0, int wrapIndent = 0); void desc(const char *option, const char *description, bool skipIndent = false, char fillChar = '.'); -- cgit v1.2.3