1{
2    "module": "core",
3    "testDir": "../../config.tests",
4
5    "commandline": {
6        "options": {
7            "doubleconversion": { "type": "enum", "values": [ "no", "qt", "system" ] },
8            "eventfd": "boolean",
9            "glib": "boolean",
10            "iconv": { "type": "enum", "values": [ "no", "yes", "posix", "sun", "gnu" ] },
11            "icu": "boolean",
12            "inotify": "boolean",
13            "journald": "boolean",
14            "mimetype-database": "boolean",
15            "pcre": { "type": "enum", "values": [ "no", "qt", "system" ] },
16            "posix-ipc": { "type": "boolean", "name": "ipc_posix" },
17            "pps": { "type": "boolean", "name": "qqnx_pps" },
18            "slog2": "boolean",
19            "syslog": "boolean",
20            "trace": { "type": "optionalString", "values": [ "etw", "lttng", "no", "yes" ] }
21        }
22    },
23
24    "libraries": {
25        "doubleconversion": {
26            "label": "DoubleConversion",
27            "test": {
28                "main": "(void) double_conversion::StringToDoubleConverter::NO_FLAGS;"
29            },
30            "headers": "double-conversion/double-conversion.h",
31            "sources": [
32                "-ldouble-conversion"
33            ]
34        },
35        "glib": {
36            "label": "GLib",
37            "test": {
38                "head": "typedef struct _GMainContext GMainContext;",
39                "main": [
40                    "g_thread_init(NULL);",
41                    "(void) g_main_context_default();",
42                    "(void) g_source_new(0, 0);",
43                    "g_source_add_poll(NULL, NULL);"
44                ]
45            },
46            "headers": "glib.h",
47            "sources": [
48                { "type": "pkgConfig", "args": "glib-2.0 gthread-2.0" }
49            ]
50        },
51        "posix_iconv": {
52            "label": "POSIX iconv",
53            "export": "iconv",
54            "test": {
55                "main": [
56                    "iconv_t x = iconv_open(\"\", \"\");",
57                    "char *inp, *outp;",
58                    "size_t inbytes, outbytes;",
59                    "iconv(x, &inp, &inbytes, &outp, &outbytes);",
60                    "iconv_close(x);"
61                ]
62            },
63            "headers": "iconv.h",
64            "sources": [
65                { "libs": "-liconv", "condition": "config.openbsd || config.haiku" },
66                { "libs": "", "condition": "!(config.openbsd || config.haiku)" }
67            ]
68        },
69        "gnu_iconv": {
70            "label": "GNU libiconv",
71            "export": "iconv",
72            "test": {
73                "main": [
74                    "iconv_t x = iconv_open(\"\", \"\");",
75                    "const char *inp;",
76                    "char *outp;",
77                    "size_t inbytes, outbytes;",
78                    "iconv(x, &inp, &inbytes, &outp, &outbytes);",
79                    "iconv_close(x);"
80                ]
81            },
82            "headers": "iconv.h",
83            "sources": [
84                "-liconv"
85            ]
86        },
87        "sun_iconv": {
88            "label": "SUN libiconv",
89            "export": "iconv",
90            "test": {
91                "inherit": "gnu_iconv"
92            },
93            "sources": [
94                ""
95            ]
96        },
97        "icu": {
98            "label": "ICU",
99            "test": {
100                "main": [
101                    "UErrorCode status = U_ZERO_ERROR;",
102                    "UCollator *collator = ucol_open(\"ru_RU\", &status);",
103                    "if (!U_FAILURE(status))",
104                    "    ucol_close(collator);"
105                ]
106            },
107            "headers": [ "unicode/utypes.h", "unicode/ucol.h", "unicode/ustring.h" ],
108            "sources": [
109                {
110                    "builds": {
111                        "debug": "-lsicuind -lsicuucd -lsicudtd",
112                        "release": "-lsicuin -lsicuuc -lsicudt"
113                    },
114                    "condition": "config.win32 && !features.shared"
115                },
116                { "libs": "-licuin -licuuc -licudt", "condition": "config.win32 && features.shared" },
117                { "libs": "-licui18n -licuuc -licudata", "condition": "!config.win32" }
118            ],
119            "use": [
120                { "lib": "libdl", "condition": "features.dlopen" }
121            ]
122        },
123        "journald": {
124            "label": "journald",
125            "test": {
126                "main": "sd_journal_send(\"PRIORITY=%i\", LOG_INFO, NULL);"
127            },
128            "headers": [ "systemd/sd-journal.h", "syslog.h" ],
129            "sources": [
130                { "type": "pkgConfig", "args": "libsystemd" },
131                { "type": "pkgConfig", "args": "libsystemd-journal" }
132            ]
133        },
134        "libatomic": {
135            "label": "64 bit atomics",
136            "test": {
137                "tail": [
138                    "void test(volatile std::atomic<std::int64_t> &a)",
139                    "{",
140                    "    std::int64_t v = a.load(std::memory_order_acquire);",
141                    "    while (!a.compare_exchange_strong(v, v + 1,",
142                    "                                      std::memory_order_acq_rel,",
143                    "                                      std::memory_order_acquire)) {",
144                    "        v = a.exchange(v - 1);",
145                    "    }",
146                    "    a.store(v + 1, std::memory_order_release);",
147                    "}"
148                ],
149                "main": [
150                    "void *ptr = (void*)0xffffffc0; // any random pointer",
151                    "test(*reinterpret_cast<std::atomic<std::int64_t> *>(ptr));"
152                ],
153                "qmake": "CONFIG += c++11"
154            },
155            "headers": [ "atomic", "cstdint" ],
156            "sources": [
157                "",
158                "-latomic"
159            ]
160        },
161        "librt": {
162            "label": "clock_gettime()",
163            "test": {
164                "main": "timespec ts; clock_gettime(CLOCK_REALTIME, &ts);"
165            },
166            "headers": [ "unistd.h", "time.h" ],
167            "sources": [
168                "",
169                "-lrt"
170            ]
171        },
172        "lttng-ust": {
173            "label": "lttng-ust",
174            "test": {
175                "main": "lttng_session_destroy(nullptr);"
176            },
177            "headers": "lttng/ust-events.h",
178            "sources": [
179                { "type": "pkgConfig", "args": "lttng-ust" },
180                "-llttng-ust"
181            ],
182            "use": "libdl"
183        },
184        "pcre2": {
185            "label": "PCRE2",
186            "test": {
187                "head": "#define PCRE2_CODE_UNIT_WIDTH 16",
188                "tail": [
189                    "#if (PCRE2_MAJOR < 10) || ((PCRE2_MAJOR == 10) && (PCRE2_MINOR < 20))",
190                    "#  error This PCRE version is not supported",
191                    "#endif"
192                ]
193            },
194            "headers": "pcre2.h",
195            "sources": [
196                { "type": "pkgConfig", "args": "libpcre2-16" },
197                "-lpcre2-16"
198            ]
199        },
200        "pps": {
201            "label": "PPS",
202            "test": {
203                "main": [
204                    "pps_decoder_t decoder;",
205                    "pps_decoder_initialize(&decoder, NULL);"
206                ]
207            },
208            "headers": "sys/pps.h",
209            "sources": [
210                "-lpps"
211            ]
212        },
213        "slog2": {
214            "label": "slog2",
215            "test": {
216                "main": "slog2_set_default_buffer((slog2_buffer_t)-1);"
217            },
218            "export": "",
219            "headers": "sys/slog2.h",
220            "sources": [
221                "-lslog2"
222            ]
223        },
224        "advapi32": {
225            "label": "advapi32",
226            "sources": [
227                "-ladvapi32"
228            ]
229        },
230        "gdi32": {
231            "label": "gdi32",
232            "sources": [
233                "-lgdi32"
234            ]
235        },
236        "kernel32": {
237            "label": "kernel32",
238            "sources": [
239                "-lkernel32"
240            ]
241        },
242        "netapi32": {
243            "label": "netapi32",
244            "sources": [
245                "-lnetapi32"
246            ]
247        },
248        "ole32": {
249            "label": "ole32",
250            "sources": [
251                "-lole32"
252            ]
253        },
254        "shell32": {
255            "label": "shell32",
256            "sources": [
257                "-lshell32"
258            ]
259        },
260        "uuid": {
261            "label": "uuid",
262            "sources": [
263                "-luuid"
264            ]
265        },
266        "user32": {
267            "label": "user32",
268            "sources": [
269                "-luser32"
270            ]
271        },
272        "winmm": {
273            "label": "winmm",
274            "sources": [
275                "-lwinmm"
276            ]
277        },
278        "ws2_32": {
279            "label": "ws2_32",
280            "sources": [
281                "-lws2_32"
282            ]
283        }
284    },
285
286    "tests": {
287        "atomicfptr": {
288            "label": "working std::atomic for function pointers",
289            "type": "compile",
290            "test": {
291                "include": "atomic",
292                "tail": [
293                    "typedef void (*fptr)(int);",
294                    "typedef std::atomic<fptr> atomicfptr;",
295                    "void testfunction(int) { }",
296                    "void test(volatile atomicfptr &a)",
297                    "{",
298                    "    fptr v = a.load(std::memory_order_acquire);",
299                    "    while (!a.compare_exchange_strong(v, &testfunction,",
300                    "                                      std::memory_order_acq_rel,",
301                    "                                      std::memory_order_acquire)) {",
302                    "        v = a.exchange(&testfunction);",
303                    "    }",
304                    "    a.store(&testfunction, std::memory_order_release);",
305                    "}"
306                ],
307                "main": [
308                    "atomicfptr fptr(testfunction);",
309                    "test(fptr);"
310                ],
311                "qmake": "CONFIG += c++11"
312            }
313        },
314        "clock-monotonic": {
315            "label": "POSIX monotonic clock",
316            "type": "compile",
317            "test": {
318                "include": [ "unistd.h", "time.h" ],
319                "main": [
320                    "#if defined(_POSIX_MONOTONIC_CLOCK) && (_POSIX_MONOTONIC_CLOCK-0 >= 0)",
321                    "timespec ts;",
322                    "clock_gettime(CLOCK_MONOTONIC, &ts);",
323                    "#else",
324                    "#  error Feature _POSIX_MONOTONIC_CLOCK not available",
325                    "#endif"
326                ]
327            },
328            "use": "librt"
329        },
330        "cloexec": {
331            "label": "O_CLOEXEC",
332            "type": "compile",
333            "test": {
334                "head": "#define _GNU_SOURCE 1",
335                "include": [ "sys/types.h", "sys/socket.h", "fcntl.h", "unistd.h" ],
336                "main": [
337                    "int pipes[2];",
338                    "(void) pipe2(pipes, O_CLOEXEC | O_NONBLOCK);",
339                    "(void) fcntl(0, F_DUPFD_CLOEXEC, 0);",
340                    "(void) dup3(0, 3, O_CLOEXEC);",
341                    "#if defined(__NetBSD__)",
342                    "(void) paccept(0, 0, 0, NULL, SOCK_CLOEXEC | SOCK_NONBLOCK);",
343                    "#else",
344                    "(void) accept4(0, 0, 0, SOCK_CLOEXEC | SOCK_NONBLOCK);",
345                    "#endif"
346                ]
347            }
348        },
349        "cxx11_future": {
350            "label": "C++11 <future>",
351            "type": "compile",
352            "test": {
353                "include": "future",
354                "main": [
355                    "std::future<int> f = std::async([]() { return 42; });",
356                    "(void)f.get();"
357                ],
358                "qmake": "unix:LIBS += -lpthread"
359            }
360        },
361        "cxx11_random": {
362            "label": "C++11 <random>",
363            "type": "compile",
364            "test": {
365                "include": "random",
366                "main": "std::mt19937 mt(0);"
367            }
368        },
369        "eventfd": {
370            "label": "eventfd",
371            "type": "compile",
372            "test": {
373                "include": "sys/eventfd.h",
374                "main": [
375                    "eventfd_t value;",
376                    "int fd = eventfd(0, EFD_CLOEXEC);",
377                    "eventfd_read(fd, &value);",
378                    "eventfd_write(fd, value);"
379                ]
380            }
381        },
382        "futimens": {
383            "label": "futimens()",
384            "type": "compile",
385            "test": {
386                "include": "sys/stat.h",
387                "main": "futimens(-1, 0);",
388                "qmake": [
389                    "# Block futimens() on Apple platforms unless it's available on ALL",
390                    "# deployment targets. This simplifies the logic at the call site",
391                    "# dramatically, as it isn't strictly needed compared to futimes().",
392                    "darwin: QMAKE_CXXFLAGS += -Werror=unguarded-availability -Werror=unguarded-availability-new",
393                    "CONFIG += warn_on"
394                ]
395            }
396        },
397        "futimes": {
398            "label": "futimes()",
399            "type": "compile",
400            "test": {
401                "include": "sys/time.h",
402                "main": "futimes(-1, 0);"
403            }
404        },
405        "getauxval": {
406            "label": "getauxval()",
407            "type": "compile",
408            "test": {
409                "include": "sys/auxv.h",
410                "main": "(void) getauxval(AT_NULL);"
411            }
412        },
413        "getentropy": {
414            "label": "getentropy()",
415            "type": "compile",
416            "test": {
417                "include": "unistd.h",
418                "main": [
419                    "char buf[32];",
420                    "(void) getentropy(buf, sizeof(buf));"
421                ]
422            }
423        },
424        "glibc": {
425            "label": "GNU libc",
426            "type": "compile",
427            "test": {
428                "include": "stdlib.h",
429                "main": [
430                    "return __GLIBC__;"
431                ]
432            }
433        },
434        "inotify": {
435            "label": "inotify",
436            "type": "compile",
437            "test": {
438                "include": "sys/inotify.h",
439                "main": [
440                    "inotify_init();",
441                    "inotify_add_watch(0, \"foobar\", IN_ACCESS);",
442                    "inotify_rm_watch(0, 1);"
443                ]
444            }
445        },
446        "ipc_sysv": {
447            "label": "SysV IPC",
448            "type": "compile",
449            "test": {
450                "include": [ "sys/types.h", "sys/ipc.h", "sys/sem.h", "sys/shm.h", "fcntl.h" ],
451                "main": [
452                    "key_t unix_key = ftok(\"test\", 'Q');",
453                    "semctl(semget(unix_key, 1, 0666 | IPC_CREAT | IPC_EXCL), 0, IPC_RMID, 0);",
454                    "shmget(unix_key, 0, 0666 | IPC_CREAT | IPC_EXCL);",
455                    "shmctl(0, 0, (struct shmid_ds *)(0));"
456                ]
457            }
458        },
459        "ipc_posix": {
460            "label": "POSIX IPC",
461            "type": "compile",
462            "test": {
463                "include": [ "sys/types.h", "sys/mman.h", "semaphore.h", "fcntl.h" ],
464                "main": [
465                    "sem_close(sem_open(\"test\", O_CREAT | O_EXCL, 0666, 0));",
466                    "shm_open(\"test\", O_RDWR | O_CREAT | O_EXCL, 0666);",
467                    "shm_unlink(\"test\");"
468                ],
469                "qmake": "linux: LIBS += -lpthread -lrt"
470            }
471        },
472        "linkat": {
473            "label": "linkat()",
474            "type": "compile",
475            "test": {
476                "head": "#define _ATFILE_SOURCE 1",
477                "include": [ "fcntl.h", "unistd.h" ],
478                "main": "linkat(AT_FDCWD, \"foo\", AT_FDCWD, \"bar\", AT_SYMLINK_FOLLOW);"
479            }
480        },
481        "ppoll": {
482            "label": "ppoll()",
483            "type": "compile",
484            "test": {
485                "include": [ "signal.h", "poll.h" ],
486                "main": [
487                    "struct pollfd pfd;",
488                    "struct timespec ts;",
489                    "sigset_t sig;",
490                    "ppoll(&pfd, 1, &ts, &sig);"
491                ]
492            }
493        },
494        "pollts": {
495            "label": "pollts()",
496            "type": "compile",
497            "test": {
498                "include": [ "poll.h", "signal.h", "time.h" ],
499                "main": [
500                    "struct pollfd pfd;",
501                    "struct timespec ts;",
502                    "sigset_t sig;",
503                    "pollts(&pfd, 1, &ts, &sig);"
504                ]
505            }
506        },
507        "poll": {
508            "label": "poll()",
509            "type": "compile",
510            "test": {
511                "include": "poll.h",
512                "main": [
513                    "struct pollfd pfd;",
514                    "poll(&pfd, 1, 0);"
515                ]
516            }
517        },
518        "renameat2": {
519            "label": "renameat2()",
520            "type": "compile",
521            "test": {
522                "head": "#define _ATFILE_SOURCE 1",
523                "include": [ "fcntl.h", "stdio.h" ],
524                "main": "renameat2(AT_FDCWD, argv[1], AT_FDCWD, argv[2], RENAME_NOREPLACE | RENAME_WHITEOUT);"
525            }
526        },
527        "statx": {
528            "label": "statx() in libc",
529            "type": "compile",
530            "test": {
531                "head": "#define _ATFILE_SOURCE 1",
532                "include": [ "sys/types.h", "sys/stat.h", "unistd.h", "fcntl.h" ],
533                "main": [
534                    "struct statx statxbuf;",
535                    "unsigned int mask = STATX_BASIC_STATS;",
536                    "return statx(AT_FDCWD, \"\", AT_STATX_SYNC_AS_STAT, mask, &statxbuf);"
537                ]
538            }
539        },
540        "syslog": {
541            "label": "syslog",
542            "type": "compile",
543            "test": {
544                "include": "syslog.h",
545                "main": [
546                    "openlog(\"qt\", 0, LOG_USER);",
547                    "syslog(LOG_INFO, \"configure\");",
548                    "closelog();"
549                ]
550            }
551        },
552        "xlocalescanprint": {
553            "label": "xlocale.h (or equivalents)",
554            "type": "compile",
555            "test": {
556                "files": {
557                    "qglobal.h": [
558                        "#ifndef QGLOBAL_H",
559                        "#define QGLOBAL_H",
560                        "#endif"
561                    ]
562                },
563                "tail": [
564                    "#define QT_BEGIN_NAMESPACE",
565                    "#define QT_END_NAMESPACE",
566                    "",
567                    "#ifdef _MSVC_VER",
568                    "#define Q_CC_MSVC _MSVC_VER",
569                    "#endif",
570                    "",
571                    "#define QT_NO_DOUBLECONVERSION",
572                    "",
573                    "#include QDSP_P_H"
574                ],
575                "main": [
576                    "#ifdef _MSVC_VER",
577                    "_locale_t invalidLocale = NULL;",
578                    "#else",
579                    "locale_t invalidLocale = NULL;",
580                    "#endif",
581                    "double a = 3.4;",
582                    "qDoubleSnprintf(argv[0], 1, invalidLocale, \"invalid format\", a);",
583                    "qDoubleSscanf(argv[0], invalidLocale, \"invalid format\", &a, &argc);"
584                ],
585                "qmake": "DEFINES += QDSP_P_H=$$shell_quote(\\\"@PWD@/text/qdoublescanprint_p.h\\\")"
586            }
587        }
588    },
589
590    "features": {
591        "clock-gettime": {
592            "label": "clock_gettime()",
593            "condition": "config.unix && libs.librt",
594            "output": [ "privateFeature" ]
595        },
596        "clock-monotonic": {
597            "label": "POSIX monotonic clock",
598            "condition": "features.clock-gettime && tests.clock-monotonic",
599            "output": [ "feature" ]
600        },
601        "doubleconversion": {
602            "label": "DoubleConversion",
603            "output": [ "privateFeature", "feature" ]
604        },
605        "system-doubleconversion": {
606            "label": "  Using system DoubleConversion",
607            "enable": "input.doubleconversion == 'system'",
608            "disable": "input.doubleconversion == 'qt'",
609            "condition": "features.doubleconversion && libs.doubleconversion",
610            "output": [ "privateFeature" ]
611        },
612        "cxx11_future": {
613            "label": "C++11 <future>",
614            "condition": "tests.cxx11_future",
615            "output": [ "publicFeature" ]
616        },
617        "eventfd": {
618            "label": "eventfd",
619            "condition": "!config.wasm && tests.eventfd",
620            "output": [ "feature" ]
621        },
622        "futimens": {
623            "label": "futimens()",
624            "condition": "!config.win32 && tests.futimens",
625            "output": [ "privateFeature" ]
626        },
627        "futimes": {
628            "label": "futimes()",
629            "condition": "!config.win32 && !features.futimens && tests.futimes",
630            "output": [ "privateFeature" ]
631        },
632        "getauxval": {
633            "label": "getauxval()",
634            "condition": "config.linux && tests.getauxval",
635            "output": [ "privateFeature" ]
636        },
637        "getentropy": {
638            "label": "getentropy()",
639            "condition": "config.unix && tests.getentropy",
640            "output": [ "privateFeature" ]
641        },
642        "glib": {
643            "label": "GLib",
644            "autoDetect": "!config.win32",
645            "condition": "libs.glib",
646            "output": [ "privateFeature", "feature" ]
647        },
648        "glibc": {
649            "label": "GNU libc",
650            "autoDetect": "config.linux",
651            "condition": "tests.glibc",
652            "output": [ "privateFeature" ]
653        },
654        "iconv": {
655            "label": "iconv",
656            "purpose": "Provides internationalization on Unix.",
657            "section": "Internationalization",
658            "condition": "!features.icu && features.textcodec && (features.posix-libiconv || features.sun-libiconv || features.gnu-libiconv)",
659            "output": [ "privateFeature", "feature" ]
660        },
661        "posix-libiconv": {
662            "label": "POSIX iconv",
663            "enable": "input.iconv == 'posix'",
664            "disable": "input.iconv == 'sun' || input.iconv == 'gnu' || input.iconv == 'no'",
665            "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && libs.posix_iconv",
666            "output": [ "privateFeature" ]
667        },
668        "sun-libiconv": {
669            "label": "SUN iconv",
670            "enable": "input.iconv == 'sun'",
671            "disable": "input.iconv == 'posix' || input.iconv == 'gnu' || input.iconv == 'no'",
672            "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && !features.posix-libiconv && libs.sun_iconv"
673        },
674        "gnu-libiconv": {
675            "label": "GNU iconv",
676            "enable": "input.iconv == 'gnu'",
677            "disable": "input.iconv == 'posix' || input.iconv == 'sun' || input.iconv == 'no'",
678            "condition": "!config.win32 && !config.qnx && !config.android && !config.darwin && !features.posix-libiconv && !features.sun-libiconv && libs.gnu_iconv",
679            "output": [ "privateFeature" ]
680        },
681        "icu": {
682            "label": "ICU",
683            "autoDetect": "!config.win32",
684            "condition": "libs.icu",
685            "output": [ "privateFeature" ]
686        },
687        "inotify": {
688            "label": "inotify",
689            "condition": "tests.inotify",
690            "output": [ "privateFeature", "feature" ]
691        },
692        "ipc_posix": {
693            "label": "Using POSIX IPC",
694            "autoDetect": "!config.win32",
695            "condition": "!tests.ipc_sysv && tests.ipc_posix",
696            "output": [ { "type": "define", "name": "QT_POSIX_IPC" } ]
697        },
698        "journald": {
699            "label": "journald",
700            "autoDetect": false,
701            "condition": "libs.journald",
702            "output": [ "privateFeature" ]
703        },
704        "linkat": {
705            "label": "linkat()",
706            "comment": "Currently only used by QTemporaryFile; linkat() exists on Android, but hardlink creation fails due to security rules",
707            "autoDetect": "config.linux && !config.android",
708            "condition": "tests.linkat",
709            "output": [ "privateFeature" ]
710        },
711        "std-atomic64": {
712            "label": "64 bit atomic operations",
713            "condition": "libs.libatomic",
714            "output": [ "publicFeature" ]
715        },
716        "mimetype": {
717            "label": "Mimetype handling",
718            "purpose": "Provides MIME type handling.",
719            "section": "Utilities",
720            "condition": "features.textcodec",
721            "output": [ "publicFeature", "feature" ]
722        },
723        "mimetype-database": {
724            "label": "Built-in copy of the MIME database",
725            "condition": "features.mimetype",
726            "output": [ "privateFeature" ]
727        },
728        "pcre2": {
729            "label": "PCRE2",
730            "disable": "input.pcre == 'no'",
731            "enable": "input.pcre == 'qt' || features.system-pcre2",
732            "output": [ "privateConfig" ]
733        },
734        "system-pcre2": {
735            "label": "  Using system PCRE2",
736            "disable": "input.pcre == 'no' || input.pcre == 'qt'",
737            "enable": "input.pcre == 'system'",
738            "condition": "libs.pcre2",
739            "output": [ "privateFeature" ]
740        },
741        "poll_ppoll": {
742            "label": "Native ppoll()",
743            "emitIf": "!config.win32",
744            "condition": "!config.wasm && tests.ppoll",
745            "output": [ "privateFeature" ]
746        },
747        "poll_pollts": {
748            "label": "Native pollts()",
749            "emitIf": "!config.win32",
750            "condition": "!features.poll_ppoll && tests.pollts",
751            "output": [ "privateFeature" ]
752        },
753        "poll_poll": {
754            "label": "Native poll()",
755            "emitIf": "!config.win32",
756            "condition": "!features.poll_ppoll && !features.poll_pollts && tests.poll",
757            "output": [ "privateFeature" ]
758        },
759        "poll_select": {
760            "label": "Emulated poll()",
761            "emitIf": "!config.win32",
762            "condition": "!features.poll_ppoll && !features.poll_pollts && !features.poll_poll",
763            "output": [
764                "privateFeature",
765                { "type": "define", "name": "QT_NO_NATIVE_POLL" }
766            ]
767        },
768        "qqnx_pps": {
769            "label": "PPS",
770            "emitIf": "config.qnx",
771            "condition": "libs.pps",
772            "output": [ "privateFeature" ]
773        },
774        "qeventtransition": {
775            "label": "QEventTransition class",
776            "condition": "features.statemachine",
777            "output": [ "publicFeature" ]
778        },
779        "renameat2": {
780            "label": "renameat2()",
781            "condition": "config.linux && tests.renameat2",
782            "output": [ "privateFeature" ]
783        },
784        "slog2": {
785            "label": "slog2",
786            "condition": "libs.slog2",
787            "output": [ "privateFeature" ]
788        },
789        "statx": {
790            "label": "statx() in libc",
791            "condition": "config.linux && tests.statx",
792            "output": [ "privateFeature" ]
793        },
794        "syslog": {
795            "label": "syslog",
796            "autoDetect": false,
797            "condition": "tests.syslog",
798            "output": [ "privateFeature" ]
799        },
800        "threadsafe-cloexec": {
801            "label": "Threadsafe pipe creation",
802            "condition": "tests.cloexec",
803            "output": [
804                "publicQtConfig",
805                { "type": "define", "name": "QT_THREADSAFE_CLOEXEC", "value": 1 }
806            ]
807        },
808        "properties": {
809            "label": "Properties",
810            "purpose": "Supports scripting Qt-based applications.",
811            "section": "Kernel",
812            "output": [ "publicFeature", "feature" ]
813        },
814        "regularexpression": {
815            "label": "QRegularExpression",
816            "purpose": "Provides an API to Perl-compatible regular expressions.",
817            "section": "Kernel",
818            "condition": "features.system-pcre2 || features.pcre2",
819            "output": [ "publicFeature", "feature" ]
820        },
821        "sharedmemory": {
822            "label": "QSharedMemory",
823            "purpose": "Provides access to a shared memory segment.",
824            "section": "Kernel",
825            "condition": [
826                "config.android || config.win32 || (!config.vxworks && (tests.ipc_sysv || tests.ipc_posix))"
827            ],
828            "output": [ "publicFeature", "feature" ]
829        },
830        "systemsemaphore": {
831            "label": "QSystemSemaphore",
832            "purpose": "Provides a general counting system semaphore.",
833            "section": "Kernel",
834            "condition": [
835                "!config.integrity && !config.vxworks && !config.rtems",
836                "config.android || config.win32 || tests.ipc_sysv || tests.ipc_posix"
837            ],
838            "output": [ "publicFeature", "feature" ]
839        },
840        "xmlstream": {
841            "label": "XML Streaming APIs",
842            "purpose": "Provides a simple streaming API for XML.",
843            "section": "Kernel",
844            "output": [ "publicFeature", "feature" ]
845        },
846        "xmlstreamreader": {
847            "label": "QXmlStreamReader",
848            "purpose": "Provides a well-formed XML parser with a simple streaming API.",
849            "section": "Kernel",
850            "condition": "features.xmlstream",
851            "output": [ "publicFeature", "feature" ]
852        },
853        "xmlstreamwriter": {
854            "label": "QXmlStreamWriter",
855            "purpose": "Provides a XML writer with a simple streaming API.",
856            "section": "Kernel",
857            "condition": "features.xmlstream",
858            "output": [ "publicFeature", "feature" ]
859        },
860        "textdate": {
861            "label": "Text Date",
862            "purpose": "Supports month and day names in dates.",
863            "section": "Data structures",
864            "output": [ "publicFeature", "feature" ]
865        },
866        "datestring": {
867            "label": "QDate/QTime/QDateTime",
868            "purpose": "Provides conversion between dates and strings.",
869            "section": "Data structures",
870            "condition": "features.textdate",
871            "output": [ "publicFeature", "feature" ]
872        },
873        "process": {
874            "label": "QProcess",
875            "purpose": "Supports external process invocation.",
876            "section": "File I/O",
877            "condition": "features.processenvironment && !config.winrt && !config.uikit && !config.integrity && !config.vxworks && !config.rtems",
878            "output": [ "publicFeature", "feature" ]
879        },
880        "processenvironment": {
881            "label": "QProcessEnvironment",
882            "purpose": "Provides a higher-level abstraction of environment variables.",
883            "section": "File I/O",
884            "condition": "!config.winrt && !config.integrity && !config.rtems",
885            "output": [ "publicFeature" ]
886        },
887        "temporaryfile": {
888            "label": "QTemporaryFile",
889            "purpose": "Provides an I/O device that operates on temporary files.",
890            "section": "File I/O",
891            "output": [ "publicFeature", "feature" ]
892        },
893        "library": {
894            "label": "QLibrary",
895            "purpose": "Provides a wrapper for dynamically loaded libraries.",
896            "section": "File I/O",
897            "condition": "config.win32 || config.hpux || (!config.nacl && features.dlopen)",
898            "output": [ "publicFeature", "feature" ]
899        },
900        "settings": {
901            "label": "QSettings",
902            "purpose": "Provides persistent application settings.",
903            "section": "File I/O",
904            "output": [ "publicFeature", "feature" ]
905        },
906        "filesystemwatcher": {
907            "label": "QFileSystemWatcher",
908            "purpose": "Provides an interface for monitoring files and directories for modifications.",
909            "section": "File I/O",
910            "condition": "!config.winrt",
911            "output": [ "publicFeature", "feature" ]
912        },
913        "filesystemiterator": {
914            "label": "QFileSystemIterator",
915            "purpose": "Provides fast file system iteration.",
916            "section": "File I/O",
917            "output": [ "publicFeature", "feature" ]
918        },
919        "itemmodel": {
920            "label": "Qt Item Model",
921            "purpose": "Provides the item model for item views",
922            "section": "ItemViews",
923            "output": [ "publicFeature", "feature" ]
924        },
925        "proxymodel": {
926            "label": "QAbstractProxyModel",
927            "purpose": "Supports processing of data passed between another model and a view.",
928            "section": "ItemViews",
929            "condition": "features.itemmodel",
930            "output": [ "publicFeature", "feature" ]
931        },
932        "sortfilterproxymodel": {
933            "label": "QSortFilterProxyModel",
934            "purpose": "Supports sorting and filtering of data passed between another model and a view.",
935            "section": "ItemViews",
936            "condition": "features.proxymodel",
937            "output": [ "publicFeature", "feature" ]
938        },
939        "identityproxymodel": {
940            "label": "QIdentityProxyModel",
941            "purpose": "Supports proxying a source model unmodified.",
942            "section": "ItemViews",
943            "condition": "features.proxymodel",
944            "output": [ "publicFeature", "feature" ]
945        },
946        "transposeproxymodel": {
947            "label": "QTransposeProxyModel",
948            "purpose": "Provides a proxy to swap rows and columns of a model.",
949            "section": "ItemViews",
950            "condition": "features.proxymodel",
951            "output": [ "publicFeature", "feature" ]
952        },
953        "concatenatetablesproxymodel": {
954            "label": "QConcatenateTablesProxyModel",
955            "purpose": "Supports concatenating source models.",
956            "section": "ItemViews",
957            "condition": "features.proxymodel",
958            "output": [ "publicFeature", "feature" ]
959        },
960        "stringlistmodel": {
961            "label": "QStringListModel",
962            "purpose": "Provides a model that supplies strings to views.",
963            "section": "ItemViews",
964            "condition": "features.itemmodel",
965            "output": [ "publicFeature", "feature" ]
966        },
967        "translation": {
968            "label": "Translation",
969            "purpose": "Supports translations using QObject::tr().",
970            "section": "Internationalization",
971            "output": [ "publicFeature", "feature" ]
972        },
973        "textcodec": {
974            "label": "QTextCodec",
975            "purpose": "Supports conversions between text encodings.",
976            "section": "Internationalization",
977            "output": [ "publicFeature", "feature" ]
978        },
979        "codecs": {
980            "label": "Codecs",
981            "purpose": "Supports non-unicode text conversions.",
982            "section": "Internationalization",
983            "condition": "features.textcodec",
984            "output": [ "publicFeature", "feature" ]
985        },
986        "big_codecs": {
987            "label": "Big Codecs",
988            "purpose": "Supports big codecs, e.g. CJK.",
989            "section": "Internationalization",
990            "condition": "features.textcodec",
991            "output": [ "publicFeature", "feature" ]
992        },
993        "easingcurve": {
994            "label": "Easing curve",
995            "purpose": "Provides easing curve.",
996            "section": "Utilities",
997            "output": [ "publicFeature" ]
998        },
999        "animation": {
1000            "label": "Animation",
1001            "purpose": "Provides a framework for animations.",
1002            "section": "Utilities",
1003            "condition": "features.properties && features.easingcurve",
1004            "output": [ "publicFeature", "feature" ]
1005        },
1006        "statemachine": {
1007            "label": "State machine",
1008            "purpose": "Provides hierarchical finite state machines.",
1009            "section": "Utilities",
1010            "condition": "features.properties",
1011            "output": [ "publicFeature", "feature" ]
1012        },
1013        "gestures": {
1014            "label": "Gesture",
1015            "purpose": "Provides a framework for gestures.",
1016            "section": "Utilities",
1017            "output": [ "publicFeature", "feature" ]
1018        },
1019        "sha3-fast": {
1020            "label": "Speed optimized SHA3",
1021            "purpose": "Optimizes SHA3 for speed instead of size.",
1022            "section": "Utilities",
1023            "output": [ "privateFeature" ]
1024        },
1025        "jalalicalendar": {
1026            "label": "QJalaliCalendar",
1027            "purpose": "Support the Jalali (Persian) calendar",
1028            "section": "Utilities",
1029            "output": [ "publicFeature" ]
1030        },
1031        "hijricalendar": {
1032            "label": "QHijriCalendar",
1033            "purpose": "Generic basis for Islamic calendars, providing shared locale data",
1034            "section": "Utilities",
1035            "output": [ "privateFeature" ]
1036        },
1037        "islamiccivilcalendar": {
1038            "label": "QIslamicCivilCalendar",
1039            "purpose": "Support the Islamic Civil calendar",
1040            "section": "Utilities",
1041            "condition": "features.hijricalendar",
1042            "output": [ "publicFeature" ]
1043        },
1044        "timezone": {
1045            "label": "QTimeZone",
1046            "purpose": "Provides support for time-zone handling.",
1047            "section": "Utilities",
1048            "output": [ "publicFeature" ]
1049        },
1050        "datetimeparser": {
1051            "label": "QDateTimeParser",
1052            "purpose": "Provides support for parsing date-time texts.",
1053            "section": "Utilities",
1054            "output": [ "privateFeature" ]
1055        },
1056        "commandlineparser": {
1057            "label": "QCommandlineParser",
1058            "purpose": "Provides support for command line parsing.",
1059            "section": "Utilities",
1060            "output": [ "publicFeature" ]
1061        },
1062        "lttng": {
1063            "label": "LTTNG",
1064            "autoDetect": false,
1065            "enable": "input.trace == 'lttng' || (input.trace =='yes' && config.linux)",
1066            "disable": "input.trace == 'etw' || input.trace =='no'",
1067            "condition": "config.linux && libs.lttng-ust",
1068            "output": [ "privateFeature" ]
1069        },
1070        "etw": {
1071            "label": "ETW",
1072            "autoDetect": false,
1073            "enable": "input.trace == 'etw' || (input.trace == 'yes' && config.win32)",
1074            "disable": "input.trace == 'lttng' || input.trace == 'no'",
1075            "condition": "config.win32",
1076            "output": [ "privateFeature" ]
1077        },
1078        "topleveldomain": {
1079            "label": "QUrl::topLevelDomain()",
1080            "purpose": "Provides support for extracting the top level domain from URLs.
1081
1082If enabled, a binary dump of the Public Suffix List (http://www.publicsuffix.org,
1083Mozilla License) is included. The data is then also used in QNetworkCookieJar::validateCookie.",
1084            "section": "Utilities",
1085            "output": [ "publicFeature" ]
1086        },
1087        "win32_system_libs": {
1088            "label": "Windows System Libraries",
1089            "condition": "config.win32 && libs.advapi32 && libs.gdi32 && libs.kernel32 && libs.netapi32 && libs.ole32 && libs.shell32 && libs.uuid && libs.user32 && libs.winmm && libs.ws2_32"
1090        },
1091        "cborstreamreader": {
1092            "label": "CBOR stream reading",
1093            "purpose": "Provides support for reading the CBOR binary format.
1094
1095Note that this is required for plugin loading. Qt GUI needs QPA plugins for basic operation.",
1096            "section": "Utilities",
1097            "output": [ "publicFeature" ]
1098        },
1099        "cborstreamwriter": {
1100            "label": "CBOR stream writing",
1101            "purpose": "Provides support for writing the CBOR binary format.",
1102            "section": "Utilities",
1103            "output": [ "publicFeature" ]
1104        },
1105        "binaryjson": {
1106            "label": "Binary JSON (deprecated)",
1107            "purpose": "Provides support for the deprecated binary JSON format.",
1108            "section": "Utilities",
1109            "output": [ "publicFeature" ]
1110        }
1111    },
1112
1113    "report": [
1114        {
1115            "type": "note",
1116            "condition": "features.journald || features.syslog || (config.qnx && features.slog2)",
1117            "message": "journald, syslog or slog2 integration is enabled.
1118If your users intend to develop applications against this build,
1119ensure that the IDEs they use either set QT_FORCE_STDERR_LOGGING to 1
1120or are able to read the logged output from journald, syslog or slog2."
1121        },
1122        {
1123            "type": "error",
1124            "condition": "!tests.cxx11_random",
1125            "message": "C++11 <random> is required and is missing or failed to compile."
1126        },
1127        {
1128            "type": "error",
1129            "condition": "input.doubleconversion == 'no' && !tests.xlocalescanprint",
1130            "message": "Your C library does not provide sscanf_l or snprintf_l.
1131You need to use libdouble-conversion for double/string conversion."
1132        },
1133        {
1134            "type": "error",
1135            "condition": "!tests.atomicfptr",
1136            "message": "detected a std::atomic implementation that fails for function pointers.
1137Please apply the patch corresponding to your Standard Library vendor, found in
1138  qtbase/config.tests/atomicfptr"
1139        },
1140        {
1141            "type": "error",
1142            "condition": [
1143                "config.unix || config.integrity",
1144                "!features.poll_ppoll",
1145                "!features.poll_pollts",
1146                "!features.poll_poll",
1147                "!features.poll_select"
1148            ],
1149            "message": "Qt requires poll(), ppoll(), poll_ts() or select() on this platform"
1150        }
1151    ],
1152
1153    "summary": [
1154        {
1155            "section": "Qt Core",
1156            "entries": [
1157                "doubleconversion",
1158                "system-doubleconversion",
1159                "glib",
1160                "iconv",
1161                "icu",
1162                "mimetype-database",
1163                {
1164                    "message": "Tracing backend",
1165                    "type": "firstAvailableFeature",
1166                    "args": "etw lttng"
1167                },
1168                {
1169                    "section": "Logging backends",
1170                    "entries": [
1171                        "journald", "syslog", "slog2"
1172                    ]
1173                },
1174                {
1175                    "type": "feature",
1176                    "args": "qqnx_pps",
1177                    "condition": "config.qnx"
1178                },
1179                "pcre2",
1180                "system-pcre2"
1181            ]
1182        }
1183    ]
1184}
1185