From 98c1d516b7f7624f7fcd7b9046783e3903a6a42b Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 28 Apr 2017 13:27:43 +0200 Subject: [PATCH] alloca: detect whether alloca.h exists We can't depend on QT_HAS_INCLUDE for such an important functionality in QtQml, so detect at configure time. alloca() is not a POSIX function (it apparently first appeared in Version 32V AT&T UNIX), so the actual header that defines it varies from system to system. Clearly, if alloca.h exists, that's the one, so we try it first. On most other systems that don't define it, it's in stdlib.h. The only exception is Windows, where it's actually defined in malloc.h. Task-number: QTBUG-59700 Started-by: Thiago Macieira Change-Id: Icd0e0d4b27cb4e5eb892fffd14b4b2b389a4684e Reviewed-by: Thiago Macieira Reviewed-by: Lars Knoll --- config.tests/common/alloca/alloca.cpp | 13 ++++++++--- configure.json | 28 ++++++++++++++++++++--- src/corelib/global/qconfig-bootstrapped.h | 7 ++++++ 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/config.tests/common/alloca/alloca.cpp b/config.tests/common/alloca/alloca.cpp index d839b381ef1..500bdb9ba21 100644 --- a/config.tests/common/alloca/alloca.cpp +++ b/config.tests/common/alloca/alloca.cpp @@ -37,10 +37,17 @@ ** ****************************************************************************/ -#include - +#if defined(USE_ALLOCA_H) +# include +# ifdef __QNXNTO__ // extra include needed in QNX7 to define NULL for the alloca() macro -#include +# include +# endif +#elif defined(USE_MALLOC_H) +# include +#else +# include +#endif int main(int, char **) { diff --git a/configure.json b/configure.json index 49586ed6b8f..02d5f1a65ed 100644 --- a/configure.json +++ b/configure.json @@ -406,11 +406,23 @@ "type": "compile", "test": "unix/posix_fallocate" }, - "alloca": { - "label": "alloca()", + "alloca_stdlib_h": { + "label": "alloca() in stdlib.h", "type": "compile", "test": "common/alloca" }, + "alloca_h": { + "label": "alloca() in alloca.h", + "type": "compile", + "test": "common/alloca", + "args": "DEFINES+=USE_ALLOCA_H" + }, + "alloca_malloc_h": { + "label": "alloca() in malloc.h", + "type": "compile", + "test": "common/alloca", + "args": "DEFINES+=USE_MALLOC_H" + }, "stack_protector": { "label": "stack protection", "type": "compilerSupportsFlag", @@ -900,9 +912,19 @@ "condition": "tests.posix_fallocate", "output": [ "privateFeature" ] }, + "alloca_h": { + "label": "alloca.h", + "condition": "tests.alloca_h", + "output": [ "privateFeature" ] + }, + "alloca_malloc_h": { + "label": "alloca() in malloc.h", + "condition": "!features.alloca_h && tests.alloca_malloc_h", + "output": [ "privateFeature" ] + }, "alloca": { "label": "alloca()", - "condition": "tests.alloca", + "condition": "features.alloca_h || features.alloca_malloc_h || tests.alloca_stdlib_h", "output": [ "privateFeature" ] }, "stack-protector-strong": { diff --git a/src/corelib/global/qconfig-bootstrapped.h b/src/corelib/global/qconfig-bootstrapped.h index bda8ad79168..0b02ecc8ec6 100644 --- a/src/corelib/global/qconfig-bootstrapped.h +++ b/src/corelib/global/qconfig-bootstrapped.h @@ -68,6 +68,13 @@ #define QT_CRYPTOGRAPHICHASH_ONLY_SHA1 #define QT_NO_DATASTREAM +#define QT_FEATURE_alloca 1 +#define QT_FEATURE_alloca_h -1 +#ifdef _WIN32 +# define QT_FEATURE_alloca_malloc_h 1 +#else +# define QT_FEATURE_alloca_malloc_h -1 +#endif #define QT_FEATURE_iconv -1 #define QT_FEATURE_icu -1 #define QT_FEATURE_journald -1