11#[=============================================================================[
2- # CheckTtynameR
2+ Check ttyname_r().
33
4- Check `ttyname_r()`.
5-
6- On Solaris/illumos `ttyname_r()` works only with larger buffers (>= 128),
7- unlike, for example, on Linux and other systems, where buffer size can be any
8- `size_t` size, also < 128. PHP code uses `ttyname_r()` with large buffers, so it
4+ On Solaris/illumos ttyname_r() works only with larger buffers (>= 128), unlike,
5+ for example, on Linux and other systems, where buffer size can be any
6+ 'size_t' size, also < 128. PHP code uses ttyname_r() with large buffers, so it
97wouldn't be necessary to check small buffers but the run check below is kept for
108brevity.
119
1210On modern systems a simpler check is sufficient in the future:
1311
14- ```cmake
15- check_symbol_exists(ttyname_r unistd.h HAVE_TTYNAME_R)
16- ```
17-
18- ## Cache variables
19-
20- * `HAVE_TTYNAME_R`
21-
22- Whether `ttyname_r()` works as expected.
12+ check_symbol_exists(ttyname_r unistd.h HAVE_TTYNAME_R)
2313
24- ## Usage
14+ Result variables:
2515
26- ```cmake
27- # CMakeLists.txt
28- include(cmake/CheckTtynameR.cmake)
29- ```
16+ * HAVE_TTYNAME_R - Whether ttyname_r() works as expected.
3017#]=============================================================================]
3118
3219include_guard (GLOBAL )
@@ -36,6 +23,20 @@ include(CheckSourceRuns)
3623include (CMakePushCheckState)
3724include (PHP/SystemExtensions)
3825
26+ set (HAVE_TTYNAME_R FALSE )
27+
28+ # Skip in consecutive configuration phases.
29+ if (
30+ DEFINED PHP_EXT_POSIX_HAS_TTYNAME_R_PROTOTYPE
31+ OR DEFINED PHP_EXT_POSIX_HAS_TTYNAME_R
32+ )
33+ if (PHP_EXT_POSIX_HAS_TTYNAME_R)
34+ set (HAVE_TTYNAME_R TRUE )
35+ endif ()
36+
37+ return ()
38+ endif ()
39+
3940message (CHECK_START "Checking for working ttyname_r()" )
4041
4142cmake_push_check_state(RESET)
@@ -54,21 +55,21 @@ cmake_push_check_state(RESET)
5455 "int ttyname_r(int fd, char *buf, size_t buflen)"
5556 "0"
5657 "unistd.h"
57- PHP_HAS_TTYNAME_R_PROTOTYPE
58+ PHP_EXT_POSIX_HAS_TTYNAME_R_PROTOTYPE
5859 )
5960
60- if (NOT PHP_HAS_TTYNAME_R_PROTOTYPE )
61+ if (NOT PHP_EXT_POSIX_HAS_TTYNAME_R_PROTOTYPE )
6162 message (CHECK_FAIL "no (non-standard declaration)" )
6263 cmake_pop_check_state()
6364 return ()
6465 endif ()
6566
6667 if (
67- NOT DEFINED HAVE_TTYNAME_R_EXITCODE
68- AND CMAKE_CROSSCOMPILING
68+ CMAKE_CROSSCOMPILING
6969 AND NOT CMAKE_CROSSCOMPILING_EMULATOR
70+ AND NOT DEFINED PHP_EXT_POSIX_HAS_TTYNAME_R_EXITCODE
7071 )
71- set (HAVE_TTYNAME_R_EXITCODE 0)
72+ set (PHP_EXT_POSIX_HAS_TTYNAME_R_EXITCODE 0)
7273 endif ()
7374
7475 # PHP Autotools-based build system check uses a different return below due
@@ -92,8 +93,9 @@ cmake_push_check_state(RESET)
9293
9394 return ttyname_r(0, buf, buflen) ? 1 : 0;
9495 }
95- ]] HAVE_TTYNAME_R)
96- if (HAVE_TTYNAME_R)
96+ ]] PHP_EXT_POSIX_HAS_TTYNAME_R)
97+ if (PHP_EXT_POSIX_HAS_TTYNAME_R)
98+ set (HAVE_TTYNAME_R TRUE )
9799 message (CHECK_PASS "yes" )
98100 else ()
99101 message (CHECK_FAIL "no (posix_ttyname() will be thread-unsafe)" )
0 commit comments