xref: /PHP-5.3/ext/standard/config.m4 (revision 84f3b132)
1dnl $Id$ -*- autoconf -*-
2
3divert(3)dnl
4
5dnl
6dnl Check if flush should be called explicitly after buffered io
7dnl
8AC_CACHE_CHECK([whether flush should be called explicitly after a buffered io], ac_cv_flush_io,[
9AC_TRY_RUN( [
10#include <stdio.h>
11#include <stdlib.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
54dnl
55dnl Check for crypt() capabilities
56dnl
57if test "$ac_cv_func_crypt" = "no"; then
58  AC_CHECK_LIB(crypt, crypt, [
59    LIBS="-lcrypt $LIBS -lcrypt"
60    AC_DEFINE(HAVE_CRYPT, 1, [ ])
61  ])
62fi
63
64AC_CACHE_CHECK(for standard DES crypt, ac_cv_crypt_des,[
65  AC_TRY_RUN([
66#if HAVE_UNISTD_H
67#include <unistd.h>
68#endif
69
70#if HAVE_CRYPT_H
71#include <crypt.h>
72#endif
73
74main() {
75#if HAVE_CRYPT
76    exit (strcmp((char *)crypt("rasmuslerdorf","rl"),"rl.3StKT.4T8M"));
77#else
78	exit(0);
79#endif
80}],[
81  ac_cv_crypt_des=yes
82],[
83  ac_cv_crypt_des=no
84],[
85  ac_cv_crypt_des=yes
86])])
87
88AC_CACHE_CHECK(for extended DES crypt, ac_cv_crypt_ext_des,[
89  AC_TRY_RUN([
90#if HAVE_UNISTD_H
91#include <unistd.h>
92#endif
93
94#if HAVE_CRYPT_H
95#include <crypt.h>
96#endif
97
98main() {
99#if HAVE_CRYPT
100  exit (strcmp((char *)crypt("rasmuslerdorf","_J9..rasm"),"_J9..rasmBYk8r9AiWNc"));
101#else
102  exit(0);
103#endif
104}],[
105  ac_cv_crypt_ext_des=yes
106],[
107  ac_cv_crypt_ext_des=no
108],[
109  ac_cv_crypt_ext_des=no
110])])
111
112AC_CACHE_CHECK(for MD5 crypt, ac_cv_crypt_md5,[
113AC_TRY_RUN([
114#if HAVE_UNISTD_H
115#include <unistd.h>
116#endif
117
118#if HAVE_CRYPT_H
119#include <crypt.h>
120#endif
121
122main() {
123#if HAVE_CRYPT
124    char salt[15], answer[40];
125
126    salt[0]='$'; salt[1]='1'; salt[2]='$';
127    salt[3]='r'; salt[4]='a'; salt[5]='s';
128    salt[6]='m'; salt[7]='u'; salt[8]='s';
129    salt[9]='l'; salt[10]='e'; salt[11]='$';
130    salt[12]='\0';
131    strcpy(answer,salt);
132    strcat(answer,"rISCgZzpwk3UhDidwXvin0");
133    exit (strcmp((char *)crypt("rasmuslerdorf",salt),answer));
134#else
135	exit(0);
136#endif
137}],[
138  ac_cv_crypt_md5=yes
139],[
140  ac_cv_crypt_md5=no
141],[
142  ac_cv_crypt_md5=no
143])])
144
145AC_CACHE_CHECK(for Blowfish crypt, ac_cv_crypt_blowfish,[
146AC_TRY_RUN([
147#if HAVE_UNISTD_H
148#include <unistd.h>
149#endif
150
151#if HAVE_CRYPT_H
152#include <crypt.h>
153#endif
154
155main() {
156#if HAVE_CRYPT
157    char salt[30], answer[70];
158
159    salt[0]='$'; salt[1]='2'; salt[2]='a'; salt[3]='$'; salt[4]='0'; salt[5]='7'; salt[6]='$'; salt[7]='\0';
160    strcat(salt,"rasmuslerd............");
161    strcpy(answer,salt);
162    strcpy(&answer[29],"nIdrcHdxcUxWomQX9j6kvERCFjTg7Ra");
163    exit (strcmp((char *)crypt("rasmuslerdorf",salt),answer));
164#else
165	exit(0);
166#endif
167}],[
168  ac_cv_crypt_blowfish=yes
169],[
170  ac_cv_crypt_blowfish=no
171],[
172  ac_cv_crypt_blowfish=no
173])])
174
175AC_CACHE_CHECK(for SHA512 crypt, ac_cv_crypt_SHA512,[
176AC_TRY_RUN([
177#if HAVE_UNISTD_H
178#include <unistd.h>
179#endif
180
181#if HAVE_CRYPT_H
182#include <crypt.h>
183#endif
184
185main() {
186#if HAVE_CRYPT
187    char salt[30], answer[80];
188
189    salt[0]='$'; salt[1]='6'; salt[2]='$'; salt[3]='$'; salt[4]='b'; salt[5]='a'; salt[6]='r'; salt[7]='\0';
190    strcpy(answer, salt);
191    strcpy(&answer[29],"$6$$QMXjqd7rHQZPQ1yHsXkQqC1FBzDiVfTHXL.LaeDAeVV.IzMaV9VU4MQ8kPuZa2SOP1A0RPm772EaFYjpEJtdu.");
192    exit (strcmp((char *)crypt("foo",salt),answer));
193#else
194	exit(0);
195#endif
196}],[
197  ac_cv_crypt_SHA512=yes
198],[
199  ac_cv_crypt_SHA512=no
200],[
201  ac_cv_crypt_SHA512=no
202])])
203
204AC_CACHE_CHECK(for SHA256 crypt, ac_cv_crypt_SHA256,[
205AC_TRY_RUN([
206#if HAVE_UNISTD_H
207#include <unistd.h>
208#endif
209
210#if HAVE_CRYPT_H
211#include <crypt.h>
212#endif
213
214main() {
215#if HAVE_CRYPT
216    char salt[30], answer[80];
217    salt[0]='$'; salt[1]='5'; salt[2]='$'; salt[3]='$'; salt[4]='s'; salt[5]='a'; salt[6]='l'; salt[7]='t';  salt[8]='s'; salt[9]='t'; salt[10]='r'; salt[11]='i'; salt[12]='n'; salt[13]='g'; salt[14]='\0';
218    strcat(salt,"");
219    strcpy(answer, salt);
220    strcpy(&answer[29], "$5$saltstring$5B8vYYiY.CVt1RlTTf8KbXBH3hsxY/GNooZaBBGWEc5");
221    exit (strcmp((char *)crypt("foo",salt),answer));
222#else
223	exit(0);
224#endif
225}],[
226  ac_cv_crypt_SHA256=yes
227],[
228  ac_cv_crypt_SHA256=no
229],[
230  ac_cv_crypt_SHA256=no
231])])
232
233
234dnl
235dnl If one of them is missing, use our own implementation, portable code is then possible
236dnl
237if test "$ac_cv_crypt_blowfish" = "no" || test "$ac_cv_crypt_des" = "no" || test "$ac_cv_crypt_ext_des" = "no" || test "x$php_crypt_r" = "x0"; then
238
239  dnl
240  dnl Check for __alignof__ support in the compiler
241  dnl
242  AC_CACHE_CHECK(whether the compiler supports __alignof__, ac_cv_alignof_exists,[
243  AC_TRY_COMPILE([
244  ],[
245    int align = __alignof__(int);
246  ],[
247    ac_cv_alignof_exists=yes
248  ],[
249    ac_cv_alignof_exists=no
250  ])])
251  if test "$ac_cv_alignof_exists" = "yes"; then
252    AC_DEFINE([HAVE_ALIGNOF], 1, [whether the compiler supports __alignof__])
253  fi
254
255  dnl
256  dnl Check for __attribute__ ((__aligned__)) support in the compiler
257  dnl
258  AC_CACHE_CHECK(whether the compiler supports aligned attribute, ac_cv_attribute_aligned,[
259  AC_TRY_COMPILE([
260  ],[
261    unsigned char test[32] __attribute__ ((__aligned__ (__alignof__ (int))));
262  ],[
263    ac_cv_attribute_aligned=yes
264  ],[
265    ac_cv_attribute_aligned=no
266  ])])
267  if test "$ac_cv_attribute_aligned" = "yes"; then
268    AC_DEFINE([HAVE_ATTRIBUTE_ALIGNED], 1, [whether the compiler supports __attribute__ ((__aligned__))])
269  fi
270
271
272  AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 1, [Whether PHP has to use its own crypt_r for blowfish, des, ext des and md5])
273  AC_DEFINE_UNQUOTED(PHP_STD_DES_CRYPT, 1, [Whether the system supports standard DES salt])
274  AC_DEFINE_UNQUOTED(PHP_BLOWFISH_CRYPT, 1, [Whether the system supports BlowFish salt])
275  AC_DEFINE_UNQUOTED(PHP_EXT_DES_CRYPT, 1, [Whether the system supports extended DES salt])
276  AC_DEFINE_UNQUOTED(PHP_MD5_CRYPT, 1, [Whether the system supports MD5 salt])
277  AC_DEFINE_UNQUOTED(PHP_SHA512_CRYPT, 1, [Whether the system supports SHA512 salt])
278  AC_DEFINE_UNQUOTED(PHP_SHA256_CRYPT, 1, [Whether the system supports SHA256 salt])
279
280  PHP_ADD_SOURCES(PHP_EXT_DIR(standard), crypt_freesec.c crypt_blowfish.c crypt_sha512.c crypt_sha256.c php_crypt_r.c)
281else
282  if test "$ac_cv_crypt_des" = "yes"; then
283    ac_result=1
284    ac_crypt_des=1
285  else
286    ac_result=0
287    ac_crypt_des=0
288  fi
289  AC_DEFINE_UNQUOTED(PHP_STD_DES_CRYPT, $ac_result, [Whether the system supports standard DES salt])
290
291  if test "$ac_cv_crypt_blowfish" = "yes"; then
292    ac_result=1
293    ac_crypt_blowfish=1
294  else
295    ac_result=0
296    ac_crypt_blowfish=0
297  fi
298  AC_DEFINE_UNQUOTED(PHP_BLOWFISH_CRYPT, $ac_result, [Whether the system supports BlowFish salt])
299
300  if test "$ac_cv_crypt_ext_des" = "yes"; then
301    ac_result=1
302    ac_crypt_edes=1
303  else
304    ac_result=0
305    ac_crypt_edes=0
306  fi
307  AC_DEFINE_UNQUOTED(PHP_EXT_DES_CRYPT, $ac_result, [Whether the system supports extended DES salt])
308
309  if test "$ac_cv_crypt_md5" = "yes"; then
310    ac_result=1
311    ac_crypt_md5=1
312  else
313    ac_result=0
314    ac_crypt_md5=0
315  fi
316  AC_DEFINE_UNQUOTED(PHP_MD5_CRYPT, $ac_result, [Whether the system supports MD5 salt])
317
318  if test "$ac_cv_crypt_sha512" = "yes"; then
319    ac_result=1
320    ac_crypt_sha512=1
321  else
322    ac_result=0
323    ac_crypt_sha512=0
324  fi
325  AC_DEFINE_UNQUOTED(PHP_SHA512_CRYPT, $ac_result, [Whether the system supports SHA512 salt])
326
327  if test "$ac_cv_crypt_sha256" = "yes"; then
328    ac_result=1
329    ac_crypt_sha256=1
330  else
331    ac_result=0
332    ac_crypt_sha256=0
333  fi
334  AC_DEFINE_UNQUOTED(PHP_SHA256_CRYPT, $ac_result, [Whether the system supports SHA256 salt])
335
336  AC_DEFINE_UNQUOTED(PHP_USE_PHP_CRYPT_R, 0, [Whether PHP has to use its own crypt_r for blowfish, des and ext des])
337fi
338
339dnl
340dnl Check for available functions
341dnl
342AC_CHECK_FUNCS(getcwd getwd asinh acosh atanh log1p hypot glob strfmon nice fpclass isinf isnan mempcpy strpncpy)
343AC_FUNC_FNMATCH
344
345divert(5)dnl
346
347dnl
348dnl Check if there is a support means of creating a new process
349dnl and defining which handles it receives
350dnl
351AC_CHECK_FUNCS(fork CreateProcess, [
352  php_can_support_proc_open=yes
353  break
354],[
355  php_can_support_proc_open=no
356])
357AC_MSG_CHECKING([if your OS can spawn processes with inherited handles])
358if test "$php_can_support_proc_open" = "yes"; then
359  AC_MSG_RESULT(yes)
360  AC_DEFINE(PHP_CAN_SUPPORT_PROC_OPEN,1, [Define if your system has fork/vfork/CreateProcess])
361else
362  AC_MSG_RESULT(no)
363fi
364
365if test "$PHP_SAPI" = "cgi" || test "$PHP_SAPI" = "cli" || test "$PHP_SAPI" = "embed"; then
366  AC_DEFINE(ENABLE_CHROOT_FUNC, 1, [Whether to enable chroot() function])
367fi
368
369dnl
370dnl Detect library functions needed by php dns_xxx functions
371dnl ext/standard/php_dns.h will collect these in a single define: HAVE_FULL_DNS_FUNCS
372dnl
373PHP_CHECK_FUNC(res_nsearch, resolv, bind, socket)
374PHP_CHECK_FUNC(dns_search, resolv, bind, socket)
375PHP_CHECK_FUNC(dn_expand, resolv, bind, socket)
376PHP_CHECK_FUNC(dn_skipname, resolv, bind, socket)
377
378dnl
379dnl These are old deprecated functions
380dnl
381
382PHP_CHECK_FUNC(res_search, resolv, bind, socket)
383
384dnl
385dnl Check if atof() accepts NAN
386dnl
387AC_CACHE_CHECK(whether atof() accepts NAN, ac_cv_atof_accept_nan,[
388AC_TRY_RUN([
389#include <math.h>
390#include <stdlib.h>
391
392#ifdef HAVE_ISNAN
393#define zend_isnan(a) isnan(a)
394#elif defined(HAVE_FPCLASS)
395#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
396#else
397#define zend_isnan(a) 0
398#endif
399
400int main(int argc, char** argv)
401{
402	return zend_isnan(atof("NAN")) ? 0 : 1;
403}
404],[
405  ac_cv_atof_accept_nan=yes
406],[
407  ac_cv_atof_accept_nan=no
408],[
409  ac_cv_atof_accept_nan=no
410])])
411if test "$ac_cv_atof_accept_nan" = "yes"; then
412  AC_DEFINE([HAVE_ATOF_ACCEPTS_NAN], 1, [whether atof() accepts NAN])
413fi
414
415dnl
416dnl Check if atof() accepts INF
417dnl
418AC_CACHE_CHECK(whether atof() accepts INF, ac_cv_atof_accept_inf,[
419AC_TRY_RUN([
420#include <math.h>
421#include <stdlib.h>
422
423#ifdef HAVE_ISINF
424#define zend_isinf(a) isinf(a)
425#elif defined(INFINITY)
426/* Might not work, but is required by ISO C99 */
427#define zend_isinf(a) (((a)==INFINITY)?1:0)
428#elif defined(HAVE_FPCLASS)
429#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF))
430#else
431#define zend_isinf(a) 0
432#endif
433
434int main(int argc, char** argv)
435{
436	return zend_isinf(atof("INF")) && zend_isinf(atof("-INF")) ? 0 : 1;
437}
438],[
439  ac_cv_atof_accept_inf=yes
440],[
441  ac_cv_atof_accept_inf=no
442],[
443  ac_cv_atof_accept_inf=no
444])])
445if test "$ac_cv_atof_accept_inf" = "yes"; then
446  AC_DEFINE([HAVE_ATOF_ACCEPTS_INF], 1, [whether atof() accepts INF])
447fi
448
449dnl
450dnl Check if HUGE_VAL == INF
451dnl
452AC_CACHE_CHECK(whether HUGE_VAL == INF, ac_cv_huge_val_inf,[
453AC_TRY_RUN([
454#include <math.h>
455#include <stdlib.h>
456
457#ifdef HAVE_ISINF
458#define zend_isinf(a) isinf(a)
459#elif defined(INFINITY)
460/* Might not work, but is required by ISO C99 */
461#define zend_isinf(a) (((a)==INFINITY)?1:0)
462#elif defined(HAVE_FPCLASS)
463#define zend_isinf(a) ((fpclass(a) == FP_PINF) || (fpclass(a) == FP_NINF))
464#else
465#define zend_isinf(a) 0
466#endif
467
468int main(int argc, char** argv)
469{
470	return zend_isinf(HUGE_VAL) ? 0 : 1;
471}
472],[
473  ac_cv_huge_val_inf=yes
474],[
475  ac_cv_huge_val_inf=no
476],[
477  ac_cv_huge_val_inf=yes
478])])
479dnl This is the most probable fallback so we assume yes in case of cross compile.
480if test "$ac_cv_huge_val_inf" = "yes"; then
481  AC_DEFINE([HAVE_HUGE_VAL_INF], 1, [whether HUGE_VAL == INF])
482fi
483
484dnl
485dnl Check if HUGE_VAL + -HUGEVAL == NAN
486dnl
487AC_CACHE_CHECK(whether HUGE_VAL + -HUGEVAL == NAN, ac_cv_huge_val_nan,[
488AC_TRY_RUN([
489#include <math.h>
490#include <stdlib.h>
491
492#ifdef HAVE_ISNAN
493#define zend_isnan(a) isnan(a)
494#elif defined(HAVE_FPCLASS)
495#define zend_isnan(a) ((fpclass(a) == FP_SNAN) || (fpclass(a) == FP_QNAN))
496#else
497#define zend_isnan(a) 0
498#endif
499
500int main(int argc, char** argv)
501{
502#if defined(__sparc__) && !(__GNUC__ >= 3)
503	/* prevent bug #27830 */
504	return 1;
505#else
506	return zend_isnan(HUGE_VAL + -HUGE_VAL) ? 0 : 1;
507#endif
508}
509],[
510  ac_cv_huge_val_nan=yes
511],[
512  ac_cv_huge_val_nan=no
513],[
514  ac_cv_huge_val_nan=yes
515])])
516dnl This is the most probable fallback so we assume yes in case of cross compile.
517if test "$ac_cv_huge_val_nan" = "yes"; then
518  AC_DEFINE([HAVE_HUGE_VAL_NAN], 1, [whether HUGE_VAL + -HUGEVAL == NAN])
519fi
520
521dnl
522dnl Check for strptime()
523dnl
524AC_CACHE_CHECK(whether strptime() declaration fails, ac_cv_strptime_decl_fails,[
525AC_TRY_COMPILE([
526#include <time.h>
527],[
528#ifndef HAVE_STRPTIME
529#error no strptime() on this platform
530#else
531/* use invalid strptime() declaration to see if it fails to compile */
532int strptime(const char *s, const char *format, struct tm *tm);
533#endif
534],[
535  ac_cv_strptime_decl_fails=no
536],[
537  ac_cv_strptime_decl_fails=yes
538])])
539if test "$ac_cv_strptime_decl_fails" = "yes"; then
540  AC_DEFINE([HAVE_STRPTIME_DECL_FAILS], 1, [whether strptime() declaration fails])
541fi
542
543dnl
544dnl Check for i18n capabilities
545dnl
546AC_CHECK_HEADERS([wchar.h])
547AC_CHECK_FUNCS([mblen])
548AC_CHECK_FUNCS([mbrlen mbsinit],,,[
549#ifdef HAVE_WCHAR_H
550# include <wchar.h>
551#endif
552])
553AC_CACHE_CHECK([for mbstate_t], [ac_cv_type_mbstate_t],[
554AC_TRY_COMPILE([
555#ifdef HAVE_WCHAR_H
556# include <wchar.h>
557#endif
558],[
559int __tmp__() { mbstate_t a; }
560],[
561  ac_cv_type_mbstate_t=yes
562],[
563  ac_cv_type_mbstate_t=no
564])])
565if test "$ac_cv_type_mbstate_t" = "yes"; then
566  AC_DEFINE([HAVE_MBSTATE_T], 1, [Define if your system has mbstate_t in wchar.h])
567fi
568
569dnl
570dnl Check for atomic operation API availability in Solaris
571dnl
572AC_CHECK_HEADERS([atomic.h])
573
574dnl
575dnl Setup extension sources
576dnl
577PHP_NEW_EXTENSION(standard, array.c base64.c basic_functions.c browscap.c crc32.c crypt.c \
578                            cyr_convert.c datetime.c dir.c dl.c dns.c exec.c file.c filestat.c \
579                            flock_compat.c formatted_print.c fsock.c head.c html.c image.c \
580                            info.c iptc.c lcg.c link.c mail.c math.c md5.c metaphone.c \
581                            microtime.c pack.c pageinfo.c quot_print.c rand.c \
582                            soundex.c string.c scanf.c syslog.c type.c uniqid.c url.c \
583                            var.c versioning.c assert.c strnatcmp.c levenshtein.c \
584                            incomplete_class.c url_scanner_ex.c ftp_fopen_wrapper.c \
585                            http_fopen_wrapper.c php_fopen_wrapper.c credits.c css.c \
586                            var_unserializer.c ftok.c sha1.c user_filters.c uuencode.c \
587                            filters.c proc_open.c streamsfuncs.c http.c)
588
589PHP_ADD_MAKEFILE_FRAGMENT
590PHP_INSTALL_HEADERS([ext/standard/])
591