QRandomGenerator: don't internally rely on QT_HAS_INCLUDE
GCC didn't support it until version 5 or 6, so add configure tests for both <random> and <sys/auxv.h>. Normally I'd say "upgrade", but this is too low-level and important a feature. There's a good chance that all our supported compilers have <random> anyway. As for <sys/auxv.h>, it's present on Glibc, Bionic and MUSL, but I don't see it in uClibc (AT_RANDOM is a Linux-specific feature). Change-Id: Ia3e896da908f42939148fffd14c5b2af491f7a77 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This commit is contained in:
parent
4de4051406
commit
0669f71b0c
35
config.tests/unix/cxx11_random/cxx11_random.cpp
Normal file
35
config.tests/unix/cxx11_random/cxx11_random.cpp
Normal file
@ -0,0 +1,35 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 Intel Corporation.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <random>
|
||||
|
||||
int main()
|
||||
{
|
||||
std::mt19937 mt(0);
|
||||
return 0;
|
||||
}
|
1
config.tests/unix/cxx11_random/cxx11_random.pro
Normal file
1
config.tests/unix/cxx11_random/cxx11_random.pro
Normal file
@ -0,0 +1 @@
|
||||
SOURCES = cxx11_random.cpp
|
34
config.tests/unix/sys_auxv/sys_auxv.cpp
Normal file
34
config.tests/unix/sys_auxv/sys_auxv.cpp
Normal file
@ -0,0 +1,34 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2017 Intel Corporation.
|
||||
** Contact: https://www.qt.io/licensing/
|
||||
**
|
||||
** This file is part of the test suite of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
|
||||
** Commercial License Usage
|
||||
** Licensees holding valid commercial Qt licenses may use this file in
|
||||
** accordance with the commercial license agreement provided with the
|
||||
** Software or, alternatively, in accordance with the terms contained in
|
||||
** a written agreement between you and The Qt Company. For licensing terms
|
||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||
** information use the contact form at https://www.qt.io/contact-us.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU
|
||||
** General Public License version 3 as published by the Free Software
|
||||
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||
** included in the packaging of this file. Please review the following
|
||||
** information to ensure the GNU General Public License requirements will
|
||||
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <sys/auxv.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
return getauxval(AT_NULL);
|
||||
}
|
1
config.tests/unix/sys_auxv/sys_auxv.pro
Normal file
1
config.tests/unix/sys_auxv/sys_auxv.pro
Normal file
@ -0,0 +1 @@
|
||||
SOURCES = sys_auxv.cpp
|
@ -138,6 +138,11 @@
|
||||
"type": "compile",
|
||||
"test": "unix/cloexec"
|
||||
},
|
||||
"cxx11_random": {
|
||||
"label": "C++11 <random>",
|
||||
"type": "compile",
|
||||
"test": "unix/cxx11_random"
|
||||
},
|
||||
"eventfd": {
|
||||
"label": "eventfd",
|
||||
"type": "compile",
|
||||
@ -208,6 +213,11 @@
|
||||
"type": "compile",
|
||||
"test": "unix/syslog"
|
||||
},
|
||||
"sys_auxv": {
|
||||
"label": "sys/auxv.h",
|
||||
"type": "compile",
|
||||
"test": "unix/sys_auxv"
|
||||
},
|
||||
"xlocalescanprint": {
|
||||
"label": "xlocale.h (or equivalents)",
|
||||
"type": "compile",
|
||||
@ -242,6 +252,11 @@
|
||||
"condition": "features.doubleconversion && libs.doubleconversion",
|
||||
"output": [ "privateFeature" ]
|
||||
},
|
||||
"cxx11_random": {
|
||||
"label": "C++11 <random>",
|
||||
"condition": "tests.cxx11_random",
|
||||
"output": [ "privateFeature" ]
|
||||
},
|
||||
"eventfd": {
|
||||
"label": "eventfd",
|
||||
"condition": "tests.eventfd",
|
||||
@ -394,6 +409,11 @@
|
||||
"condition": "tests.syslog",
|
||||
"output": [ "privateFeature" ]
|
||||
},
|
||||
"sys_auxv": {
|
||||
"label": "sys/auxv.h",
|
||||
"condition": "config.linux && tests.sys_auxv",
|
||||
"output": [ "privateFeature" ]
|
||||
},
|
||||
"threadsafe-cloexec": {
|
||||
"label": "Threadsafe pipe creation",
|
||||
"condition": "tests.cloexec",
|
||||
@ -630,6 +650,11 @@ If your users intend to develop applications against this build,
|
||||
ensure that the IDEs they use either set QT_LOGGING_TO_CONSOLE to 1
|
||||
or are able to read the logged output from journald, syslog or slog2."
|
||||
},
|
||||
{
|
||||
"type": "warning",
|
||||
"condition": "!config.win32 && !config.darwin && !config.bsd && !features.cxx11_random",
|
||||
"message": "No high-quality PRNG available for QRandomGenerator fallback.\nIf the HW or OS RNG fails, Qt will abort execution."
|
||||
},
|
||||
{
|
||||
"type": "error",
|
||||
"condition": "input.doubleconversion == 'no' && !tests.xlocalescanprint",
|
||||
|
@ -75,6 +75,7 @@
|
||||
#else
|
||||
# define QT_FEATURE_alloca_malloc_h -1
|
||||
#endif
|
||||
#define QT_FEATURE_cxx11_random (QT_HAS_INCLUDE(<random>) ? 1 : -1)
|
||||
#define QT_FEATURE_iconv -1
|
||||
#define QT_FEATURE_icu -1
|
||||
#define QT_FEATURE_journald -1
|
||||
@ -96,6 +97,7 @@
|
||||
#define QT_NO_GEOM_VARIANT
|
||||
#define QT_FEATURE_sharedmemory -1
|
||||
#define QT_FEATURE_systemsemaphore -1
|
||||
#define QT_FEATURE_sys_auxv (QT_HAS_INCLUDE(<sys/auxv.h>) ? 1 : -1)
|
||||
|
||||
#ifdef QT_BUILD_QMAKE
|
||||
#define QT_FEATURE_commandlineparser -1
|
||||
|
@ -46,13 +46,13 @@
|
||||
#include <qthreadstorage.h>
|
||||
#include <private/qsimd_p.h>
|
||||
|
||||
#if QT_HAS_INCLUDE(<random>)
|
||||
#if QT_CONFIG(cxx11_random)
|
||||
# include <random>
|
||||
# include "qdeadlinetimer.h"
|
||||
# include "qhashfunctions.h"
|
||||
#endif
|
||||
|
||||
#if QT_HAS_INCLUDE(<sys/auxv.h>)
|
||||
#if QT_CONFIG(sys_auxv)
|
||||
# include <sys/auxv.h>
|
||||
#endif
|
||||
|
||||
@ -213,7 +213,7 @@ static void fallback_fill(quint32 *ptr, qssize_t left) Q_DECL_NOTHROW
|
||||
// BSDs have arc4random(4) and these work even in chroot(2)
|
||||
arc4random_buf(ptr, left * sizeof(*ptr));
|
||||
}
|
||||
#elif QT_HAS_INCLUDE(<chrono>)
|
||||
#elif QT_CONFIG(cxx11_random)
|
||||
static QBasicAtomicInteger<unsigned> seed = Q_BASIC_ATOMIC_INITIALIZER(0U);
|
||||
static void fallback_update_seed(unsigned value)
|
||||
{
|
||||
|
@ -34,11 +34,11 @@
|
||||
#include <private/qrandom_p.h>
|
||||
|
||||
#include <algorithm>
|
||||
#if QT_HAS_INCLUDE(<random>)
|
||||
#if QT_CONFIG(cxx11_random)
|
||||
# include <random>
|
||||
#endif
|
||||
|
||||
#if QT_HAS_INCLUDE(<random>) || defined(Q_OS_WIN)
|
||||
#if QT_CONFIG(cxx11_random) || defined(Q_OS_BSD4) || defined(Q_OS_WIN)
|
||||
# define HAVE_FALLBACK_ENGINE
|
||||
#endif
|
||||
|
||||
@ -468,7 +468,7 @@ template <typename Engine> void seedStdRandomEngine()
|
||||
|
||||
void tst_QRandomGenerator::seedStdRandomEngines()
|
||||
{
|
||||
#if !QT_HAS_INCLUDE(<random>)
|
||||
#if !QT_CONFIG(cxx11_random)
|
||||
QSKIP("<random> not found");
|
||||
#else
|
||||
seedStdRandomEngine<std::default_random_engine>();
|
||||
@ -511,7 +511,7 @@ void tst_QRandomGenerator::stdUniformIntDistribution_data()
|
||||
|
||||
void tst_QRandomGenerator::stdUniformIntDistribution()
|
||||
{
|
||||
#if !QT_HAS_INCLUDE(<random>)
|
||||
#if !QT_CONFIG(cxx11_random)
|
||||
QSKIP("<random> not found");
|
||||
#else
|
||||
QFETCH(uint, control);
|
||||
@ -580,8 +580,11 @@ void tst_QRandomGenerator::stdUniformIntDistribution()
|
||||
|
||||
void tst_QRandomGenerator::stdGenerateCanonical()
|
||||
{
|
||||
#if !QT_HAS_INCLUDE(<random>)
|
||||
#if !QT_CONFIG(cxx11_random)
|
||||
QSKIP("<random> not found");
|
||||
#elif defined(Q_CC_MSVC) && Q_CC_MSVC < 1900
|
||||
// see https://connect.microsoft.com/VisualStudio/feedback/details/811611
|
||||
QSKIP("MSVC 2013's std::generate_canonical is broken");
|
||||
#else
|
||||
QFETCH(uint, control);
|
||||
setRNGControl(control);
|
||||
@ -631,7 +634,7 @@ void tst_QRandomGenerator::stdUniformRealDistribution_data()
|
||||
|
||||
void tst_QRandomGenerator::stdUniformRealDistribution()
|
||||
{
|
||||
#if !QT_HAS_INCLUDE(<random>)
|
||||
#if !QT_CONFIG(cxx11_random)
|
||||
QSKIP("<random> not found");
|
||||
#else
|
||||
QFETCH(uint, control);
|
||||
@ -665,7 +668,7 @@ void tst_QRandomGenerator::stdUniformRealDistribution()
|
||||
|
||||
void tst_QRandomGenerator::stdRandomDistributions()
|
||||
{
|
||||
#if !QT_HAS_INCLUDE(<random>)
|
||||
#if !QT_CONFIG(cxx11_random)
|
||||
QSKIP("<random> not found");
|
||||
#else
|
||||
// just a compile check for some of the distributions, besides
|
||||
|
Loading…
Reference in New Issue
Block a user