cat >conftest.cpp <<EOF
int main() { return 0; }
EOF
- "$TEST_COMPILER" "$@" -o conftest.o conftest.cpp
+ $TEST_COMPILER "$@" -o conftest-out.o conftest.cpp
ret=$?
- rm -f conftest.cpp conftest.o
+ rm -f conftest.cpp conftest-out.o
return $ret
}
CFG_QML_DEBUG=yes
CFG_JAVASCRIPTCORE_JIT=auto
CFG_PKGCONFIG=auto
+CFG_STACK_PROTECTOR_STRONG=auto
# Target architecture
CFG_ARCH=
fi
fi
+# auto-detect -fstack-protector-strong support (for QNX only currently)
+if [ "$XPLATFORM_QNX" = "yes" ]; then
+ if compilerSupportsFlag -fstack-protector-strong; then
+ CFG_STACK_PROTECTOR_STRONG=yes
+ else
+ CFG_STACK_PROTECTOR_STRONG=no
+ fi
+else
+ CFG_STACK_PROTECTOR_STRONG=no
+fi
+
# detect the availability of the -Bsymbolic-functions linker optimization
if [ "$CFG_REDUCE_RELOCATIONS" != "no" ]; then
if "$unixtests/bsymbolic_functions.test" "$TEST_COMPILER" "$OPT_VERBOSE"; then
QMAKE_CONFIG="$QMAKE_CONFIG GNUmake"
fi
[ "$CFG_REDUCE_EXPORTS" = "yes" ] && QT_CONFIG="$QT_CONFIG reduce_exports"
+[ "$CFG_STACK_PROTECTOR_STRONG" = "yes" ] && QT_CONFIG="$QT_CONFIG stack-protector-strong"
[ "$CFG_REDUCE_RELOCATIONS" = "yes" ] && QT_CONFIG="$QT_CONFIG reduce_relocations"
[ "$CFG_STRIP" = "no" ] && QMAKE_CONFIG="$QMAKE_CONFIG nostrip"
[ "$CFG_PRECOMPILE" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG precompile_header"
# qmake configuration for blackberry armv7le systems
#
+load(qt_config)
+
DEFINES += Q_OS_BLACKBERRY
CONFIG += blackberry
LIBS += -lbps
# Blackberry also has support for stack smashing protection in its libc
-QMAKE_CFLAGS += -fstack-protector -fstack-protector-all
+contains(QT_CONFIG, stack-protector-strong) {
+ QMAKE_CFLAGS += -fstack-protector-strong
+} else {
+ QMAKE_CFLAGS += -fstack-protector -fstack-protector-all
+}
include(../common/qcc-base-qnx-armv7le.conf)
# qmake configuration for blackberry x86 systems
#
+load(qt_config)
+
DEFINES += Q_OS_BLACKBERRY
CONFIG += blackberry
LIBS += -lbps
# Blackberry also has support for stack smashing protection in its libc
-QMAKE_CFLAGS += -fstack-protector -fstack-protector-all
+contains(QT_CONFIG, stack-protector-strong) {
+ QMAKE_CFLAGS += -fstack-protector-strong
+} else {
+ QMAKE_CFLAGS += -fstack-protector -fstack-protector-all
+}
include(../common/qcc-base-qnx-x86.conf)
QMAKE_CFLAGS_WARN_OFF += -w
QMAKE_CFLAGS_RELEASE += -O2
QMAKE_CFLAGS_DEBUG += -g
-QMAKE_CFLAGS_SHLIB += -fPIC
+QMAKE_CFLAGS_SHLIB += -fPIC -shared
QMAKE_CFLAGS_STATIC_LIB += -fPIC
QMAKE_CFLAGS_APP += -fPIE
QMAKE_CFLAGS_YACC += -Wno-unused -Wno-parentheses
dictionary[ "QT_ICONV" ] = "no";
dictionary["DECORATIONS"] = "default windows styled";
+ } else if ((platform() == QNX) || (platform() == BLACKBERRY)) {
+ dictionary["STACK_PROTECTOR_STRONG"] = "auto";
}
}
available = tryCompileProject("unix/iconv") || tryCompileProject("unix/gnu-libiconv");
} else if (part == "CUPS") {
available = (platform() != WINDOWS) && (platform() != WINDOWS_CE) && tryCompileProject("unix/cups");
+ } else if (part == "STACK_PROTECTOR_STRONG") {
+ available = (platform() == QNX || platform() == BLACKBERRY) && compilerSupportsFlag("qcc -fstack-protector-strong");
}
return available;
if (dictionary["QT_CUPS"] == "auto")
dictionary["QT_CUPS"] = checkAvailability("CUPS") ? "yes" : "no";
+ // Detection of -fstack-protector-strong support
+ if (dictionary["STACK_PROTECTOR_STRONG"] == "auto")
+ dictionary["STACK_PROTECTOR_STRONG"] = checkAvailability("STACK_PROTECTOR_STRONG") ? "yes" : "no";
+
// Mark all unknown "auto" to the default value..
for (QMap<QString,QString>::iterator i = dictionary.begin(); i != dictionary.end(); ++i) {
if (i.value() == "auto")
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";
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
#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 = '.');