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