xref: /PHP-8.3/ext/standard/config.m4 (revision 868257a3)
1dnl
2dnl Check if flush should be called explicitly after buffered io
3dnl
4AC_CACHE_CHECK([whether flush should be called explicitly after a buffered io], ac_cv_flush_io,[
5AC_RUN_IFELSE([AC_LANG_SOURCE([[
6#include <stdio.h>
7#include <stdlib.h>
8#ifdef HAVE_UNISTD_H
9#include <unistd.h>
10#endif
11#include <string.h>
12
13int main(int argc, char **argv)
14{
15	char *filename = tmpnam(NULL);
16	char buffer[64];
17	int result = 0;
18
19	FILE *fp = fopen(filename, "wb");
20	if (NULL == fp)
21		return 0;
22	fputs("line 1\n", fp);
23	fputs("line 2\n", fp);
24	fclose(fp);
25
26	fp = fopen(filename, "rb+");
27	if (NULL == fp)
28		return 0;
29	fgets(buffer, sizeof(buffer), fp);
30	fputs("line 3\n", fp);
31	rewind(fp);
32	fgets(buffer, sizeof(buffer), fp);
33	if (0 != strcmp(buffer, "line 1\n"))
34		result = 1;
35	fgets(buffer, sizeof(buffer), fp);
36	if (0 != strcmp(buffer, "line 3\n"))
37		result = 1;
38	fclose(fp);
39	unlink(filename);
40
41	exit(result);
42}
43]])],[
44  ac_cv_flush_io=no
45],[
46  ac_cv_flush_io=yes
47],[
48  ac_cv_flush_io=no
49])])
50if test "$ac_cv_flush_io" = "yes"; then
51  AC_DEFINE(HAVE_FLUSHIO, 1, [Define if flush should be called explicitly after a buffered io.])
52fi
53
54PHP_ARG_WITH([external-libcrypt],
55  [for external libcrypt or libxcrypt],
56  [AS_HELP_STRING([--with-external-libcrypt],
57    [Use external libcrypt or libxcrypt])],
58  [no],
59  [no])
60
61if test "$PHP_EXTERNAL_LIBCRYPT" != "no"; then
62  PHP_CHECK_FUNC(crypt, crypt)
63  PHP_CHECK_FUNC(crypt_r, crypt)
64  AC_CHECK_HEADERS(crypt.h)
65  if test "$ac_cv_func_crypt_r" = "yes"; then
66    PHP_CRYPT_R_STYLE
67  fi
68
69  AC_CACHE_CHECK(for standard DES crypt, ac_cv_crypt_des,[
70    AC_RUN_IFELSE([AC_LANG_SOURCE([[
71#include <string.h>
72
73#if HAVE_UNISTD_H
74#include <unistd.h>
75#endif
76
77#if HAVE_CRYPT_H
78#include <crypt.h>
79#endif
80
81#include <stdlib.h>
82#include <string.h>
83
84int main(void) {
85#if HAVE_CRYPT
86	char *encrypted = crypt("rasmuslerdorf","rl");
87	return !encrypted || strcmp(encrypted,"rl.3StKT.4T8M");
88#else
89	return 1;
90#endif
91}]])],[
92  ac_cv_crypt_des=yes
93],[
94  ac_cv_crypt_des=no
95],[
96  ac_cv_crypt_des=yes
97])])
98
99  AC_CACHE_CHECK(for extended DES crypt, ac_cv_crypt_ext_des,[
100    AC_RUN_IFELSE([AC_LANG_SOURCE([[
101#include <string.h>
102
103#if HAVE_UNISTD_H
104#include <unistd.h>
105#endif
106
107#if HAVE_CRYPT_H
108#include <crypt.h>
109#endif
110
111#include <stdlib.h>
112#include <string.h>
113
114int main(void) {
115#if HAVE_CRYPT
116	char *encrypted = crypt("rasmuslerdorf","_J9..rasm");
117	return !encrypted || strcmp(encrypted,"_J9..rasmBYk8r9AiWNc");
118#else
119	return 1;
120#endif
121}]])],[
122    ac_cv_crypt_ext_des=yes
123  ],[
124    ac_cv_crypt_ext_des=no
125  ],[
126    ac_cv_crypt_ext_des=no
127  ])])
128
129  AC_CACHE_CHECK(for MD5 crypt, ac_cv_crypt_md5,[
130  AC_RUN_IFELSE([AC_LANG_SOURCE([[
131#include <string.h>
132
133#if HAVE_UNISTD_H
134#include <unistd.h>
135#endif
136
137#if HAVE_CRYPT_H
138#include <crypt.h>
139#endif
140
141#include <stdlib.h>
142#include <string.h>
143
144int main(void) {
145#if HAVE_CRYPT
146	char salt[15], answer[40];
147	char *encrypted;
148
149	salt[0]='$'; salt[1]='1'; salt[2]='$';
150	salt[3]='r'; salt[4]='a'; salt[5]='s';
151	salt[6]='m'; salt[7]='u'; salt[8]='s';
152	salt[9]='l'; salt[10]='e'; salt[11]='$';
153	salt[12]='\0';
154	strcpy(answer,salt);
155	strcat(answer,"rISCgZzpwk3UhDidwXvin0");
156	encrypted = crypt("rasmuslerdorf",salt);
157	return !encrypted || strcmp(encrypted,answer);
158#else
159	return 1;
160#endif
161}]])],[
162    ac_cv_crypt_md5=yes
163  ],[
164    ac_cv_crypt_md5=no
165  ],[
166    ac_cv_crypt_md5=no
167  ])])
168
169  AC_CACHE_CHECK(for Blowfish crypt, ac_cv_crypt_blowfish,[
170  AC_RUN_IFELSE([AC_LANG_SOURCE([[
171#include <string.h>
172
173#if HAVE_UNISTD_H
174#include <unistd.h>
175#endif
176
177#if HAVE_CRYPT_H
178#include <crypt.h>
179#endif
180
181#include <stdlib.h>
182#include <string.h>
183
184int main(void) {
185#if HAVE_CRYPT
186	char salt[30], answer[70];
187	char *encrypted;
188
189	salt[0]='$'; salt[1]='2'; salt[2]='a'; salt[3]='$'; salt[4]='0'; salt[5]='7'; salt[6]='$'; salt[7]='\0';
190	strcat(salt,"rasmuslerd............");
191	strcpy(answer,salt);
192	strcpy(&answer[29],"nIdrcHdxcUxWomQX9j6kvERCFjTg7Ra");
193	encrypted = crypt("rasmuslerdorf",salt);
194	return !encrypted || strcmp(encrypted,answer);
195#else
196	return 1;
197#endif
198}]])],[
199    ac_cv_crypt_blowfish=yes
200  ],[
201    ac_cv_crypt_blowfish=no
202  ],[
203    ac_cv_crypt_blowfish=no
204  ])])
205
206  AC_CACHE_CHECK(for SHA512 crypt, ac_cv_crypt_sha512,[
207  AC_RUN_IFELSE([AC_LANG_SOURCE([[
208#include <string.h>
209
210#if HAVE_UNISTD_H
211#include <unistd.h>
212#endif
213
214#if HAVE_CRYPT_H
215#include <crypt.h>
216#endif
217
218#include <stdlib.h>
219#include <string.h>
220
221int main(void) {
222#if HAVE_CRYPT
223	char salt[21], answer[21+86];
224	char *encrypted;
225
226	strcpy(salt,"\$6\$rasmuslerdorf\$");
227	strcpy(answer, salt);
228	strcat(answer, "EeHCRjm0bljalWuALHSTs1NB9ipEiLEXLhYeXdOpx22gmlmVejnVXFhd84cEKbYxCo.XuUTrW.RLraeEnsvWs/");
229	encrypted = crypt("rasmuslerdorf",salt);
230	return !encrypted || strcmp(encrypted,answer);
231#else
232	return 1;
233#endif
234  }]])],[
235    ac_cv_crypt_sha512=yes
236  ],[
237    ac_cv_crypt_sha512=no
238  ],[
239    ac_cv_crypt_sha512=no
240  ])])
241
242  AC_CACHE_CHECK(for SHA256 crypt, ac_cv_crypt_sha256,[
243  AC_RUN_IFELSE([AC_LANG_SOURCE([[
244#include <string.h>
245
246#if HAVE_UNISTD_H
247#include <unistd.h>
248#endif
249
250#if HAVE_CRYPT_H
251#include <crypt.h>
252#endif
253
254#include <stdlib.h>
255#include <string.h>
256
257int main(void) {
258#if HAVE_CRYPT
259	char salt[21], answer[21+43];
260	char *encrypted;
261
262	strcpy(salt,"\$5\$rasmuslerdorf\$");
263	strcpy(answer, salt);
264	strcat(answer, "cFAm2puLCujQ9t.0CxiFIIvFi4JyQx5UncCt/xRIX23");
265	encrypted = crypt("rasmuslerdorf",salt);
266	return !encrypted || strcmp(encrypted,answer);
267#else
268	return 1;
269#endif
270}]])],[
271    ac_cv_crypt_sha256=yes
272  ],[
273    ac_cv_crypt_sha256=no
274  ],[
275    ac_cv_crypt_sha256=no
276  ])])
277
278
279  if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "$ac_cv_crypt_md5" = "no" || test "$ac_cv_crypt_sha512" = "no" || test "$ac_cv_crypt_sha256" = "no" || test "$ac_cv_func_crypt_r" != "yes"; then
280    AC_MSG_ERROR([Cannot use external libcrypt as some algo are missing])
281  fi
282
283  AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 0, [Whether PHP has to use its own crypt_r])
284else
285  AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 1, [Whether PHP has to use its own crypt_r])
286
287  PHP_ADD_SOURCES(PHP_EXT_DIR(standard), crypt_freesec.c crypt_blowfish.c crypt_sha512.c crypt_sha256.c php_crypt_r.c)
288fi
289
290dnl
291dnl Check for __attribute__ ((__aligned__)) support in the compiler
292dnl
293AC_CACHE_CHECK(whether the compiler supports aligned attribute, ac_cv_attribute_aligned,[
294AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
295]],[[
296  unsigned char test[32] __attribute__ ((__aligned__ (__alignof__ (int))));
297]])],[
298  ac_cv_attribute_aligned=yes
299],[
300  ac_cv_attribute_aligned=no
301])])
302if test "$ac_cv_attribute_aligned" = "yes"; then
303  AC_DEFINE([HAVE_ATTRIBUTE_ALIGNED], 1, [whether the compiler supports __attribute__ ((__aligned__))])
304fi
305
306if test "$cross_compiling" = yes ; then
307  case $host_alias in
308    *linux*)
309      AC_DEFINE([HAVE_FNMATCH], 1,
310		     [Define to 1 if your system has a working POSIX `fnmatch'
311		      function.])
312      ;;
313  esac
314else
315  AC_FUNC_FNMATCH
316fi
317
318dnl
319dnl Check if there is a support means of creating a new process and defining
320dnl which handles it receives
321dnl
322AC_CHECK_FUNCS(fork CreateProcess, [
323  php_can_support_proc_open=yes
324  break
325],[
326  php_can_support_proc_open=no
327])
328AC_MSG_CHECKING([if your OS can spawn processes with inherited handles])
329if test "$php_can_support_proc_open" = "yes"; then
330  AC_MSG_RESULT(yes)
331  AC_DEFINE(PHP_CAN_SUPPORT_PROC_OPEN,1, [Define if your system has fork/vfork/CreateProcess])
332else
333  AC_MSG_RESULT(no)
334fi
335
336PHP_ENABLE_CHROOT_FUNC=no
337case "$PHP_SAPI" in
338  embed)
339    PHP_ENABLE_CHROOT_FUNC=yes
340  ;;
341
342  none)
343    for PROG in $PHP_BINARIES; do
344      case "$PROG" in
345        cgi|cli|phpdbg)
346          PHP_ENABLE_CHROOT_FUNC=yes
347        ;;
348
349        *)
350          PHP_ENABLE_CHROOT_FUNC=no
351          break
352        ;;
353      esac
354   done
355  ;;
356esac
357
358if test "$PHP_ENABLE_CHROOT_FUNC" = "yes"; then
359  AC_DEFINE(ENABLE_CHROOT_FUNC, 1, [Whether to enable chroot() function])
360fi
361
362dnl
363dnl Detect library functions needed by php dns_xxx functions
364dnl ext/standard/php_dns.h will collect these in a single define
365dnl HAVE_FULL_DNS_FUNCS
366dnl
367PHP_CHECK_FUNC(res_nsearch, resolv, bind, socket)
368PHP_CHECK_FUNC(res_ndestroy, resolv, bind, socket)
369PHP_CHECK_FUNC(dns_search, resolv, bind, socket)
370PHP_CHECK_FUNC(dn_expand, resolv, bind, socket)
371PHP_CHECK_FUNC(dn_skipname, resolv, bind, socket)
372
373dnl
374dnl These are old deprecated functions
375dnl
376
377PHP_CHECK_FUNC(res_search, resolv, bind, socket)
378
379PHP_CHECK_FUNC(posix_spawn_file_actions_addchdir_np)
380
381dnl
382dnl Check for strptime()
383dnl
384AC_CACHE_CHECK(whether strptime() declaration fails, ac_cv_strptime_decl_fails,[
385AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
386#include <time.h>
387]],[[
388#ifndef HAVE_STRPTIME
389#error no strptime() on this platform
390#else
391/* use invalid strptime() declaration to see if it fails to compile */
392int strptime(const char *s, const char *format, struct tm *tm);
393#endif
394]])],[
395  ac_cv_strptime_decl_fails=no
396],[
397  ac_cv_strptime_decl_fails=yes
398])])
399if test "$ac_cv_strptime_decl_fails" = "yes"; then
400  AC_DEFINE([HAVE_STRPTIME_DECL_FAILS], 1, [whether strptime() declaration fails])
401fi
402
403dnl
404dnl Check for argon2
405dnl
406PHP_ARG_WITH([password-argon2],
407  [for Argon2 support],
408  [AS_HELP_STRING([[--with-password-argon2]],
409    [Include Argon2 support in password_*])])
410
411if test "$PHP_PASSWORD_ARGON2" != "no"; then
412  PKG_CHECK_MODULES([ARGON2], [libargon2])
413  PHP_EVAL_INCLINE($ARGON2_CFLAGS)
414  PHP_EVAL_LIBLINE($ARGON2_LIBS)
415
416  AC_DEFINE(HAVE_ARGON2LIB, 1, [ ])
417fi
418
419dnl
420dnl net_get_interfaces
421dnl
422AC_CHECK_HEADERS([net/if.h],[], [],
423[
424  #ifdef HAVE_SYS_SOCKET_H
425  #include <sys/socket.h>
426  #endif
427  #include <net/if.h>
428])
429AC_MSG_CHECKING([for usable getifaddrs])
430AC_LINK_IFELSE([AC_LANG_PROGRAM([[
431  #include <sys/types.h>
432  #include <ifaddrs.h>
433]],[[
434  struct ifaddrs *interfaces;
435  if (!getifaddrs(&interfaces)) {
436      freeifaddrs(interfaces);
437  }
438]])], [ac_have_getifaddrs=yes], [ac_have_getifaddrs=no])
439if test "$ac_have_getifaddrs" = "yes" ; then
440  AC_DEFINE(HAVE_GETIFADDRS, 1, [whether getifaddrs is present and usable])
441  AC_MSG_RESULT(yes)
442else
443  AC_MSG_RESULT(no)
444fi
445
446dnl
447dnl Setup extension sources
448dnl
449PHP_NEW_EXTENSION(standard, array.c base64.c basic_functions.c browscap.c crc32.c crypt.c \
450                            datetime.c dir.c dl.c dns.c exec.c file.c filestat.c \
451                            flock_compat.c formatted_print.c fsock.c head.c html.c image.c \
452                            info.c iptc.c link.c mail.c math.c md5.c metaphone.c \
453                            microtime.c pack.c pageinfo.c quot_print.c \
454                            soundex.c string.c scanf.c syslog.c type.c uniqid.c url.c \
455                            var.c versioning.c assert.c strnatcmp.c levenshtein.c \
456                            incomplete_class.c url_scanner_ex.c ftp_fopen_wrapper.c \
457                            http_fopen_wrapper.c php_fopen_wrapper.c credits.c css.c \
458                            var_unserializer.c ftok.c sha1.c user_filters.c uuencode.c \
459                            filters.c proc_open.c streamsfuncs.c http.c password.c \
460                            net.c hrtime.c crc32_x86.c libavifinfo/avifinfo.c,,,
461			    -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
462
463PHP_ADD_BUILD_DIR($ext_builddir/libavifinfo)
464
465PHP_ADD_MAKEFILE_FRAGMENT
466PHP_INSTALL_HEADERS([ext/standard/])
467