Skip to content

Commit 1a58946

Browse files
committed
Merge branch 'PHP-8.3'
2 parents 75a62f1 + 6651967 commit 1a58946

File tree

11 files changed

+176
-133
lines changed

11 files changed

+176
-133
lines changed

cmake/cmake/Flags.cmake

Lines changed: 85 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,8 @@ if(PHP_ADDRESS_SANITIZER)
283283
cmake_push_check_state(RESET)
284284
set(CMAKE_REQUIRED_LINK_OPTIONS "-fsanitize=address")
285285

286-
php_check_compiler_flag(C "-fsanitize=address" HAVE_ADDRESS_SANITIZER_C)
287-
php_check_compiler_flag(CXX "-fsanitize=address" HAVE_ADDRESS_SANITIZER_CXX)
286+
php_check_compiler_flag(C -fsanitize=address HAVE_ADDRESS_SANITIZER_C)
287+
php_check_compiler_flag(CXX -fsanitize=address HAVE_ADDRESS_SANITIZER_CXX)
288288
cmake_pop_check_state()
289289

290290
if(HAVE_ADDRESS_SANITIZER_C AND HAVE_ADDRESS_SANITIZER_CXX)
@@ -320,8 +320,16 @@ if(PHP_UNDEFINED_SANITIZER)
320320
cmake_push_check_state(RESET)
321321
set(CMAKE_REQUIRED_LINK_OPTIONS "-fsanitize=undefined")
322322

323-
php_check_compiler_flag(C "-fsanitize=undefined" HAVE_UNDEFINED_SANITIZER_C)
324-
php_check_compiler_flag(CXX "-fsanitize=undefined" HAVE_UNDEFINED_SANITIZER_CXX)
323+
php_check_compiler_flag(
324+
C
325+
-fsanitize=undefined
326+
HAVE_UNDEFINED_SANITIZER_C
327+
)
328+
php_check_compiler_flag(
329+
CXX
330+
-fsanitize=undefined
331+
HAVE_UNDEFINED_SANITIZER_CXX
332+
)
325333
cmake_pop_check_state()
326334

327335
if(HAVE_UNDEFINED_SANITIZER_C AND HAVE_UNDEFINED_SANITIZER_CXX)
@@ -342,8 +350,16 @@ if(PHP_UNDEFINED_SANITIZER)
342350
cmake_push_check_state(RESET)
343351
set(CMAKE_REQUIRED_LINK_OPTIONS "-fno-sanitize=object-size")
344352

345-
php_check_compiler_flag(C "-fno-sanitize=object-size" HAVE_OBJECT_SIZE_SANITIZER_C)
346-
php_check_compiler_flag(CXX "-fno-sanitize=object-size" HAVE_OBJECT_SIZE_SANITIZER_CXX)
353+
php_check_compiler_flag(
354+
C
355+
-fno-sanitize=object-size
356+
HAVE_OBJECT_SIZE_SANITIZER_C
357+
)
358+
php_check_compiler_flag(
359+
CXX
360+
-fno-sanitize=object-size
361+
HAVE_OBJECT_SIZE_SANITIZER_CXX
362+
)
347363
cmake_pop_check_state()
348364

349365
if(HAVE_OBJECT_SIZE_SANITIZER_C AND HAVE_OBJECT_SIZE_SANITIZER_CXX)
@@ -362,43 +378,60 @@ if(PHP_UNDEFINED_SANITIZER)
362378

