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