363379
# Clang 17 adds stricter function pointer compatibility checks where pointer
364380
# args cannot be cast to void*. In that case, set -fno-sanitize=function.
365-
if(NOT CMAKE_CROSSCOMPILING)
366-
cmake_push_check_state(RESET)
367-
set(
368-
CMAKE_REQUIRED_FLAGS
369-
"-fsanitize=undefined -fno-sanitize-recover=undefined"
381+
if(
382+
NOT DEFINED PHP_HAVE_UBSAN_EXITCODE
383+
AND CMAKE_CROSSCOMPILING
384+
AND NOT CMAKE_CROSSCOMPILING_EMULATOR
385+
AND CMAKE_C_COMPILER_ID STREQUAL "Clang"
386+
AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 17
387+
)
388+
# When cross-compiling without emulator and using Clang 17 and greater,
389+
# assume that -fno-sanitize=function needs to be added.
390+
set(PHP_HAVE_UBSAN_EXITCODE 1)
391+
endif()
392+
393+
cmake_push_check_state(RESET)
394+
set(
395+
CMAKE_REQUIRED_FLAGS
396+
"-fsanitize=undefined -fno-sanitize-recover=undefined"
397+
)
398+
check_source_runs(C [[
399+
void foo(char *string) { (void)string; }
400+
int main(void)
401+
{
402+
void (*f)(void *) = (void (*)(void *))foo;
403+
f("foo");
404+
return 0;
405+
}
406+
]] PHP_HAVE_UBSAN)
407+
cmake_pop_check_state()
408+
409+
if(NOT PHP_HAVE_UBSAN)
410+
php_check_compiler_flag(
411+
C
412+
-fno-sanitize=function
413+
HAVE_FNO_SANITIZE_FUNCTION_C
414+
)
415+
php_check_compiler_flag(
416+
CXX
417+
-fno-sanitize=function
418+
HAVE_FNO_SANITIZE_FUNCTION_CXX
419+
)
420+
421+
if(HAVE_FNO_SANITIZE_FUNCTION_C)
422+
target_compile_options(
423+
php_configuration
424+
INTERFACE
425+
$<$<COMPILE_LANGUAGE:ASM,C>:-fno-sanitize=function>
426+
)
427+
endif()
428+
429+
if(HAVE_FNO_SANITIZE_FUNCTION_CXX)
430+
target_compile_options(
431+
php_configuration
432+
INTERFACE
433+
$<$<COMPILE_LANGUAGE:CXX>:-fno-sanitize=function>
370434
)
371-
check_source_runs(C [[
372-
void foo(char *string) {
373-
(void)string;
374-
}
375-
int main(void) {
376-
void (*f)(void *) = (void (*)(void *))foo;
377-
f("foo");
378-
return 0;
379-
}
380-
]] _php_ubsan_works)
381-
cmake_pop_check_state()
382-
383-
if(NOT _php_ubsan_works)
384-
php_check_compiler_flag(C -fno-sanitize=function HAVE_FNO_SANITIZE_FUNCTION_C)
385-
php_check_compiler_flag(CXX -fno-sanitize=function HAVE_FNO_SANITIZE_FUNCTION_CXX)
386-
387-
if(HAVE_FNO_SANITIZE_FUNCTION_C)
388-
target_compile_options(
389-
php_configuration
390-
INTERFACE
391-
$<$<COMPILE_LANGUAGE:ASM,C>:-fno-sanitize=function>
392-
)
393-
endif()
394-
395-
if(HAVE_FNO_SANITIZE_FUNCTION_CXX)
396-
target_compile_options(
397-
php_configuration
398-
INTERFACE
399-
$<$<COMPILE_LANGUAGE:CXX>:-fno-sanitize=function>
400-
)
401-
endif()
402435
endif()
403436
endif()
404437

@@ -410,8 +443,16 @@ if(PHP_UNDEFINED_SANITIZER)
410443
endif()
411444

412445
if(PHP_MEMORY_SANITIZER OR PHP_ADDRESS_SANITIZER OR PHP_UNDEFINED_SANITIZER)
413-
php_check_compiler_flag(C -fno-omit-frame-pointer HAVE_FNO_OMIT_FRAME_POINTER_C)
414-
php_check_compiler_flag(CXX -fno-omit-frame-pointer HAVE_FNO_OMIT_FRAME_POINTER_CXX)
446+
php_check_compiler_flag(
447+
C
448+
-fno-omit-frame-pointer
449+
HAVE_FNO_OMIT_FRAME_POINTER_C
450+
)
451+
php_check_compiler_flag(
452+
CXX
453+
-fno-omit-frame-pointer
454+
HAVE_FNO_OMIT_FRAME_POINTER_CXX
455+
)
415456

416457
if(HAVE_FNO_OMIT_FRAME_POINTER_C)
417458
target_compile_options(

cmake/cmake/modules/PHP/CheckFnmatch.cmake

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,12 @@ include(CMakePushCheckState)
2222
message(CHECK_START "Checking for a working POSIX fnmatch() function")
2323

2424
if(
25-
NOT DEFINED HAVE_FNMATCH
25+
NOT DEFINED HAVE_FNMATCH_EXITCODE
2626
AND CMAKE_CROSSCOMPILING
2727
AND NOT CMAKE_CROSSCOMPILING_EMULATOR
2828
AND CMAKE_SYSTEM_NAME STREQUAL "Linux"
2929
)
30-
set(
31-
HAVE_FNMATCH 1
32-
CACHE INTERNAL "Define to 1 if system has a working POSIX fnmatch function."
33-
)
30+
set(HAVE_FNMATCH_EXITCODE 0)
3431
endif()
3532

3633
cmake_push_check_state(RESET)

cmake/cmake/modules/PHP/CheckFopencookie.cmake

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,13 @@ endif()
4646
message(CHECK_START "Checking whether fopencookie seeker uses off64_t")
4747

4848
if(
49-
CMAKE_CROSSCOMPILING
49+
NOT DEFINED COOKIE_SEEKER_USES_OFF64_T_EXITCODE
50+
AND CMAKE_CROSSCOMPILING
51+
AND NOT CMAKE_CROSSCOMPILING_EMULATOR
5052
AND CMAKE_SYSTEM_NAME STREQUAL "Linux"
5153
AND PHP_C_STANDARD_LIBRARY STREQUAL "glibc"
5254
)
53-
message(CHECK_PASS "yes (cross-compiling for Linux and GNU C library)")
54-
55-
set(
56-
COOKIE_SEEKER_USES_OFF64_T 1
57-
CACHE INTERNAL "Whether fopencookie seeker uses off64_t"
58-
)
59-
60-
return()
55+
set(COOKIE_SEEKER_USES_OFF64_T_EXITCODE 0)
6156
endif()
6257

6358
cmake_push_check_state(RESET)

cmake/cmake/modules/PHP/CheckGetaddrinfo.cmake

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,12 @@ cmake_push_check_state(RESET)
7171

7272
if(_have_getaddrinfo)
7373
if(
74-
NOT DEFINED HAVE_GETADDRINFO
74+
NOT DEFINED HAVE_GETADDRINFO_EXITCODE
7575
AND CMAKE_CROSSCOMPILING
7676
AND NOT CMAKE_CROSSCOMPILING_EMULATOR
7777
AND CMAKE_SYSTEM_NAME MATCHES "^(Linux|Midipix)$"
7878
)
79-
set(
80-
HAVE_GETADDRINFO 1
81-
CACHE INTERNAL "Define if you have the getaddrinfo() function"
82-
)
79+
set(HAVE_GETADDRINFO_EXITCODE 0)
8380
endif()
8481

8582
check_source_runs(C [[

cmake/cmake/modules/PHP/CheckSHM.cmake

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,20 +117,18 @@ endif()
117117

118118
message(CHECK_START "Checking for mmap() using MAP_ANON shared memory support")
119119

120+
if(
121+
NOT DEFINED HAVE_SHM_MMAP_ANON_EXITCODE
122+
AND CMAKE_CROSSCOMPILING
123+
AND NOT CMAKE_CROSSCOMPILING_EMULATOR
124+
AND CMAKE_SYSTEM_NAME MATCHES "^(Linux|Midipix)$"
125+
)
126+
set(HAVE_SHM_MMAP_ANON_EXITCODE 0)
127+
endif()
128+
120129
cmake_push_check_state(RESET)
121130
set(CMAKE_REQUIRED_QUIET TRUE)
122131

123-
if(
124-
NOT DEFINED HAVE_SHM_MMAP_ANON
125-
AND CMAKE_CROSSCOMPILING
126-
AND NOT CMAKE_CROSSCOMPILING_EMULATOR
127-
AND CMAKE_SYSTEM_NAME MATCHES "^(Linux|Midipix)$"
128-
)
129-
set(
130-
HAVE_SHM_MMAP_ANON 1
131-
CACHE INTERNAL "Whether mmap(MAP_ANON) SHM support is available"
132-
)
133-
endif()
134132
check_source_runs(C [[
135133
#include <sys/types.h>
136134
#include <sys/wait.h>

cmake/cmake/modules/PHP/CheckTtynameR.cmake

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -45,40 +45,43 @@ cmake_push_check_state(RESET)
4545

4646
if(NOT _HAVE_TTYNAME_R)
4747
message(CHECK_FAIL "no (non-standard declaration)")
48-
elseif(
49-
NOT DEFINED HAVE_TTYNAME_R
48+
cmake_pop_check_state()
49+
return()
50+
endif()
51+
52+
if(
53+
NOT DEFINED HAVE_TTYNAME_R_EXITCODE
5054
AND CMAKE_CROSSCOMPILING
5155
AND NOT CMAKE_CROSSCOMPILING_EMULATOR
52-
AND _HAVE_TTYNAME_R
5356
)
54-
set(HAVE_TTYNAME_R TRUE CACHE INTERNAL "Whether ttyname_r() works.")
55-
message(CHECK_PASS "guessing yes (cross-compiling)")
56-
else()
57-
# PHP Autotools-based build system check uses a different return below due
58-
# to Autoconf's configure using the file descriptor 0 which results in an
59-
# error. The file descriptor 0 with CMake script execution is available and
60-
# doesn't result in an error when calling ttyname_r().
61-
check_source_runs(C [[
62-
#include <unistd.h>
57+
set(HAVE_TTYNAME_R_EXITCODE 0)
58+
endif()
6359

64-
int main(void) {
65-
#ifdef _SC_TTY_NAME_MAX
66-
int buflen = sysconf(_SC_TTY_NAME_MAX);
67-
#else
68-
int buflen = 32; /* Small buffers < 128 */
69-
#endif
70-
if (buflen < 1) {
71-
buflen = 32;
72-
}
73-
char buf[buflen];
60+
# PHP Autotools-based build system check uses a different return below due
61+
# to Autoconf's configure using the file descriptor 0 which results in an
62+
# error. The file descriptor 0 with CMake script execution is available and
63+
# doesn't result in an error when calling ttyname_r().
64+
check_source_runs(C [[
65+
#include <unistd.h>
7466

75-
return ttyname_r(0, buf, buflen) ? 1 : 0;
67+
int main(void)
68+
{
69+
#ifdef _SC_TTY_NAME_MAX
70+
int buflen = sysconf(_SC_TTY_NAME_MAX);
71+
#else
72+
int buflen = 32; /* Small buffers < 128 */
73+
#endif
74+
if (buflen < 1) {
75+
buflen = 32;
7676
}
77-
]] HAVE_TTYNAME_R)
78-
if(HAVE_TTYNAME_R)
79-
message(CHECK_PASS "yes")
80-
else()
81-
message(CHECK_FAIL "no (posix_ttyname() will be thread-unsafe)")
82-
endif()
77+
char buf[buflen];
78+
79+
return ttyname_r(0, buf, buflen) ? 1 : 0;
80+
}
81+
]] HAVE_TTYNAME_R)
82+
if(HAVE_TTYNAME_R)
83+
message(CHECK_PASS "yes")
84+
else()
85+
message(CHECK_FAIL "no (posix_ttyname() will be thread-unsafe)")
8386
endif()
8487
cmake_pop_check_state()

cmake/cmake/modules/PHP/CheckWrite.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ include(CMakePushCheckState)
1616
message(CHECK_START "Checking whether writing to stdout works")
1717

1818
if(
19-
NOT DEFINED PHP_WRITE_STDOUT
19+
NOT DEFINED PHP_WRITE_STDOUT_EXITCODE
2020
AND CMAKE_CROSSCOMPILING
2121
AND NOT CMAKE_CROSSCOMPILING_EMULATOR
2222
AND CMAKE_SYSTEM_NAME MATCHES "^(Linux|Midipix)$"
2323
)
24-
set(PHP_WRITE_STDOUT 1 CACHE INTERNAL "Whether write(2) works")
24+
set(PHP_WRITE_STDOUT_EXITCODE 0)
2525
endif()
2626

2727
cmake_push_check_state(RESET)

cmake/cmake/modules/PHP/PositionIndependentCode.cmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ https://cmake.org/cmake/help/latest/variable/CMAKE_POSITION_INDEPENDENT_CODE.htm
55
]=============================================================================]#
66

77
if(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_SIZEOF_VOID_P EQUAL 4)
8-
# On 32-bit Linux and FreeBSD at least when using Clang, the pic is required.
8+
# On 32-bit *nix (Linux and FreeBSD at least) when using Clang, the PIC is
9+
# required.
910
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
1011
else()
1112
# Disable PIC for all targets. PIC is enabled for shared extensions manually.

0 commit comments

Comments
 (0)