xref: /php-src/build/php.m4 (revision c6396143)
1dnl This file contains local autoconf macros.
2
3dnl ----------------------------------------------------------------------------
4dnl Output stylize macros for configure (help/runtime).
5dnl ----------------------------------------------------------------------------
6
7dnl
8dnl PHP_HELP_SEPARATOR(title)
9dnl
10dnl Adds separator title into the configure --help display.
11dnl
12AC_DEFUN([PHP_HELP_SEPARATOR], [AC_ARG_ENABLE([], [
13$1], [])])
14
15dnl
16dnl PHP_CONFIGURE_PART(title)
17dnl
18dnl Adds separator title configure output (idea borrowed from mm).
19dnl
20AC_DEFUN([PHP_CONFIGURE_PART],[
21  AC_MSG_RESULT()
22  AC_MSG_RESULT([${T_MD}$1${T_ME}])
23])
24
25dnl ----------------------------------------------------------------------------
26dnl Build system helper macros.
27dnl ----------------------------------------------------------------------------
28
29dnl
30dnl PHP_DEF_HAVE(what)
31dnl
32dnl Generates 'AC_DEFINE(HAVE_WHAT, 1, [ ])'.
33dnl
34AC_DEFUN([PHP_DEF_HAVE], [m4_warn([obsolete],
35  [The macro 'PHP_DEF_HAVE' is obsolete. Use AC_DEFINE.])
36AC_DEFINE([HAVE_]translit($1,a-z_.-,A-Z___), 1, [ ])])
37
38dnl
39dnl PHP_RUN_ONCE(namespace, variable, code)
40dnl
41dnl Execute code, if variable is not set in namespace.
42dnl
43AC_DEFUN([PHP_RUN_ONCE],[
44  changequote({,})
45  unique=$(echo $2|$SED 's/[^a-zA-Z0-9]/_/g')
46  changequote([,])
47  cmd="echo $ac_n \"\$$1$unique$ac_c\""
48  if test -n "$unique" && test "$(eval $cmd)" = "" ; then
49    eval "$1$unique=set"
50    $3
51  fi
52])
53
54dnl
55dnl PHP_EXPAND_PATH(path, variable)
56dnl
57dnl Expands path to an absolute path and assigns it to variable.
58dnl
59AC_DEFUN([PHP_EXPAND_PATH],[
60  if test -z "$1" || echo "$1" | grep '^/' >/dev/null ; then
61    $2=$1
62  else
63    changequote({,})
64    ep_dir=$(echo $1|$SED 's%/*[^/][^/]*/*$%%')
65    changequote([,])
66    ep_realdir=$(cd "$ep_dir" && pwd)
67    $2="$ep_realdir"/$(basename "$1")
68  fi
69])
70
71dnl
72dnl PHP_SUBST(varname)
73dnl
74dnl Adds variable with its value into Makefile, e.g.:
75dnl CC = gcc
76dnl
77AC_DEFUN([PHP_SUBST],[
78  PHP_VAR_SUBST="$PHP_VAR_SUBST $1"
79])
80
81dnl
82dnl PHP_SUBST_OLD(varname, [VALUE])
83dnl
84dnl Same as PHP_SUBST() but also substitutes all @VARNAME@ instances in every
85dnl file passed to AC_OUTPUT.
86dnl
87AC_DEFUN([PHP_SUBST_OLD],[
88  AC_SUBST($@)
89  PHP_SUBST([$1])
90])
91
92dnl
93dnl PHP_OUTPUT(file)
94dnl
95dnl Adds "file" to the list of files generated by AC_OUTPUT. This macro can be
96dnl used several times. This macro is obsolete as of PHP 8.4 in favor of the
97dnl default AC_CONFIG_FILES.
98dnl
99AC_DEFUN([PHP_OUTPUT],
100[m4_warn([obsolete], [The macro 'PHP_OUTPUT' is obsolete. Use AC_CONFIG_FILES.])
101AC_CONFIG_FILES([$1])])
102
103dnl ----------------------------------------------------------------------------
104dnl Build system base macros.
105dnl ----------------------------------------------------------------------------
106
107dnl
108dnl PHP_CANONICAL_HOST_TARGET
109dnl
110AC_DEFUN([PHP_CANONICAL_HOST_TARGET],[
111  AC_REQUIRE([AC_CANONICAL_HOST])dnl
112  AC_REQUIRE([AC_CANONICAL_TARGET])dnl
113  dnl Make sure we do not continue if host_alias is empty.
114  if test -z "$host_alias" && test -n "$host"; then
115    host_alias=$host
116  fi
117  AS_VAR_IF([host_alias],,
118    [AC_MSG_ERROR([host_alias is not set! Make sure to run config.guess])])
119])
120
121dnl
122dnl PHP_INIT_BUILD_SYSTEM
123dnl
124dnl Initializes PHP build system configuration, creates build directories and
125dnl adds Makefile placeholders.
126dnl
127AC_DEFUN([PHP_INIT_BUILD_SYSTEM],
128[AC_REQUIRE([PHP_CANONICAL_HOST_TARGET])dnl
129php_shtool=$srcdir/build/shtool
130T_MD=$($php_shtool echo -n -e %B)
131T_ME=$($php_shtool echo -n -e %b)
132
133dnl Create empty Makefile placeholders.
134> Makefile.objects
135> Makefile.fragments
136
137dnl Mark whether the CFLAGS are set to automatic default value by Autoconf, or
138dnl they are manually modified by the environment variable from outside. E.g.
139dnl './configure CFLAGS=...'. Set this before the AC_PROG_CC, where Autoconf
140dnl adjusts the CFLAGS variable, so the checks can modify CFLAGS.
141AS_VAR_IF([CFLAGS],, [auto_cflags=1])
142
143dnl Required programs.
144PHP_PROG_AWK
145
146abs_srcdir=$(cd $srcdir && pwd)
147abs_builddir=$(pwd)
148
149dnl Run at the end of the configuration, before creating the config.status.
150AC_CONFIG_COMMANDS_PRE(
151[dnl Directory for storing shared objects of extensions.
152PHP_ADD_BUILD_DIR([modules])
153phplibdir="$(pwd)/modules"
154PHP_SUBST([phplibdir])
155PHP_GEN_BUILD_DIRS
156PHP_GEN_GLOBAL_MAKEFILE
157])dnl
158])
159
160dnl
161dnl PHP_GEN_GLOBAL_MAKEFILE
162dnl
163dnl Generates the global makefile.
164dnl
165AC_DEFUN([PHP_GEN_GLOBAL_MAKEFILE],[
166  AC_MSG_NOTICE([creating Makefile])
167  cat >Makefile <<EOF
168srcdir = $abs_srcdir
169builddir = $abs_builddir
170top_srcdir = $abs_srcdir
171top_builddir = $abs_builddir
172EOF
173  for i in $PHP_VAR_SUBST; do
174    eval echo "$i = \$$i" >> Makefile
175  done
176
177  cat $abs_srcdir/build/Makefile.global Makefile.fragments Makefile.objects >> Makefile
178])
179
180dnl
181dnl PHP_ADD_MAKEFILE_FRAGMENT([makefile [, srcdir [, builddir]]])
182dnl
183dnl Processes a file called Makefile.frag in the source directory of the most
184dnl recently added extension. $(srcdir) and $(builddir) are substituted with the
185dnl proper paths. Can be used to supply custom rules and/or additional targets.
186dnl For extensions, call this macro after the PHP_NEW_EXTENSION to get these
187dnl variables substituted automatically, elsewhere pass the Makefile path
188dnl "makefile" and optionally adjust "srcdir" and "builddir".
189dnl
190AC_DEFUN([PHP_ADD_MAKEFILE_FRAGMENT], [dnl
191  ifelse($1,,src=$ext_srcdir/Makefile.frag,src=$1)
192  ifelse($2,,ac_srcdir=$ext_srcdir,ac_srcdir=$2)
193  ifelse($3,,ac_builddir=$ext_builddir,ac_builddir=$3)
194  test -f "$src" && $SED -e "s#\$(srcdir)#$ac_srcdir#g" -e "s#\$(builddir)#$ac_builddir#g" $src  >> Makefile.fragments
195])
196
197dnl
198dnl PHP_ADD_SOURCES(source-path, sources [, special-flags [, type]])
199dnl
200dnl Adds sources which are located relative to source-path to the array of type
201dnl type. The blank-or-newline separated list of "sources" are processed with
202dnl optional special-flags which are passed to the compiler. Sources can be
203dnl either written in C or C++ (filenames shall end in .c or .cpp,
204dnl respectively).
205dnl
206dnl Note: If source-path begins with a "/", the "/" is removed and the path is
207dnl interpreted relative to the top build-directory.
208dnl
209dnl Which array to append to?
210dnl
211AC_DEFUN([PHP_ADD_SOURCES],[
212  PHP_ADD_SOURCES_X($1, $2, $3, ifelse($4,sapi,PHP_SAPI_OBJS,PHP_GLOBAL_OBJS))
213])
214
215dnl
216dnl _PHP_ASSIGN_BUILD_VARS(type)
217dnl
218dnl Internal, don't use.
219dnl
220AC_DEFUN([_PHP_ASSIGN_BUILD_VARS],[
221ifelse($1,shared,[
222  b_c_pre=$shared_c_pre
223  b_cxx_pre=$shared_cxx_pre
224  b_c_meta=$shared_c_meta
225  b_cxx_meta=$shared_cxx_meta
226  b_c_post=$shared_c_post
227  b_cxx_post=$shared_cxx_post
228],[
229  b_c_pre=$php_c_pre
230  b_cxx_pre=$php_cxx_pre
231  b_c_meta=$php_c_meta
232  b_cxx_meta=$php_cxx_meta
233  b_c_post=$php_c_post
234  b_cxx_post=$php_cxx_post
235])dnl
236  b_lo=[$]$1_lo
237])
238
239dnl
240dnl PHP_ADD_SOURCES_X(source-path, sources[, special-flags[, target-var[, shared]]])
241dnl
242dnl Additional to PHP_ADD_SOURCES (see above), this lets you set the name of the
243dnl array target-var directly, as well as whether shared objects will be built
244dnl from the blank-or-newline-separated list of "sources". Should not be used
245dnl directly.
246dnl
247AC_DEFUN([PHP_ADD_SOURCES_X],[
248dnl Relative to source- or build-directory?
249dnl ac_srcdir/ac_bdir include trailing slash
250  case $1 in
251  ""[)] ac_srcdir="$abs_srcdir/"; unset ac_bdir; ac_inc="-I. -I$abs_srcdir" ;;
252  /*[)] ac_srcdir=$(echo "$1"|cut -c 2-)"/"; ac_bdir=$ac_srcdir; ac_inc="-I$ac_bdir -I$abs_srcdir/$ac_bdir" ;;
253  *[)] ac_srcdir="$abs_srcdir/$1/"; ac_bdir="$1/"; ac_inc="-I$ac_bdir -I$ac_srcdir" ;;
254  esac
255
256dnl how to build .. shared or static?
257  ifelse($5,yes,_PHP_ASSIGN_BUILD_VARS(shared),_PHP_ASSIGN_BUILD_VARS(php))
258
259dnl Iterate over the sources.
260  old_IFS=[$]IFS
261  for ac_src in m4_normalize(m4_expand([$2])); do
262
263dnl Remove the suffix.
264      IFS=.
265      set $ac_src
266      ac_obj=[$]1
267      IFS=$old_IFS
268
269dnl Append to the array which has been dynamically chosen at m4 time.
270      $4="[$]$4 [$]ac_bdir[$]ac_obj.lo"
271
272dnl Choose the right compiler/flags/etc. for the source-file.
273      case $ac_src in
274        *.c[)] ac_comp="$b_c_pre $ac_inc $b_c_meta m4_normalize(m4_expand([$3])) -c $ac_srcdir$ac_src -o $ac_bdir$ac_obj.$b_lo $b_c_post" ;;
275        *.s[)] ac_comp="$b_c_pre $ac_inc $b_c_meta m4_normalize(m4_expand([$3])) -c $ac_srcdir$ac_src -o $ac_bdir$ac_obj.$b_lo $b_c_post" ;;
276        *.S[)] ac_comp="$b_c_pre $ac_inc $b_c_meta m4_normalize(m4_expand([$3])) -c $ac_srcdir$ac_src -o $ac_bdir$ac_obj.$b_lo $b_c_post" ;;
277        *.cpp|*.cc|*.cxx[)] ac_comp="$b_cxx_pre $ac_inc $b_cxx_meta m4_normalize(m4_expand([$3])) -c $ac_srcdir$ac_src -o $ac_bdir$ac_obj.$b_lo $b_cxx_post" ;;
278      esac
279
280dnl Generate Makefiles with dependencies
281      ac_comp="$ac_comp -MMD -MF $ac_bdir$ac_obj.dep -MT $ac_bdir[$]ac_obj.lo"
282
283dnl Create a rule for the object/source combo.
284    cat >>Makefile.objects<<EOF
285-include $ac_bdir[$]ac_obj.dep
286$ac_bdir[$]ac_obj.lo: $ac_srcdir[$]ac_src
287	$ac_comp
288EOF
289  done
290])
291
292dnl ----------------------------------------------------------------------------
293dnl Compiler characteristics checks.
294dnl ----------------------------------------------------------------------------
295
296dnl
297dnl PHP_RUNPATH_SWITCH
298dnl
299dnl Checks for -R, etc. switch.
300dnl
301AC_DEFUN([PHP_RUNPATH_SWITCH],[
302AC_CACHE_CHECK([if compiler supports -Wl,-rpath,], [php_cv_cc_rpath], [
303  SAVE_LIBS=$LIBS
304  LIBS="-Wl,-rpath,/usr/$PHP_LIBDIR $LIBS"
305  AC_LINK_IFELSE([AC_LANG_PROGRAM()],
306    [php_cv_cc_rpath=yes],
307    [php_cv_cc_rpath=no])
308  LIBS=$SAVE_LIBS
309])
310AS_VAR_IF([php_cv_cc_rpath], [yes],
311  [ld_runpath_switch=-Wl,-rpath,],
312  [AC_CACHE_CHECK([if compiler supports -R], [php_cv_cc_dashr], [
313    SAVE_LIBS=$LIBS
314    LIBS="-R /usr/$PHP_LIBDIR $LIBS"
315    AC_LINK_IFELSE([AC_LANG_PROGRAM()],
316      [php_cv_cc_dashr=yes],
317      [php_cv_cc_dashr=no])
318    LIBS=$SAVE_LIBS
319  ])
320  AS_VAR_IF([php_cv_cc_dashr], [yes],
321    [ld_runpath_switch=-R],
322    [ld_runpath_switch=-L])
323])
324AS_VAR_IF([PHP_RPATH], [no], [ld_runpath_switch=])
325])
326
327dnl
328dnl PHP_LIBGCC_LIBPATH(gcc)
329dnl
330dnl Stores the location of libgcc in libgcc_libpath.
331dnl
332AC_DEFUN([PHP_LIBGCC_LIBPATH],[
333  changequote({,})
334  libgcc_libpath=$($1 --print-libgcc-file-name|$SED 's%/*[^/][^/]*$%%')
335  changequote([,])
336])
337
338dnl ----------------------------------------------------------------------------
339dnl Macros to modify LIBS, INCLUDES, etc. variables.
340dnl ----------------------------------------------------------------------------
341
342dnl
343dnl PHP_REMOVE_USR_LIB(NAME)
344dnl
345dnl Removes all -L/usr/$PHP_LIBDIR entries from variable NAME.
346dnl
347AC_DEFUN([PHP_REMOVE_USR_LIB],[
348  unset ac_new_flags
349  for i in [$]$1; do
350    case [$]i in
351    -L/usr/$PHP_LIBDIR|-L/usr/$PHP_LIBDIR/[)] ;;
352    *[)] ac_new_flags="[$]ac_new_flags [$]i" ;;
353    esac
354  done
355  $1=[$]ac_new_flags
356])
357
358dnl
359dnl PHP_EVAL_LIBLINE(libline, [libs-variable], [not-extension])
360dnl
361dnl Use this macro to add libraries and/or library search paths to the PHP build
362dnl system when specified in compiler notation. Libraries (-l) are appended
363dnl either to the global Autoconf LIBS variable or to the specified
364dnl "libs-variable" (e.g., *_SHARED_LIBADD) when the extension is shared
365dnl (ext_shared=yes). If "not-extension" is set to a non-blank value, the
366dnl libraries are appended to "libs-variable" unconditionally (this is
367dnl particularly useful when working with SAPIs). The -L flags are appended to
368dnl the LDFLAGS.
369dnl
370AC_DEFUN([PHP_EVAL_LIBLINE],
371[m4_ifnblank([$3], [m4_ifblank([$2],
372  [m4_warn([syntax], [Missing 2nd argument when skipping extension check])],
373  [_php_ext_shared_saved=$ext_shared; ext_shared=yes])])
374  for ac_i in $1; do
375    AS_CASE([$ac_i],
376      [-pthread], [
377        AS_VAR_IF([ext_shared], [yes], [$2="$$2 -pthread"], [
378          PHP_RUN_ONCE([EXTRA_LDFLAGS], [$ac_i],
379            [EXTRA_LDFLAGS="$EXTRA_LDFLAGS $ac_i"])
380          PHP_RUN_ONCE([EXTRA_LDFLAGS_PROGRAM], [$ac_i],
381            [EXTRA_LDFLAGS_PROGRAM="$EXTRA_LDFLAGS_PROGRAM $ac_i"])
382        ])
383      ],
384      [-l*], [
385        ac_ii=$(echo $ac_i|cut -c 3-)
386        PHP_ADD_LIBRARY([$ac_ii], [yes], [$2])
387      ],
388      [-L*], [
389        ac_ii=$(echo $ac_i|cut -c 3-)
390        PHP_ADD_LIBPATH([$ac_ii], [$2])
391      ])
392  done
393m4_ifnblank([$3], [m4_ifnblank([$2], [ext_shared=$_php_ext_shared_saved])])[]dnl
394])
395
396dnl
397dnl PHP_EVAL_INCLINE(headerline)
398dnl
399dnl Use this macro, if you need to add header search paths to the PHP build
400dnl system which are only given in compiler notation.
401dnl
402AC_DEFUN([PHP_EVAL_INCLINE],[
403  for ac_i in $1; do
404    case $ac_i in
405    -I*[)]
406      ac_ii=$(echo $ac_i|cut -c 3-)
407      PHP_ADD_INCLUDE([$ac_ii])
408    ;;
409    esac
410  done
411])
412
413dnl
414dnl _PHP_ADD_LIBPATH_GLOBAL(variable)
415dnl
416dnl Internal, don't use.
417dnl
418AC_DEFUN([_PHP_ADD_LIBPATH_GLOBAL],[
419  PHP_RUN_ONCE(LIBPATH, $1, [
420    test -n "$ld_runpath_switch" && LDFLAGS="$LDFLAGS $ld_runpath_switch$1"
421    LDFLAGS="$LDFLAGS -L$1"
422    PHP_RPATHS="$PHP_RPATHS $1"
423  ])
424])
425
426dnl
427dnl PHP_ADD_LIBPATH(path [, SHARED-LIBADD])
428dnl
429dnl Adds a path to linkpath/runpath (LDFLAGS).
430dnl
431AC_DEFUN([PHP_ADD_LIBPATH],[
432  if test "$1" != "/usr/$PHP_LIBDIR" && test "$1" != "/usr/lib"; then
433    PHP_EXPAND_PATH($1, ai_p)
434    ifelse([$2],,[
435      _PHP_ADD_LIBPATH_GLOBAL([$ai_p])
436    ],[
437      if test "$ext_shared" = "yes"; then
438        $2="-L$ai_p [$]$2"
439        test -n "$ld_runpath_switch" && $2="$ld_runpath_switch$ai_p [$]$2"
440      else
441        _PHP_ADD_LIBPATH_GLOBAL([$ai_p])
442      fi
443    ])
444  fi
445])
446
447dnl
448dnl PHP_UTILIZE_RPATHS()
449dnl
450dnl Builds RPATHS/LDFLAGS from PHP_RPATHS.
451dnl
452AC_DEFUN([PHP_UTILIZE_RPATHS],[
453  OLD_RPATHS=$PHP_RPATHS
454  unset PHP_RPATHS
455
456  for i in $OLD_RPATHS; do
457    dnl Can be passed to native cc/libtool
458    PHP_LDFLAGS="$PHP_LDFLAGS -L$i"
459    dnl Libtool-specific
460    PHP_RPATHS="$PHP_RPATHS -R $i"
461    dnl cc-specific
462    NATIVE_RPATHS="$NATIVE_RPATHS $ld_runpath_switch$i"
463  done
464
465  AS_VAR_IF([PHP_RPATH], [no], [
466    unset PHP_RPATHS
467    unset NATIVE_RPATHS
468  ])
469])
470
471dnl
472dnl PHP_ADD_INCLUDE(paths [,prepend])
473dnl
474dnl Add blank-or-newline-separated list of include paths. If "prepend" is given,
475dnl paths are prepended to the beginning of INCLUDES.
476dnl
477AC_DEFUN([PHP_ADD_INCLUDE], [
478for include_path in m4_normalize(m4_expand([$1])); do
479  AS_IF([test "$include_path" != "/usr/include"], [
480    PHP_EXPAND_PATH([$include_path], [ai_p])
481    PHP_RUN_ONCE([INCLUDEPATH], [$ai_p], [m4_ifnblank([$2],
482      [INCLUDES="-I$ai_p $INCLUDES"],
483      [INCLUDES="$INCLUDES -I$ai_p"])])
484  ])
485done
486])
487
488dnl
489dnl _PHP_X_ADD_LIBRARY
490dnl
491dnl Internal, don't use.
492dnl
493AC_DEFUN([_PHP_X_ADD_LIBRARY],[dnl
494  ifelse([$2],,$3="-l$1 [$]$3", $3="[$]$3 -l$1") dnl
495])
496
497dnl
498dnl _PHP_ADD_LIBRARY_SKELETON
499dnl
500dnl Internal, don't use.
501dnl
502AC_DEFUN([_PHP_ADD_LIBRARY_SKELETON],[
503  case $1 in
504  c|c_r[)] ;;
505  *[)] ifelse($3,,[
506    _PHP_X_ADD_LIBRARY($1,$2,$5)
507  ],[
508    if test "$ext_shared" = "yes"; then
509      _PHP_X_ADD_LIBRARY($1,$2,$3)
510    else
511      $4($1,$2)
512    fi
513  ]) ;;
514  esac
515])
516
517dnl
518dnl PHP_ADD_LIBRARY(library[, append[, shared-libadd]])
519dnl
520dnl Add a library to the link line.
521dnl
522AC_DEFUN([PHP_ADD_LIBRARY],[
523  _PHP_ADD_LIBRARY_SKELETON([$1],[$2],[$3],[PHP_ADD_LIBRARY],[LIBS])
524])
525
526dnl
527dnl PHP_ADD_LIBRARY_DEFER(library[, append[, shared-libadd]])
528dnl
529dnl Add a library to the link line (deferred, not used during configure).
530dnl
531AC_DEFUN([PHP_ADD_LIBRARY_DEFER],[
532  _PHP_ADD_LIBRARY_SKELETON([$1],[$2],[$3],[PHP_ADD_LIBRARY_DEFER],[DLIBS])
533])
534
535dnl
536dnl PHP_ADD_LIBRARY_WITH_PATH(library, path[, shared-libadd])
537dnl
538dnl Add a library to the link line and path to linkpath/runpath. If
539dnl shared-libadd is not empty and $ext_shared is yes, shared-libadd will be
540dnl assigned the library information.
541dnl
542AC_DEFUN([PHP_ADD_LIBRARY_WITH_PATH],[
543ifelse($3,,[
544  if test -n "$2"; then
545    PHP_ADD_LIBPATH($2)
546  fi
547  PHP_ADD_LIBRARY($1)
548],[
549  if test "$ext_shared" = "yes"; then
550    $3="-l$1 [$]$3"
551    if test -n "$2"; then
552      PHP_ADD_LIBPATH($2,$3)
553    fi
554  else
555    PHP_ADD_LIBRARY_WITH_PATH($1,$2)
556  fi
557])
558])
559
560dnl
561dnl PHP_ADD_LIBRARY_DEFER_WITH_PATH(library, path[, shared-libadd])
562dnl
563dnl Add a library to the link line (deferred) and path to linkpath/runpath (not
564dnl deferred). If shared-libadd is not empty and $ext_shared is yes,
565dnl shared-libadd will be assigned the library information.
566dnl
567AC_DEFUN([PHP_ADD_LIBRARY_DEFER_WITH_PATH],[
568ifelse($3,,[
569  if test -n "$2"; then
570    PHP_ADD_LIBPATH($2)
571  fi
572  PHP_ADD_LIBRARY_DEFER($1)
573],[
574  if test "$ext_shared" = "yes"; then
575    $3="-l$1 [$]$3"
576    if test -n "$2"; then
577      PHP_ADD_LIBPATH($2,$3)
578    fi
579  else
580    PHP_ADD_LIBRARY_DEFER_WITH_PATH($1,$2)
581  fi
582])
583])
584
585dnl
586dnl PHP_ADD_FRAMEWORK(framework [,before])
587dnl
588dnl Add a (Darwin / Mac OS X) framework to the link line. If before is 1, the
589dnl framework is added to the beginning of the line.
590dnl
591AC_DEFUN([PHP_ADD_FRAMEWORK], [
592  PHP_RUN_ONCE(FRAMEWORKS, $1, [
593    if test "$2"; then
594      PHP_FRAMEWORKS="-framework $1 $PHP_FRAMEWORKS"
595    else
596      PHP_FRAMEWORKS="$PHP_FRAMEWORKS -framework $1"
597    fi
598  ])
599])
600
601dnl
602dnl PHP_ADD_FRAMEWORKPATH(path [,before])
603dnl
604dnl Add a (Darwin / Mac OS X) framework path to the link and include lines.
605dnl Default paths include (but are not limited to) /Local/Library/Frameworks and
606dnl /System/Library/Frameworks, so these don't need to be specifically added. If
607dnl before is 1, the framework path is added to the beginning of the relevant
608dnl lines.
609dnl
610AC_DEFUN([PHP_ADD_FRAMEWORKPATH], [
611  PHP_EXPAND_PATH($1, ai_p)
612  PHP_RUN_ONCE(FRAMEWORKPATH, $ai_p, [
613    if test "$2"; then
614      PHP_FRAMEWORKPATH="-F$ai_p $PHP_FRAMEWORKPATH"
615    else
616      PHP_FRAMEWORKPATH="$PHP_FRAMEWORKPATH -F$ai_p"
617    fi
618  ])
619])
620
621dnl
622dnl PHP_ADD_FRAMEWORK_WITH_PATH(framework, path)
623dnl
624dnl Adds a (Darwin / Mac OS X) framework path and the framework itself to the
625dnl link and include lines.
626dnl
627AC_DEFUN([PHP_ADD_FRAMEWORK_WITH_PATH], [
628  PHP_ADD_FRAMEWORKPATH($2)
629  PHP_ADD_FRAMEWORK($1)
630])
631
632dnl
633dnl PHP_SET_LIBTOOL_VARIABLE(var)
634dnl
635dnl Set libtool variable.
636dnl
637AC_DEFUN([PHP_SET_LIBTOOL_VARIABLE], [
638AS_VAR_IF([LIBTOOL],,
639  [LIBTOOL='$(SHELL) $(top_builddir)/libtool $1'],
640  [LIBTOOL="$LIBTOOL $1"])
641])
642
643dnl ----------------------------------------------------------------------------
644dnl Wrapper macros for AC_ARG_WITH / AC_ARG_ENABLE
645dnl ----------------------------------------------------------------------------
646
647dnl
648dnl PHP_ARG_ANALYZE_EX
649dnl
650dnl Internal.
651dnl
652AC_DEFUN([PHP_ARG_ANALYZE_EX],[
653ext_output="yes, shared"
654ext_shared=yes
655case [$]$1 in
656shared,*[)]
657  $1=$(echo "[$]$1"|$SED 's/^shared,//')
658  ;;
659shared[)]
660  $1=yes
661  ;;
662no[)]
663  ext_output=no
664  ext_shared=no
665  ;;
666*[)]
667  ext_output=yes
668  ext_shared=no
669  ;;
670esac
671
672dnl When using phpize, automatically enable and build extension as shared.
673m4_ifdef([PHP_ALWAYS_SHARED], [PHP_ALWAYS_SHARED([$1])])
674])
675
676dnl
677dnl PHP_ARG_ANALYZE
678dnl
679dnl Internal.
680dnl
681AC_DEFUN([PHP_ARG_ANALYZE],[
682ifelse([$3],yes,[PHP_ARG_ANALYZE_EX([$1])],[ext_output=ifelse([$]$1,,no,[$]$1)])
683ifelse([$2],,,[AC_MSG_RESULT([$ext_output])])
684])
685
686dnl
687dnl PHP_ARG_WITH(arg-name, check message, help text[, default-val[, extension-or-not]])
688dnl
689dnl Sets PHP_ARG_NAME either to the user value or to the default value.
690dnl default-val defaults to no. This will also set the variable ext_shared, and
691dnl will overwrite any previous variable of that name. If extension-or-not is
692dnl yes (default), then do the ENABLE_ALL check and run the PHP_ARG_ANALYZE_EX.
693dnl
694AC_DEFUN([PHP_ARG_WITH],[
695php_with_[]translit($1,A-Z0-9-,a-z0-9_)=ifelse($4,,no,$4)
696PHP_REAL_ARG_WITH([$1],[$2],[$3],[$4],PHP_[]translit($1,a-z0-9-,A-Z0-9_),[ifelse($5,,yes,$5)])
697])
698
699dnl
700dnl PHP_REAL_ARG_WITH
701dnl
702dnl Internal.
703dnl
704AC_DEFUN([PHP_REAL_ARG_WITH],[
705ifelse([$2],,,[AC_MSG_CHECKING([$2])])
706AC_ARG_WITH($1,[$3],$5=[$]withval,
707[
708  $5=ifelse($4,,no,$4)
709  ifelse($6,yes,[test "$PHP_ENABLE_ALL" && $5=$PHP_ENABLE_ALL])
710])
711PHP_ARG_ANALYZE($5,[$2],$6)
712])
713
714dnl
715dnl PHP_ARG_ENABLE(arg-name, check message, help text[, default-val[, extension-or-not]])
716dnl
717dnl Sets PHP_ARG_NAME either to the user value or to the default value.
718dnl default-val defaults to no. This will also set the variable ext_shared, and
719dnl will overwrite any previous variable of that name. If extension-or-not is
720dnl yes (default), then do the ENABLE_ALL check and run the PHP_ARG_ANALYZE_EX.
721dnl
722AC_DEFUN([PHP_ARG_ENABLE],[
723php_enable_[]translit($1,A-Z0-9-,a-z0-9_)=ifelse($4,,no,$4)
724PHP_REAL_ARG_ENABLE([$1],[$2],[$3],[$4],PHP_[]translit($1,a-z0-9-,A-Z0-9_),[ifelse($5,,yes,$5)])
725])
726
727dnl
728dnl PHP_REAL_ARG_ENABLE
729dnl
730dnl Internal.
731dnl
732AC_DEFUN([PHP_REAL_ARG_ENABLE],[
733ifelse([$2],,,[AC_MSG_CHECKING([$2])])
734AC_ARG_ENABLE($1,[$3],$5=[$]enableval,
735[
736  $5=ifelse($4,,no,$4)
737  ifelse($6,yes,[test "$PHP_ENABLE_ALL" && $5=$PHP_ENABLE_ALL])
738])
739PHP_ARG_ANALYZE($5,[$2],$6)
740])
741
742dnl ----------------------------------------------------------------------------
743dnl Build macros
744dnl ----------------------------------------------------------------------------
745
746dnl
747dnl PHP_BUILD_THREAD_SAFE
748dnl
749AC_DEFUN([PHP_BUILD_THREAD_SAFE], [m4_warn([obsolete],
750  [The macro 'PHP_BUILD_THREAD_SAFE' is obsolete. Set 'enable_zts' manually.])
751  enable_zts=yes])
752
753dnl
754dnl PHP_REQUIRE_CXX
755dnl
756AC_DEFUN([PHP_REQUIRE_CXX], [
757AS_VAR_IF([php_cxx_done],, [
758  AC_PROG_CXX
759  AC_PROG_CXXCPP
760  PHP_ADD_LIBRARY([stdc++])
761  php_cxx_done=yes
762])
763])
764
765dnl
766dnl PHP_BUILD_SHARED
767dnl
768AC_DEFUN([PHP_BUILD_SHARED],[
769  PHP_BUILD_PROGRAM
770  OVERALL_TARGET=libphp.la
771  php_sapi_module=shared
772
773  php_c_pre=$shared_c_pre
774  php_c_meta=$shared_c_meta
775  php_c_post=$shared_c_post
776  php_cxx_pre=$shared_cxx_pre
777  php_cxx_meta=$shared_cxx_meta
778  php_cxx_post=$shared_cxx_post
779  php_lo=$shared_lo
780])
781
782dnl
783dnl PHP_BUILD_STATIC
784dnl
785AC_DEFUN([PHP_BUILD_STATIC],[
786  PHP_BUILD_PROGRAM
787  OVERALL_TARGET=libphp.la
788  php_sapi_module=static
789])
790
791dnl
792dnl PHP_BUILD_BUNDLE
793dnl
794AC_DEFUN([PHP_BUILD_BUNDLE],[
795  PHP_BUILD_PROGRAM
796  OVERALL_TARGET=libs/libphp.bundle
797  php_sapi_module=static
798])
799
800dnl
801dnl PHP_BUILD_PROGRAM
802dnl
803AC_DEFUN([PHP_BUILD_PROGRAM],[
804  php_c_pre='$(LIBTOOL) --tag=CC --mode=compile $(CC)'
805  php_c_meta='$(COMMON_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS)'
806  php_c_post=
807  php_cxx_pre='$(LIBTOOL) --tag=CXX --mode=compile $(CXX)'
808  php_cxx_meta='$(COMMON_FLAGS) $(CXXFLAGS_CLEAN) $(EXTRA_CXXFLAGS)'
809  php_cxx_post=
810  php_lo=lo
811
812  case $with_pic in
813    yes) pic_setting='-prefer-pic';;
814    no)  pic_setting='-prefer-non-pic';;
815  esac
816
817  shared_c_pre='$(LIBTOOL) --tag=CC --mode=compile $(CC)'
818  shared_c_meta='$(COMMON_FLAGS) $(CFLAGS_CLEAN) $(EXTRA_CFLAGS) '$pic_setting
819  shared_c_post=
820  shared_cxx_pre='$(LIBTOOL) --tag=CXX --mode=compile $(CXX)'
821  shared_cxx_meta='$(COMMON_FLAGS) $(CXXFLAGS_CLEAN) $(EXTRA_CXXFLAGS) '$pic_setting
822  shared_cxx_post=
823  shared_lo=lo
824])
825
826dnl
827dnl PHP_SHARED_MODULE(module-name, object-var, build-dir, cxx, zend_ext)
828dnl
829dnl Basically sets up the link-stage for building module-name from object_var in
830dnl build-dir.
831dnl
832AC_DEFUN([PHP_SHARED_MODULE],[
833  install_modules="install-modules"
834  suffix=la
835
836  AS_CASE([$host_alias], [*aix*], [additional_flags="-Wl,-G"])
837
838  if test "x$5" = "xyes"; then
839    PHP_ZEND_EX="$PHP_ZEND_EX \$(phplibdir)/$1.$suffix"
840  else
841    PHP_MODULES="$PHP_MODULES \$(phplibdir)/$1.$suffix"
842  fi
843  PHP_SUBST([$2])
844  cat >>Makefile.objects<<EOF
845\$(phplibdir)/$1.$suffix: $3/$1.$suffix
846	\$(LIBTOOL) --tag=ifelse($4,,CC,CXX) --mode=install cp $3/$1.$suffix \$(phplibdir)
847
848$3/$1.$suffix: \$($2) \$(translit($1,a-z_-,A-Z__)_SHARED_DEPENDENCIES)
849	\$(LIBTOOL) --tag=ifelse($4,,CC,CXX) --mode=link ifelse($4,,[\$(CC)],[\$(CXX)]) -shared \$(COMMON_FLAGS) \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(LDFLAGS) $additional_flags -o [\$]@ -export-dynamic -avoid-version -prefer-pic -module -rpath \$(phplibdir) \$(EXTRA_LDFLAGS) \$($2) \$(translit($1,a-z_-,A-Z__)_SHARED_LIBADD)
850
851EOF
852])
853
854dnl
855dnl PHP_SELECT_SAPI(name, type[, sources [, extra-cflags]])
856dnl
857dnl When developing PHP SAPI modules, this macro specifies the SAPI "name" by
858dnl its "type", how PHP is supposed to be built (static, shared, bundle, or
859dnl program). It optionally adds the blank-or-newline-separated source files
860dnl "sources" and compilation flags "extra-cflags" to build the SAPI-specific
861dnl objects. For example:
862dnl   PHP_SELECT_SAPI([apache2handler],
863dnl     [shared],
864dnl     [<sources...>],
865dnl     [-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1])
866dnl
867AC_DEFUN([PHP_SELECT_SAPI],[
868  if test "$2" = "program"; then
869    PHP_BINARIES="$PHP_BINARIES $1"
870  elif test "$PHP_SAPI" != "none"; then
871    AC_MSG_ERROR([
872+--------------------------------------------------------------------+
873|                        *** ATTENTION ***                           |
874|                                                                    |
875| You've configured multiple SAPIs to be built. You can build only   |
876| one SAPI module plus CGI, CLI and FPM binaries at the same time.   |
877+--------------------------------------------------------------------+
878])
879  else
880    PHP_SAPI=$1
881  fi
882
883  PHP_ADD_BUILD_DIR([sapi/$1])
884
885  PHP_INSTALLED_SAPIS="$PHP_INSTALLED_SAPIS $1"
886
887  ifelse($2,program,[
888    PHP_BUILD_PROGRAM
889    install_binaries="install-binaries"
890    install_binary_targets="$install_binary_targets install-$1"
891    PHP_SUBST(PHP_[]translit($1,a-z0-9-,A-Z0-9_)[]_OBJS)
892    ifelse($3,,,[PHP_ADD_SOURCES_X([sapi/$1],[$3],[$4],PHP_[]translit($1,a-z0-9-,A-Z0-9_)[]_OBJS)])
893  ],[
894    case "$2" in
895    static[)] PHP_BUILD_STATIC;;
896    shared[)] PHP_BUILD_SHARED;;
897    bundle[)] PHP_BUILD_BUNDLE;;
898    esac
899    install_sapi="install-sapi"
900    ifelse($3,,,[PHP_ADD_SOURCES([sapi/$1],[$3],[$4],[sapi])])
901  ])
902])
903
904dnl
905dnl PHP_ADD_BUILD_DIR(dirs [, create])
906dnl
907dnl Add blank-or-newline-separated list of build directories or directories
908dnl required for the out-of-source builds. When "create" is given, the provided
909dnl "dirs" are created immediately upon macro invocation, instead of deferring
910dnl them to the PHP_GEN_BUILD_DIRS.
911dnl
912AC_DEFUN([PHP_ADD_BUILD_DIR],
913[m4_ifblank([$2],
914  [AS_VAR_APPEND([BUILD_DIR], [" m4_normalize(m4_expand([$1]))"])],
915  [$php_shtool mkdir -p m4_normalize(m4_expand([$1]))])
916])
917
918dnl
919dnl PHP_GEN_BUILD_DIRS
920dnl
921AC_DEFUN([PHP_GEN_BUILD_DIRS],[
922  AC_MSG_NOTICE([creating build directories])
923  $php_shtool mkdir -p $BUILD_DIR
924])
925
926dnl
927dnl PHP_NEW_EXTENSION(extname, sources [, shared [, sapi_class [, extra-cflags [, cxx [, zend_ext]]]]])
928dnl
929dnl Includes an extension in the build.
930dnl
931dnl "extname" is the name of the extension.
932dnl "sources" is a blank-or-newline-separated list of source files relative to
933dnl the subdir which are used to build the extension.
934dnl "shared" can be set to "shared" or "yes" to build the extension as a
935dnl dynamically loadable library. Optional parameter "sapi_class" can be set to
936dnl "cli" to mark extension build only with CLI or CGI sapi's. "extra-cflags"
937dnl are passed to the compiler, with @ext_srcdir@ and @ext_builddir@ being
938dnl substituted.
939dnl "cxx" can be used to indicate that a C++ shared module is desired.
940dnl "zend_ext" indicates a zend extension.
941AC_DEFUN([PHP_NEW_EXTENSION],[
942  ext_builddir=[]PHP_EXT_BUILDDIR()
943  ext_srcdir=[]PHP_EXT_SRCDIR()
944  ext_dir=[]PHP_EXT_DIR()
945
946  ifelse($5,,ac_extra=,[ac_extra=$(echo "m4_normalize(m4_expand([$5]))"|$SED s#@ext_srcdir@#$ext_srcdir#g|$SED s#@ext_builddir@#$ext_builddir#g)])
947
948  if test "$3" != "shared" && test "$3" != "yes" && test "$4" != "cli"; then
949dnl ---------------------------------------------- Static module
950    [PHP_]translit($1,a-z_-,A-Z__)[_SHARED]=no
951    PHP_ADD_SOURCES($ext_dir,$2,$ac_extra,)
952    EXT_STATIC="$EXT_STATIC $1;$ext_dir"
953    if test "$3" != "nocli"; then
954      EXT_CLI_STATIC="$EXT_CLI_STATIC $1;$ext_dir"
955    fi
956  else
957    if test "$3" = "shared" || test "$3" = "yes"; then
958dnl ---------------------------------------------- Shared module
959      [PHP_]translit($1,a-z_-,A-Z__)[_SHARED]=yes
960      PHP_ADD_SOURCES_X($ext_dir,$2,$ac_extra -DZEND_COMPILE_DL_EXT=1,shared_objects_$1,yes)
961      PHP_SHARED_MODULE($1,shared_objects_$1, $ext_builddir, $6, $7)
962      AC_DEFINE_UNQUOTED([COMPILE_DL_]translit($1,a-z_-,A-Z__), [1],
963        [Define to 1 if the PHP extension '$1' is built as a dynamic module.])
964    fi
965  fi
966
967  if test "$3" != "shared" && test "$3" != "yes" && test "$4" = "cli"; then
968dnl ---------------------------------------------- CLI static module
969    [PHP_]translit($1,a-z_-,A-Z__)[_SHARED]=no
970    case "$PHP_SAPI" in
971      cgi|embed|phpdbg[)]
972        PHP_ADD_SOURCES($ext_dir,$2,$ac_extra,)
973        EXT_STATIC="$EXT_STATIC $1;$ext_dir"
974        ;;
975      *[)]
976        PHP_ADD_SOURCES($ext_dir,$2,$ac_extra,cli)
977        ;;
978    esac
979    EXT_CLI_STATIC="$EXT_CLI_STATIC $1;$ext_dir"
980  fi
981  PHP_ADD_BUILD_DIR([$ext_builddir])
982
983dnl Set for phpize builds only.
984dnl ---------------------------
985  if test "$ext_builddir" = "."; then
986    PHP_PECL_EXTENSION=$1
987    PHP_SUBST([PHP_PECL_EXTENSION])
988  fi
989])
990
991dnl
992dnl PHP_ADD_EXTENSION_DEP(extname, depends [, depconf])
993dnl
994dnl This macro is scanned by genif.sh when it builds the internal functions
995dnl list, so that modules can be init'd in the correct order
996dnl $1 = name of extension, $2 = extension upon which it depends
997dnl $3 = optional: if true, it's ok for $2 to have not been configured default
998dnl is false and should halt the build. To be effective, this macro must be
999dnl invoked *after* PHP_NEW_EXTENSION. The extension on which it depends must
1000dnl also have been configured. Due to the limited genif.sh parsing and regex
1001dnl matching implementation, this macro must be called on its own line, and its
1002dnl arguments must be passed unquoted (without Autoconf '[' and ']' characters.
1003dnl For Windows, see 'ADD_EXTENSION_DEP' in the win32 build.
1004dnl
1005AC_DEFUN([PHP_ADD_EXTENSION_DEP], [
1006  am_i_shared=$[PHP_]translit($1,a-z_-,A-Z__)[_SHARED]
1007  is_it_shared=$[PHP_]translit($2,a-z_-,A-Z__)[_SHARED]
1008  is_it_enabled=$[PHP_]translit($2,a-z_-,A-Z__)
1009  if test "$am_i_shared" = "no" && test "$is_it_shared" = "yes" ; then
1010    AC_MSG_ERROR([
1011You've configured extension $1 to build statically, but it
1012depends on extension $2, which you've configured to build shared.
1013You either need to build $1 shared or build $2 statically for the
1014build to be successful.
1015])
1016  fi
1017  if test "x$is_it_enabled" = "xno" && test "x$3" != "xtrue"; then
1018    AC_MSG_ERROR([
1019You've configured extension $1, which depends on extension $2,
1020but you've either not enabled $2, or have disabled it.
1021])
1022  fi
1023  dnl Some systems require that we link $2 to $1 when building.
1024])
1025
1026dnl ----------------------------------------------------------------------------
1027dnl Checks for structures, typedefs, broken functions, etc.
1028dnl ----------------------------------------------------------------------------
1029
1030dnl
1031dnl _PHP_CHECK_SIZEOF(type, cross-value, extra-headers [, found-action [, not-found-action]])
1032dnl
1033dnl Internal helper macro.
1034dnl
1035AC_DEFUN([_PHP_CHECK_SIZEOF], [
1036  php_cache_value=php_cv_sizeof_[]$1
1037  AC_CACHE_VAL(php_cv_sizeof_[]$1, [
1038    old_LIBS=$LIBS
1039    LIBS=
1040    old_LDFLAGS=$LDFLAGS
1041    LDFLAGS=
1042    AC_RUN_IFELSE([AC_LANG_SOURCE([#include <stdio.h>
1043#include <stdlib.h>
1044#include <stddef.h>
1045#include <inttypes.h>
1046#ifdef HAVE_UNISTD_H
1047#include <unistd.h>
1048#endif
1049$3
1050
1051int main(void)
1052{
1053  FILE *fp = fopen("conftestval", "w");
1054  if (!fp) return(1);
1055  fprintf(fp, "%d\n", sizeof($1));
1056  return(0);
1057}
1058  ])], [
1059    eval $php_cache_value=$(cat conftestval)
1060  ], [
1061    eval $php_cache_value=0
1062  ], [
1063    ifelse([$2],,[eval $php_cache_value=0], [eval $php_cache_value=$2])
1064])
1065  LDFLAGS=$old_LDFLAGS
1066  LIBS=$old_LIBS
1067])
1068  if eval test "\$$php_cache_value" != "0"; then
1069ifelse([$4],[],:,[$4])
1070ifelse([$5],[],,[else $5])
1071  fi
1072])
1073
1074dnl
1075dnl PHP_CHECK_SIZEOF(type, cross-value, extra-headers)
1076dnl
1077AC_DEFUN([PHP_CHECK_SIZEOF], [
1078  AC_MSG_CHECKING([size of $1])
1079  _PHP_CHECK_SIZEOF($1, $2, $3, [
1080    AC_DEFINE_UNQUOTED([SIZEOF_]translit($1,a-z,A-Z_), [$]php_cv_sizeof_[]$1,
1081      [The size of '$1', as computed by sizeof.])
1082    AC_DEFINE_UNQUOTED([HAVE_]translit($1,a-z,A-Z_), [1],
1083      [Define to 1 if the system has the type '$1'.])
1084  ])
1085  AC_MSG_RESULT([[$][php_cv_sizeof_]translit($1, ,_)])
1086])
1087
1088dnl
1089dnl PHP_TIME_R_TYPE
1090dnl
1091dnl Check type of reentrant time-related functions. Type can be: irix, hpux or
1092dnl POSIX.
1093dnl
1094AC_DEFUN([PHP_TIME_R_TYPE],
1095[AC_CACHE_CHECK([for type of reentrant time-related functions],
1096  [php_cv_time_r_type],
1097  [AC_RUN_IFELSE([AC_LANG_SOURCE([[
1098#include <time.h>
1099
1100int main(void) {
1101char buf[27];
1102struct tm t;
1103time_t old = 0;
1104int r, s;
1105
1106s = gmtime_r(&old, &t);
1107r = (int) asctime_r(&t, buf, 26);
1108if (r == s && s == 0) return (0);
1109return (1);
1110}
1111  ]])],
1112  [php_cv_time_r_type=hpux],
1113  [AC_RUN_IFELSE([AC_LANG_SOURCE([[
1114#include <time.h>
1115int main(void) {
1116  struct tm t, *s;
1117  time_t old = 0;
1118  char buf[27], *p;
1119
1120  s = gmtime_r(&old, &t);
1121  p = asctime_r(&t, buf, 26);
1122  if (p == buf && s == &t) return (0);
1123  return (1);
1124}
1125  ]])],
1126  [php_cv_time_r_type=irix],
1127  [php_cv_time_r_type=POSIX],
1128  [php_cv_time_r_type=POSIX])],
1129  [php_cv_time_r_type=POSIX])
1130])
1131AS_CASE([$php_cv_time_r_type],
1132  [hpux], [AC_DEFINE([PHP_HPUX_TIME_R], [1],
1133    [Define to 1 if you have HP-UX 10.x.-style reentrant time functions.])],
1134  [irix], [AC_DEFINE([PHP_IRIX_TIME_R], [1],
1135    [Define to 1 you have IRIX-style reentrant time functions.])])
1136])
1137
1138dnl
1139dnl PHP_DOES_PWRITE_WORK
1140dnl
1141dnl Internal.
1142dnl
1143AC_DEFUN([PHP_DOES_PWRITE_WORK], [
1144AC_RUN_IFELSE([AC_LANG_SOURCE([
1145#include <sys/types.h>
1146#include <sys/stat.h>
1147#include <fcntl.h>
1148#include <unistd.h>
1149#include <errno.h>
1150#include <stdlib.h>
1151$1
1152    int main(void) {
1153    int fd = open("conftest_pwrite", O_WRONLY|O_CREAT, 0600);
1154
1155    if (fd < 0) return 1;
1156    if (pwrite(fd, "text", 4, 0) != 4) return 1;
1157    /* Linux glibc breakage until 2.2.5 */
1158    if (pwrite(fd, "text", 4, -1) != -1 || errno != EINVAL) return 1;
1159    return 0;
1160    }
1161  ])],
1162  [php_cv_func_pwrite=yes],
1163  [php_cv_func_pwrite=no],
1164  [php_cv_func_pwrite=no])
1165])
1166
1167dnl
1168dnl PHP_DOES_PREAD_WORK
1169dnl
1170dnl Internal.
1171dnl
1172AC_DEFUN([PHP_DOES_PREAD_WORK], [
1173echo test > conftest_pread
1174AC_RUN_IFELSE([AC_LANG_SOURCE([[
1175#include <sys/types.h>
1176#include <sys/stat.h>
1177#include <fcntl.h>
1178#include <unistd.h>
1179#include <errno.h>
1180#include <stdlib.h>
1181$1
1182    int main(void) {
1183    char buf[3];
1184    int fd = open("conftest_pread", O_RDONLY);
1185    if (fd < 0) return 1;
1186    if (pread(fd, buf, 2, 0) != 2) return 1;
1187    /* Linux glibc breakage until 2.2.5 */
1188    if (pread(fd, buf, 2, -1) != -1 || errno != EINVAL) return 1;
1189    return 0;
1190    }
1191  ]])],
1192  [php_cv_func_pread=yes],
1193  [php_cv_func_pread=no],
1194  [php_cv_func_pread=no])
1195])
1196
1197dnl
1198dnl PHP_PWRITE_TEST
1199dnl
1200AC_DEFUN([PHP_PWRITE_TEST], [
1201AC_CACHE_CHECK([whether pwrite works], [php_cv_func_pwrite], [
1202  PHP_DOES_PWRITE_WORK
1203  AS_VAR_IF([php_cv_func_pwrite], [no], [
1204    PHP_DOES_PWRITE_WORK([ssize_t pwrite(int, void *, size_t, off64_t);])
1205    AS_VAR_IF([php_cv_func_pwrite], [yes], [php_cv_func_pwrite=64])
1206  ])
1207])
1208
1209AS_VAR_IF([php_cv_func_pwrite], [no],, [
1210  AC_DEFINE([HAVE_PWRITE], [1],
1211    [Define to 1 if you have the 'pwrite' function.])
1212  AS_VAR_IF([php_cv_func_pwrite], [64],
1213    [AC_DEFINE([PHP_PWRITE_64], [1],
1214      [Define to 1 if 'pwrite' declaration with 'off64_t' is missing.])])
1215])
1216])
1217
1218dnl
1219dnl PHP_PREAD_TEST
1220dnl
1221AC_DEFUN([PHP_PREAD_TEST], [
1222AC_CACHE_CHECK([whether pread works], [php_cv_func_pread], [
1223  PHP_DOES_PREAD_WORK
1224  AS_VAR_IF([php_cv_func_pread], [no], [
1225    PHP_DOES_PREAD_WORK([ssize_t pread(int, void *, size_t, off64_t);])
1226    AS_VAR_IF([php_cv_func_pread], [yes], [php_cv_func_pread=64])
1227  ])
1228])
1229
1230AS_VAR_IF([php_cv_func_pread], [no],, [
1231  AC_DEFINE([HAVE_PREAD], [1],
1232    [Define to 1 if you have the 'pread' function.])
1233  AS_VAR_IF([php_cv_func_pread], [64],
1234    [AC_DEFINE([PHP_PREAD_64], [1],
1235      [Define to 1 if 'pread' declaration with 'off64_t' is missing.])])
1236])
1237])
1238
1239dnl
1240dnl PHP_MISSING_TIME_R_DECL
1241dnl
1242AC_DEFUN([PHP_MISSING_TIME_R_DECL],[
1243AC_CHECK_DECL([localtime_r],,
1244  [AC_DEFINE([MISSING_LOCALTIME_R_DECL], [1],
1245    [Define to 1 if 'localtime_r' declaration is missing.])],
1246  [#include <time.h>])
1247AC_CHECK_DECL([gmtime_r],,
1248  [AC_DEFINE([MISSING_GMTIME_R_DECL], [1],
1249    [Define to 1 if 'gmtime_r' declaration is missing.])],
1250  [#include <time.h>])
1251AC_CHECK_DECL([asctime_r],,
1252  [AC_DEFINE([MISSING_ASCTIME_R_DECL], [1],
1253    [Define to 1 if 'asctime_r' declaration is missing.])],
1254  [#include <time.h>])
1255AC_CHECK_DECL([ctime_r],,
1256  [AC_DEFINE([MISSING_CTIME_R_DECL], [1],
1257    [Define to 1 if 'ctime_r' declaration is missing.])],
1258  [#include <time.h>])
1259AC_CHECK_DECL([strtok_r],,
1260  [AC_DEFINE([MISSING_STRTOK_R_DECL], [1],
1261    [Define to 1 if 'strtok_r' declaration is missing.])],
1262  [#include <string.h>])
1263])
1264
1265dnl
1266dnl PHP_EBCDIC
1267dnl
1268AC_DEFUN([PHP_EBCDIC],
1269[AC_CACHE_CHECK([whether system uses EBCDIC], [ac_cv_ebcdic],
1270[AC_RUN_IFELSE([AC_LANG_SOURCE([
1271int main(void) {
1272  return (unsigned char)'A' != (unsigned char)0xC1;
1273}
1274])],
1275  [ac_cv_ebcdic=yes],
1276  [ac_cv_ebcdic=no],
1277  [ac_cv_ebcdic=no])])
1278AS_VAR_IF([ac_cv_ebcdic], [yes],
1279  [AC_MSG_FAILURE([PHP does not support EBCDIC targets.])])
1280])
1281
1282dnl
1283dnl PHP_BROKEN_GETCWD
1284dnl
1285dnl Some systems, notably Solaris, cause getcwd() or realpath to fail if a
1286dnl component of the path has execute but not read permissions.
1287dnl
1288AC_DEFUN([PHP_BROKEN_GETCWD], [
1289AC_CACHE_CHECK([for broken getcwd], [php_cv_func_getcwd_broken],
1290  [AS_CASE([$host_alias],
1291    [*solaris*], [php_cv_func_getcwd_broken=yes],
1292    [php_cv_func_getcwd_broken=no])])
1293AS_VAR_IF([php_cv_func_getcwd_broken], [yes],
1294  [AC_DEFINE([HAVE_BROKEN_GETCWD], [1],
1295    [Define to 1 if system has a broken 'getcwd'.])])
1296])
1297
1298dnl
1299dnl PHP_BROKEN_GCC_STRLEN_OPT
1300dnl
1301dnl Early releases of GCC 8 shipped with a strlen() optimization bug, so they
1302dnl didn't properly handle the 'char val[1]' struct hack. See bug #76510.
1303dnl
1304AC_DEFUN([PHP_BROKEN_GCC_STRLEN_OPT],
1305[AC_CACHE_CHECK([for broken gcc optimize-strlen],
1306  [php_cv_have_broken_gcc_strlen_opt],
1307  [AC_RUN_IFELSE([AC_LANG_SOURCE([[
1308#include <stdlib.h>
1309#include <string.h>
1310#include <stdio.h>
1311struct s
1312{
1313  int i;
1314  char c[1];
1315};
1316int main(void)
1317{
1318  struct s *s = malloc(sizeof(struct s) + 3);
1319  s->i = 3;
1320  strcpy(s->c, "foo");
1321  return strlen(s->c+1) == 2;
1322}
1323]])],
1324  [php_cv_have_broken_gcc_strlen_opt=yes],
1325  [php_cv_have_broken_gcc_strlen_opt=no],
1326  [php_cv_have_broken_gcc_strlen_opt=no])])
1327AS_VAR_IF([php_cv_have_broken_gcc_strlen_opt], [yes],
1328  [AS_VAR_APPEND([CFLAGS], [" -fno-optimize-strlen"])])
1329])
1330
1331dnl
1332dnl PHP_FOPENCOOKIE
1333dnl
1334dnl Check for cookie_io_functions_t type and fopencookie(). When using glibc,
1335dnl checks here require _GNU_SOURCE defined via AC_USE_SYSTEM_EXTENSIONS. Some
1336dnl glibc versions started using the off64_t in fopencookie seeker definition,
1337dnl which is in transition to use the POSIX standard off_t on 32-bit (with large
1338dnl file support enabled) and 64-bit.
1339dnl
1340AC_DEFUN([PHP_FOPENCOOKIE],
1341[AC_CHECK_TYPE([cookie_io_functions_t], [AC_CHECK_FUNCS([fopencookie])],,
1342  [#include <stdio.h>])
1343dnl Check if glibc might use off64_t seeker definition.
1344AS_VAR_IF([ac_cv_func_fopencookie], [yes],
1345  [AC_CACHE_CHECK([whether fopencookie seeker uses off64_t],
1346    [php_cv_type_cookie_off64_t],
1347    [AC_RUN_IFELSE([AC_LANG_SOURCE([
1348#include <stdio.h>
1349#include <stdlib.h>
1350
1351struct cookiedata {
1352  off64_t pos;
1353};
1354
1355ssize_t reader(void *cookie, char *buffer, size_t size)
1356{ (void)cookie; (void)buffer; return size; }
1357ssize_t writer(void *cookie, const char *buffer, size_t size)
1358{ (void)cookie; (void)buffer; return size; }
1359int closer(void *cookie)
1360{ (void)cookie; return 0; }
1361int seeker(void *cookie, off64_t *position, int whence)
1362{ ((struct cookiedata*)cookie)->pos = *position; (void)whence; return 0; }
1363
1364cookie_io_functions_t funcs = {reader, writer, seeker, closer};
1365
1366int main(void) {
1367  struct cookiedata g = { 0 };
1368  FILE *fp = fopencookie(&g, "r", funcs);
1369  if (fp && fseek(fp, 8192, SEEK_SET) == 0 && g.pos == 8192) {
1370    return 0;
1371  }
1372  return 1;
1373}
1374])],
1375  [php_cv_type_cookie_off64_t=yes],
1376  [php_cv_type_cookie_off64_t=no],
1377  [AS_CASE([$host_alias],
1378    [*linux*], [php_cv_type_cookie_off64_t=yes],
1379    [php_cv_type_cookie_off64_t=no])]
1380  )])
1381  AS_VAR_IF([php_cv_type_cookie_off64_t], [yes],
1382    [AC_DEFINE([COOKIE_SEEKER_USES_OFF64_T], [1],
1383      [Define to 1 if fopencookie seeker uses off64_t.])])
1384])
1385])
1386
1387dnl ----------------------------------------------------------------------------
1388dnl Library/function existence and build sanity checks.
1389dnl ----------------------------------------------------------------------------
1390
1391dnl
1392dnl PHP_CHECK_LIBRARY(library, function [, action-found [, action-not-found [, extra-libs]]])
1393dnl
1394dnl Wrapper for AC_CHECK_LIB.
1395dnl
1396AC_DEFUN([PHP_CHECK_LIBRARY], [
1397  save_old_LDFLAGS=$LDFLAGS
1398  ac_stuff="$5"
1399
1400  save_ext_shared=$ext_shared
1401  ext_shared=yes
1402  PHP_EVAL_LIBLINE([$]ac_stuff, LDFLAGS)
1403  AC_CHECK_LIB([$1],[$2],[
1404    LDFLAGS=$save_old_LDFLAGS
1405    ext_shared=$save_ext_shared
1406    $3
1407  ],[
1408    LDFLAGS=$save_old_LDFLAGS
1409    ext_shared=$save_ext_shared
1410    unset ac_cv_lib_$1[]_$2
1411    $4
1412  ])dnl
1413])
1414
1415dnl
1416dnl PHP_CHECK_FRAMEWORK(framework, function [, action-found [, action-not-found ]])
1417dnl
1418dnl El cheapo wrapper for AC_CHECK_LIB.
1419dnl
1420AC_DEFUN([PHP_CHECK_FRAMEWORK], [
1421  save_old_LDFLAGS=$LDFLAGS
1422  LDFLAGS="-framework $1 $LDFLAGS"
1423  dnl Supplying "c" to AC_CHECK_LIB is technically cheating, but rewriting
1424  dnl AC_CHECK_LIB is overkill and this only affects the "checking.." output
1425  dnl anyway.
1426  AC_CHECK_LIB([c],[$2],[
1427    LDFLAGS=$save_old_LDFLAGS
1428    $3
1429  ],[
1430    LDFLAGS=$save_old_LDFLAGS
1431    $4
1432  ])
1433])
1434
1435dnl
1436dnl PHP_CHECK_FUNC_LIB(func, libs)
1437dnl
1438dnl This macro checks whether 'func' or '__func' exists in the specified
1439dnl library. Defines HAVE_func and HAVE_library if found and adds the library to
1440dnl LIBS. This should be called in the ACTION-IF-NOT-FOUND part of
1441dnl PHP_CHECK_FUNC.
1442dnl
1443dnl autoconf undefines the builtin "shift" :-(
1444dnl If possible, we use the builtin shift anyway, otherwise we use the ubercool
1445dnl definition that has been tested so far with FreeBSD/GNU m4.
1446dnl
1447ifdef([builtin],[builtin(define, phpshift, [builtin(shift, $@)])],[
1448define([phpshift],[ifelse(index([$@],[,]),-1,,[substr([$@],incr(index([$@],[,])))])])
1449])
1450
1451dnl
1452dnl PHP_CHECK_FUNC_LIB
1453dnl
1454AC_DEFUN([PHP_CHECK_FUNC_LIB],[
1455  ifelse($2,,:,[
1456  unset ac_cv_lib_$2[]_$1
1457  unset ac_cv_lib_$2[]___$1
1458  unset found
1459  AC_CHECK_LIB($2, $1, [found=yes], [
1460    AC_CHECK_LIB($2, __$1, [found=yes], [found=no])
1461  ])
1462
1463  if test "$found" = "yes"; then
1464    ac_libs=$LIBS
1465    LIBS="$LIBS -l$2"
1466    AC_RUN_IFELSE([AC_LANG_PROGRAM()],[found=yes],[found=no],[
1467      dnl Cross compilation.
1468      found=yes
1469    ])
1470    LIBS=$ac_libs
1471  fi
1472
1473  if test "$found" = "yes"; then
1474    PHP_ADD_LIBRARY($2)
1475    AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_$1]), [1],
1476      [Define to 1 if you have the '$1' function.])
1477    AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_LIB$2]), [1],
1478      [Define to 1 if you have the '$2' library (-l$2).])
1479    ac_cv_func_$1=yes
1480  else
1481    PHP_CHECK_FUNC_LIB($1,phpshift(phpshift($@)))
1482  fi
1483  ])
1484])
1485
1486dnl
1487dnl PHP_CHECK_FUNC(func, ...)
1488dnl
1489dnl This macro checks whether 'func' or '__func' exists in the default libraries
1490dnl and as a fall back in the specified library. Defines HAVE_func and
1491dnl HAVE_library if found and adds the library to LIBS.
1492dnl
1493AC_DEFUN([PHP_CHECK_FUNC],[
1494  unset ac_cv_func_$1
1495  unset ac_cv_func___$1
1496  unset found
1497
1498  AC_CHECK_FUNC($1, [found=yes],[ AC_CHECK_FUNC(__$1,[found=yes],[found=no]) ])
1499
1500  case $found in
1501  yes[)]
1502    AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_$1]), [1],
1503      [Define to 1 if you have the '$1' function.])
1504    ac_cv_func_$1=yes
1505  ;;
1506  ifelse($#,1,,[
1507    *[)] PHP_CHECK_FUNC_LIB($@) ;;
1508  ])
1509  esac
1510])
1511
1512dnl
1513dnl PHP_TEST_BUILD(function, action-if-ok, action-if-not-ok [, extra-libs [, extra-source]])
1514dnl
1515dnl This macro checks whether build works and given function exists.
1516dnl
1517AC_DEFUN([PHP_TEST_BUILD], [m4_warn([obsolete],
1518  [The macro 'PHP_TEST_BUILD' is obsolete. Use AC_* macros.])
1519  old_LIBS=$LIBS
1520  LIBS="$4 $LIBS"
1521  AC_LINK_IFELSE([AC_LANG_SOURCE([
1522    $5
1523    char $1(void);
1524    int main(void) {
1525      $1();
1526      return 0;
1527    }
1528  ])],[
1529    LIBS=$old_LIBS
1530    $2
1531  ],[
1532    LIBS=$old_LIBS
1533    $3
1534  ])
1535])
1536
1537dnl ----------------------------------------------------------------------------
1538dnl Platform characteristics checks.
1539dnl ----------------------------------------------------------------------------
1540
1541dnl
1542dnl PHP_SHLIB_SUFFIX_NAMES
1543dnl
1544dnl Determines link library suffix SHLIB_SUFFIX_NAME which can be: .so, .sl or
1545dnl .dylib
1546dnl
1547dnl Determines shared library suffix SHLIB_DL_SUFFIX_NAME suffix can be: .so or
1548dnl .sl
1549dnl
1550AC_DEFUN([PHP_SHLIB_SUFFIX_NAMES], [
1551AC_REQUIRE([PHP_CANONICAL_HOST_TARGET])dnl
1552AS_CASE([$host_alias],
1553  [*hpux*], [
1554    SHLIB_SUFFIX_NAME=sl
1555    SHLIB_DL_SUFFIX_NAME=sl
1556  ],
1557  [*darwin*], [
1558    SHLIB_SUFFIX_NAME=dylib
1559    SHLIB_DL_SUFFIX_NAME=so
1560  ], [
1561    SHLIB_SUFFIX_NAME=so
1562    SHLIB_DL_SUFFIX_NAME=$SHLIB_SUFFIX_NAME
1563  ])
1564PHP_SUBST_OLD([SHLIB_SUFFIX_NAME])
1565PHP_SUBST_OLD([SHLIB_DL_SUFFIX_NAME])
1566])
1567
1568dnl
1569dnl PHP_C_BIGENDIAN
1570dnl
1571dnl Replacement macro for AC_C_BIGENDIAN.
1572dnl
1573AC_DEFUN([PHP_C_BIGENDIAN],
1574[AC_CACHE_CHECK([whether byte ordering is bigendian], [ac_cv_c_bigendian_php],
1575[AC_RUN_IFELSE([AC_LANG_SOURCE([
1576int main(void)
1577{
1578  short one = 1;
1579  char *cp = (char *)&one;
1580
1581  if (*cp == 0) {
1582    return 0;
1583  }
1584
1585  return 1;
1586}
1587])],
1588  [ac_cv_c_bigendian_php=yes],
1589  [ac_cv_c_bigendian_php=no],
1590  [ac_cv_c_bigendian_php=unknown])])
1591AS_VAR_IF([ac_cv_c_bigendian_php], [yes],
1592  [AC_DEFINE([WORDS_BIGENDIAN], [],
1593    [Define if processor uses big-endian word.])])
1594])
1595
1596dnl ----------------------------------------------------------------------------
1597dnl Checks for programs: PHP_PROG_<program>.
1598dnl ----------------------------------------------------------------------------
1599
1600dnl
1601dnl PHP_PROG_SENDMAIL
1602dnl
1603dnl Search for the sendmail binary.
1604dnl
1605AC_DEFUN([PHP_PROG_SENDMAIL],
1606[PHP_ALT_PATH=/usr/bin:/usr/sbin:/usr/etc:/etc:/usr/ucblib:/usr/lib
1607AC_PATH_PROG([PROG_SENDMAIL], [sendmail], [], [$PATH:$PHP_ALT_PATH])
1608AS_VAR_IF([PROG_SENDMAIL],, [PROG_SENDMAIL=/usr/sbin/sendmail
1609AC_MSG_NOTICE([default sendmail_path INI directive set to $PROG_SENDMAIL])])])
1610
1611dnl
1612dnl PHP_PROG_AWK
1613dnl
1614dnl Some vendors force mawk before gawk; mawk is broken so we don't like that.
1615dnl
1616AC_DEFUN([PHP_PROG_AWK], [
1617AC_CHECK_PROGS([AWK], [gawk nawk awk mawk], [bork], [/usr/xpg4/bin/:$PATH])
1618AS_CASE([$AWK],
1619  [*mawk],
1620    [AC_MSG_WARN(m4_text_wrap([
1621      mawk is known to have problems on some systems. You should install GNU awk
1622    ]))],
1623  [*gawk], [],
1624  [bork], [AC_MSG_ERROR([Could not find awk; Install GNU awk])],
1625  [
1626    AC_MSG_CHECKING([if $AWK is broken])
1627    AS_IF([! $AWK 'function foo() {}' >/dev/null 2>&1], [
1628      AC_MSG_RESULT([yes])
1629      AC_MSG_ERROR([You should install GNU awk])
1630    ],
1631    [AC_MSG_RESULT([no])])
1632  ])
1633PHP_SUBST([AWK])
1634])
1635
1636dnl
1637dnl PHP_PROG_BISON([MIN-VERSION], [EXCLUDED-VERSION...])
1638dnl
1639dnl Search for bison and optionally check if version is at least the minimum
1640dnl required version MIN-VERSION and doesn't match any of the blank separated
1641dnl list of excluded versions EXCLUDED-VERSION (for example "3.0 3.2").
1642dnl
1643AC_DEFUN([PHP_PROG_BISON], [
1644  AC_CHECK_PROG([YACC], [bison], [bison])
1645
1646  ifelse($1,,php_bison_required_version='',php_bison_required_version="$1")
1647  ifelse($2,,php_bison_excluded_versions='none',php_bison_excluded_versions="$2")
1648
1649  if test -n "$YACC"; then
1650    AC_MSG_CHECKING([for bison version])
1651
1652    php_bison_version=$($YACC --version 2> /dev/null | grep 'GNU Bison' | cut -d ' ' -f 4 | tr -d a-z)
1653    if test -z "$php_bison_version"; then
1654      php_bison_version=0.0.0
1655    fi
1656    ac_IFS=$IFS; IFS="."
1657    set $php_bison_version
1658    IFS=$ac_IFS
1659    php_bison_num=$(expr [$]{1:-0} \* 10000 + [$]{2:-0} \* 100 + [$]{3:-0})
1660    php_bison_branch="[$]1.[$]2"
1661    php_bison_check=ok
1662
1663    if test -z "$php_bison_required_version" && test -z "$php_bison_num"; then
1664      php_bison_check=invalid
1665    elif test -n "$php_bison_required_version"; then
1666      ac_IFS=$IFS; IFS="."
1667      set $php_bison_required_version
1668      IFS=$ac_IFS
1669      php_bison_required_num=$(expr [$]{1:-0} \* 10000 + [$]{2:-0} \* 100 + [$]{3:-0})
1670      php_bison_required_version="$php_bison_required_version or later"
1671
1672      if test -z "$php_bison_num" || test "$php_bison_num" -lt "$php_bison_required_num"; then
1673        php_bison_check=invalid
1674      fi
1675    fi
1676
1677    for php_bison_check_version in $php_bison_excluded_versions; do
1678      if test "$php_bison_version" = "$php_bison_check_version" || test "$php_bison_branch" = "$php_bison_check_version"; then
1679        php_bison_check=invalid
1680        break
1681      fi
1682    done
1683
1684    if test "$php_bison_check" != "invalid"; then
1685      PHP_SUBST_OLD([YFLAGS], [-Wall])
1686      AC_MSG_RESULT([$php_bison_version (ok)])
1687    else
1688      AC_MSG_RESULT([$php_bison_version])
1689    fi
1690  fi
1691
1692  case $php_bison_check in
1693    ""|invalid[)]
1694      if test ! -f "$abs_srcdir/Zend/zend_language_parser.h" || test ! -f "$abs_srcdir/Zend/zend_language_parser.c"; then
1695        AC_MSG_ERROR(m4_text_wrap([
1696          bison $php_bison_required_version or newer is required to generate PHP
1697          parsers (excluded versions: $php_bison_excluded_versions).
1698        ]))
1699      fi
1700
1701      YACC="exit 0;"
1702      ;;
1703  esac
1704
1705  PHP_SUBST([YACC])
1706])
1707
1708dnl
1709dnl PHP_PROG_RE2C([min-version], [options])
1710dnl
1711dnl Search for the re2c and optionally check if version is at least the minimum
1712dnl required version "min-version". The blank-or-newline-separated "options" are
1713dnl the re2c command-line flags substituted into a Makefile variable RE2C_FLAGS
1714dnl which can be added to all re2c invocations.
1715dnl
1716AC_DEFUN([PHP_PROG_RE2C],[
1717  AC_CHECK_PROG([RE2C], [re2c], [re2c])
1718
1719  php_re2c_check=
1720  AS_VAR_IF([RE2C],,, [
1721    AC_MSG_CHECKING([for re2c version])
1722
1723    php_re2c_version=$($RE2C --version | cut -d ' ' -f 2 2>/dev/null)
1724
1725    php_re2c_check=ok
1726    AS_VERSION_COMPARE([$php_re2c_version], [$1],
1727      [php_re2c_check=invalid])
1728
1729    AS_VAR_IF([php_re2c_check], [invalid],
1730      [AC_MSG_RESULT([$php_re2c_version (too old)])],
1731      [AC_MSG_RESULT([$php_re2c_version (ok)])])
1732  ])
1733
1734  AS_CASE([$php_re2c_check],
1735    [""|invalid], [
1736      AS_IF([test ! -f "$abs_srcdir/Zend/zend_language_scanner.c"], [
1737        AC_MSG_ERROR(m4_text_wrap([
1738          re2c $1 or newer is required to generate PHP lexers.
1739        ]))
1740      ])
1741
1742      RE2C="exit 0;"
1743    ])
1744
1745  PHP_SUBST([RE2C])
1746  AS_VAR_SET([RE2C_FLAGS], m4_normalize(["$2"]))
1747  PHP_SUBST([RE2C_FLAGS])
1748])
1749
1750dnl
1751dnl PHP_PROG_PHP([min-version])
1752dnl
1753dnl Find PHP command-line interface SAPI on the system and check if version is
1754dnl greater or equal to "min-version". If suitable version is found, the PHP
1755dnl variable is set and substituted to a Makefile variable. Used for generating
1756dnl files and running PHP utilities during the build.
1757dnl
1758AC_DEFUN([PHP_PROG_PHP],
1759[m4_if([$1],, [php_required_version=7.4], [php_required_version=$1])
1760AC_CHECK_PROG([PHP], [php], [php])
1761AS_VAR_IF([PHP],,, [
1762AC_MSG_CHECKING([for php version])
1763php_version=$($PHP -v | head -n1 | cut -d ' ' -f 2)
1764AS_VERSION_COMPARE([$php_version], [$php_required_version], [unset PHP])
1765AS_VAR_IF([PHP],,
1766  [AC_MSG_RESULT([$php_version (too old, install $php_required_version or later)])],
1767  [AC_MSG_RESULT([$php_version (ok)])])
1768])
1769PHP_SUBST([PHP])
1770])
1771
1772dnl ----------------------------------------------------------------------------
1773dnl Common setup macros: PHP_SETUP_<what>
1774dnl ----------------------------------------------------------------------------
1775
1776dnl
1777dnl PHP_SETUP_ICU([shared-add])
1778dnl
1779dnl Common setup macro for ICU.
1780dnl
1781AC_DEFUN([PHP_SETUP_ICU],[
1782  PKG_CHECK_MODULES([ICU], [icu-uc >= 50.1 icu-io icu-i18n])
1783
1784  PHP_EVAL_INCLINE([$ICU_CFLAGS])
1785  PHP_EVAL_LIBLINE([$ICU_LIBS], [$1])
1786
1787  ICU_CFLAGS="$ICU_CFLAGS -DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1"
1788  ICU_CXXFLAGS="$ICU_CXXFLAGS -DUNISTR_FROM_CHAR_EXPLICIT=explicit -DUNISTR_FROM_STRING_EXPLICIT=explicit"
1789
1790  AS_IF([$PKG_CONFIG icu-io --atleast-version=60],
1791    [ICU_CFLAGS="$ICU_CFLAGS -DU_HIDE_OBSOLETE_UTF_OLD_H=1"])
1792])
1793
1794dnl
1795dnl PHP_SETUP_OPENSSL(shared-add [, action-found])
1796dnl
1797dnl Common setup macro for openssl.
1798dnl
1799AC_DEFUN([PHP_SETUP_OPENSSL],[
1800  found_openssl=no
1801
1802  PKG_CHECK_MODULES([OPENSSL], [openssl >= 1.1.1], [found_openssl=yes])
1803
1804  if test "$found_openssl" = "yes"; then
1805    PHP_EVAL_LIBLINE([$OPENSSL_LIBS], [$1])
1806    PHP_EVAL_INCLINE([$OPENSSL_CFLAGS])
1807ifelse([$2],[],:,[$2])
1808  fi
1809])
1810
1811dnl
1812dnl PHP_SETUP_ICONV(shared-add [, action-found [, action-not-found]])
1813dnl
1814dnl Common setup macro for iconv.
1815dnl
1816AC_DEFUN([PHP_SETUP_ICONV], [
1817  found_iconv=no
1818  unset ICONV_DIR
1819  AH_TEMPLATE([HAVE_LIBICONV],
1820    [Define to 1 if you have the 'libiconv' function.])
1821
1822  dnl Check libc first if no path is provided in --with-iconv.
1823  AS_VAR_IF([PHP_ICONV], [yes], [
1824    dnl Reset LIBS temporarily as it may have already been included -liconv in.
1825    LIBS_save=$LIBS
1826    LIBS=
1827    AC_CHECK_FUNC([iconv], [found_iconv=yes],
1828      [AC_CHECK_FUNC([libiconv], [
1829        AC_DEFINE([HAVE_LIBICONV], [1])
1830        found_iconv=yes
1831      ])])
1832    LIBS=$LIBS_save
1833  ])
1834
1835  dnl Check external libs for iconv funcs.
1836  AS_VAR_IF([found_iconv], [no], [
1837    for i in $PHP_ICONV /usr/local /usr; do
1838      if test -r $i/include/gnu-libiconv/iconv.h; then
1839        ICONV_DIR=$i
1840        ICONV_INCLUDE_DIR=$i/include/gnu-libiconv
1841        iconv_lib_name=iconv
1842        break
1843      elif test -r $i/include/iconv.h; then
1844        ICONV_DIR=$i
1845        ICONV_INCLUDE_DIR=$i/include
1846        iconv_lib_name=iconv
1847        break
1848      fi
1849    done
1850
1851    AS_VAR_IF([ICONV_DIR],,
1852      [AC_MSG_ERROR(m4_text_wrap([
1853        Please specify the install prefix of iconv with --with-iconv=<DIR>
1854      ]))])
1855
1856    if test -f $ICONV_DIR/$PHP_LIBDIR/lib$iconv_lib_name.a ||
1857       test -f $ICONV_DIR/$PHP_LIBDIR/lib$iconv_lib_name.$SHLIB_SUFFIX_NAME ||
1858       test -f $ICONV_DIR/$PHP_LIBDIR/lib$iconv_lib_name.tbd
1859    then
1860      PHP_CHECK_LIBRARY([$iconv_lib_name], [libiconv], [
1861        found_iconv=yes
1862        AC_DEFINE([HAVE_LIBICONV], [1])
1863        AC_DEFINE([ICONV_ALIASED_LIBICONV], [1],
1864          [Define to 1 if 'iconv()' is aliased to 'libiconv()'.])
1865        ],
1866        [PHP_CHECK_LIBRARY([$iconv_lib_name], [iconv],
1867          [found_iconv=yes],
1868          [],
1869          [-L$ICONV_DIR/$PHP_LIBDIR])],
1870        [-L$ICONV_DIR/$PHP_LIBDIR])
1871    fi
1872  ])
1873
1874  if test "$found_iconv" = "yes"; then
1875    if test -n "$ICONV_DIR"; then
1876      PHP_ADD_LIBRARY_WITH_PATH([$iconv_lib_name],
1877        [$ICONV_DIR/$PHP_LIBDIR],
1878        [$1])
1879      PHP_ADD_INCLUDE([$ICONV_INCLUDE_DIR])
1880    fi
1881    $2
1882ifelse([$3],[],,[else $3])
1883  fi
1884])
1885
1886dnl
1887dnl PHP_SETUP_LIBXML(shared-add [, action-found])
1888dnl
1889dnl Common setup macro for libxml.
1890dnl
1891AC_DEFUN([PHP_SETUP_LIBXML], [
1892  PKG_CHECK_MODULES([LIBXML], [libxml-2.0 >= 2.9.4])
1893  PHP_EVAL_INCLINE([$LIBXML_CFLAGS])
1894  PHP_EVAL_LIBLINE([$LIBXML_LIBS], [$1])
1895  $2
1896])
1897
1898dnl
1899dnl PHP_SETUP_EXPAT([shared-add])
1900dnl
1901dnl Common setup macro for expat.
1902dnl
1903AC_DEFUN([PHP_SETUP_EXPAT], [
1904  PKG_CHECK_MODULES([EXPAT], [expat])
1905  PHP_EVAL_INCLINE([$EXPAT_CFLAGS])
1906  PHP_EVAL_LIBLINE([$EXPAT_LIBS], [$1])
1907  AC_DEFINE([HAVE_LIBEXPAT], [1],
1908    [Define to 1 if the system has the Expat XML parser library.])
1909])
1910
1911dnl
1912dnl PHP_SETUP_SQLITE([shared-add])
1913dnl
1914dnl Common setup macro for SQLite library.
1915dnl
1916AC_DEFUN([PHP_SETUP_SQLITE], [
1917PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.7.7], [
1918  PHP_EVAL_INCLINE([$SQLITE_CFLAGS])
1919  PHP_EVAL_LIBLINE([$SQLITE_LIBS], [$1])
1920])
1921])
1922
1923dnl
1924dnl PHP_SETUP_ZLIB(shared-add [, action-found, [action-not-found]])
1925dnl
1926dnl Common setup macro for zlib library. If zlib is not found on the system, the
1927dnl default error by PKG_CHECK_MODULES is emitted, unless the action-not-found
1928dnl is given.
1929dnl
1930AC_DEFUN([PHP_SETUP_ZLIB], [dnl
1931PKG_CHECK_MODULES([ZLIB], [zlib >= 1.2.11], [dnl
1932  PHP_EVAL_INCLINE([$ZLIB_CFLAGS])
1933  PHP_EVAL_LIBLINE([$ZLIB_LIBS], [$1])
1934  $2], [$3])dnl
1935])
1936
1937dnl
1938dnl PHP_SETUP_PGSQL([shared-add [, action-found [, action-not-found [, pgsql-dir]]]])
1939dnl
1940dnl Common setup macro for PostgreSQL library (libpq). The optional "pgsql-dir"
1941dnl is the PostgreSQL base install directory or the path to pg_config. Support
1942dnl for pkg-config was introduced in PostgreSQL 9.3. If library can't be found
1943dnl with pkg-config, check falls back to pg_config. If libpq is not found, error
1944dnl is thrown, unless the "action-not-found" is given.
1945dnl
1946AC_DEFUN([PHP_SETUP_PGSQL], [dnl
1947found_pgsql=no
1948dnl Set PostgreSQL installation directory if given from the configure argument.
1949AS_CASE([$4], [yes], [pgsql_dir=""], [pgsql_dir=$4])
1950AS_VAR_IF([pgsql_dir],,
1951  [PKG_CHECK_MODULES([PGSQL], [libpq >= 10.0],
1952    [found_pgsql=yes],
1953    [found_pgsql=no])])
1954
1955AS_VAR_IF([found_pgsql], [no], [dnl
1956  AC_MSG_CHECKING([for pg_config])
1957  for i in $pgsql_dir $pgsql_dir/bin /usr/local/pgsql/bin /usr/local/bin /usr/bin ""; do
1958    AS_IF([test -x $i/pg_config], [PG_CONFIG="$i/pg_config"; break;])
1959  done
1960
1961  AS_VAR_IF([PG_CONFIG],, [dnl
1962    AC_MSG_RESULT([not found])
1963    AS_VAR_IF([pgsql_dir],,
1964      [pgsql_search_paths="/usr /usr/local /usr/local/pgsql"],
1965      [pgsql_search_paths=$pgsql_dir])
1966
1967    for i in $pgsql_search_paths; do
1968      for j in include include/pgsql include/postgres include/postgresql ""; do
1969        AS_IF([test -r "$i/$j/libpq-fe.h"], [PGSQL_INCLUDE=$i/$j])
1970      done
1971
1972      for j in $PHP_LIBDIR lib $PHP_LIBDIR/pgsql $PHP_LIBDIR/postgres $PHP_LIBDIR/postgresql ""; do
1973        AS_IF([test -f "$i/$j/libpq.so" || test -f "$i/$j/libpq.a"],
1974          [PGSQL_LIBDIR=$i/$j])
1975      done
1976    done
1977  ], [dnl
1978    AC_MSG_RESULT([$PG_CONFIG])
1979    PGSQL_INCLUDE=$($PG_CONFIG --includedir)
1980    PGSQL_LIBDIR=$($PG_CONFIG --libdir)
1981  ])
1982
1983  AS_IF([test -n "$PGSQL_INCLUDE" && test -n "PGSQL_LIBDIR"], [
1984    found_pgsql=yes
1985    PGSQL_CFLAGS="-I$PGSQL_INCLUDE"
1986    PGSQL_LIBS="-L$PGSQL_LIBDIR -lpq"
1987  ])dnl
1988])
1989
1990AS_VAR_IF([found_pgsql], [yes], [dnl
1991  PHP_EVAL_INCLINE([$PGSQL_CFLAGS])
1992  PHP_EVAL_LIBLINE([$PGSQL_LIBS], [$1])
1993dnl PostgreSQL minimum version sanity check.
1994  PHP_CHECK_LIBRARY([pq], [PQencryptPasswordConn],,
1995    [AC_MSG_FAILURE([PostgreSQL check failed: libpq 10.0 or later is required.])],
1996  [$PGSQL_LIBS])
1997$2],
1998[m4_default([$3], [AC_MSG_FAILURE(m4_text_wrap([
1999  Cannot find libpq-fe.h or pq library (libpq). Please specify the correct
2000  PostgreSQL installation path with environment variables PGSQL_CFLAGS and
2001  PGSQL_LIBS or provide the PostgreSQL installation directory.
2002]))])])
2003])
2004
2005dnl ----------------------------------------------------------------------------
2006dnl Misc. macros
2007dnl ----------------------------------------------------------------------------
2008
2009dnl
2010dnl PHP_INSTALL_HEADERS(path [, files ...])
2011dnl
2012dnl Add PHP header files to the list to be installed on the system. The "files"
2013dnl argument is a blank-or-newline-separated list of header files or directories
2014dnl located in the "path". If 2nd argument is not given, it installs header
2015dnl files in all paths from the blank-or-newline-separated "path" argument.
2016dnl
2017AC_DEFUN([PHP_INSTALL_HEADERS],
2018  [m4_ifblank([$2], [
2019    for header_file in m4_normalize(m4_expand([$1])); do
2020      PHP_RUN_ONCE([INSTALLHEADERS], [$header_file],
2021        [INSTALL_HEADERS="$INSTALL_HEADERS $header_file"])
2022    done
2023  ], [
2024    header_path=$1
2025    for header_file in m4_normalize(m4_expand([$2])); do
2026      hp_hf="$header_path/$header_file"
2027      PHP_RUN_ONCE([INSTALLHEADERS], [$hp_hf],
2028        [INSTALL_HEADERS="$INSTALL_HEADERS $hp_hf"])
2029    done
2030  ])
2031])
2032
2033dnl
2034dnl PHP_AP_EXTRACT_VERSION(/path/httpd)
2035dnl
2036dnl This macro is used to get a comparable version for Apache.
2037dnl
2038AC_DEFUN([PHP_AP_EXTRACT_VERSION], [m4_warn([obsolete],
2039  [The macro 'PHP_AP_EXTRACT_VERSION' is obsolete. Use 'apxs -q HTTPD_VERSION'])
2040AS_IF([test -x "$1"], [
2041  ac_output=$($1 -v 2>&1 | grep version | $SED -e 's/Oracle-HTTP-//')
2042  ac_IFS=$IFS
2043IFS="- /.
2044"
2045  set $ac_output
2046  IFS=$ac_IFS
2047
2048  APACHE_VERSION=$(expr [$]4 \* 1000000 + [$]5 \* 1000 + [$]6)
2049])
2050])
2051
2052dnl
2053dnl PHP_CONFIG_NICE(filename)
2054dnl
2055dnl This macro creates script file with given filename which includes the last
2056dnl configure command run by user. This file is named 'config.nice' in PHP.
2057dnl
2058AC_DEFUN([PHP_CONFIG_NICE],[
2059  AC_REQUIRE([AC_PROG_EGREP])
2060  AC_REQUIRE([AC_PROG_SED])
2061  PHP_SUBST_OLD([EGREP])
2062  PHP_SUBST_OLD([SED])
2063  test -f $1 && mv $1 $1.old
2064  rm -f $1.old
2065  cat >$1<<EOF
2066#! /bin/sh
2067#
2068# Created by configure
2069
2070EOF
2071
2072  clean_configure_args=$ac_configure_args
2073  for var in CFLAGS CXXFLAGS CPPFLAGS LDFLAGS EXTRA_LDFLAGS_PROGRAM LIBS CC CXX; do
2074    eval val=\$$var
2075    if test -n "$val"; then
2076      echo "$var='$val' \\" >> $1
2077      if test $(expr "X$ac_configure_args" : ".*${var}.*") != 0; then
2078        clean_configure_args=$(echo $clean_configure_args | $SED -e "s#'$var=$val'##")
2079      fi
2080    fi
2081  done
2082
2083  echo "'[$]0' \\" >> $1
2084  if test $(expr " [$]0" : " '.*") = 0; then
2085    CONFIGURE_COMMAND="$CONFIGURE_COMMAND '[$]0'"
2086  else
2087    CONFIGURE_COMMAND="$CONFIGURE_COMMAND [$]0"
2088  fi
2089  CONFIGURE_ARGS="$clean_configure_args"
2090  while test "X$CONFIGURE_ARGS" != "X";
2091  do
2092   if CURRENT_ARG=$(expr "X$CONFIGURE_ARGS" : "X *\('[[^']]*'\)")
2093   then
2094     CONFIGURE_ARGS=$(expr "X$CONFIGURE_ARGS" : "X *'[[^']]*' \(.*\)")
2095   elif CURRENT_ARG=$(expr "X$CONFIGURE_ARGS" : "X *\([[^ ]]*\)")
2096   then
2097     CONFIGURE_ARGS=$(expr "X$CONFIGURE_ARGS" : "X *[[^ ]]* \(.*\)")
2098     CURRENT_ARG="'$CURRENT_ARG'"
2099   else
2100    break
2101   fi
2102   AS_ECHO(["$CURRENT_ARG \\"]) >>$1
2103   CONFIGURE_OPTIONS="$CONFIGURE_OPTIONS $CURRENT_ARG"
2104  done
2105  echo '"[$]@"' >> $1
2106  chmod +x $1
2107  CONFIGURE_COMMAND="$CONFIGURE_COMMAND $CONFIGURE_OPTIONS"
2108  AC_SUBST([CONFIGURE_COMMAND])
2109  AC_SUBST([CONFIGURE_OPTIONS])
2110])
2111
2112dnl
2113dnl PHP_CHECK_PDO_INCLUDES([found [, not-found]])
2114dnl
2115AC_DEFUN([PHP_CHECK_PDO_INCLUDES],[
2116  AC_CACHE_CHECK([for PDO includes], pdo_cv_inc_path, [
2117    if test -f $abs_srcdir/ext/pdo/php_pdo_driver.h; then
2118      pdo_cv_inc_path=$abs_srcdir/ext
2119    elif test -f $phpincludedir/ext/pdo/php_pdo_driver.h; then
2120      pdo_cv_inc_path=$phpincludedir/ext
2121    fi
2122  ])
2123  if test -n "$pdo_cv_inc_path"; then
2124ifelse([$1],[],:,[$1])
2125  else
2126ifelse([$2],[],[AC_MSG_ERROR([Cannot find php_pdo_driver.h.])],[$2])
2127  fi
2128])
2129
2130dnl
2131dnl PHP_DETECT_ICC
2132dnl
2133dnl Detect Intel C++ Compiler and unset $GCC if ICC found.
2134dnl
2135AC_DEFUN([PHP_DETECT_ICC],
2136[
2137  ICC="no"
2138  AC_MSG_CHECKING([for icc])
2139  AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
2140    ICC="no"
2141    AC_MSG_RESULT([no]),
2142    ICC="yes"
2143    GCC="no"
2144    AC_MSG_RESULT([yes])
2145  )
2146])
2147
2148dnl
2149dnl PHP_DETECT_SUNCC
2150dnl
2151dnl Detect if the systems default compiler is suncc. We also set some useful
2152dnl CFLAGS if the user didn't set any.
2153dnl
2154AC_DEFUN([PHP_DETECT_SUNCC],[
2155  SUNCC="no"
2156  AC_MSG_CHECKING([for suncc])
2157  AC_EGREP_CPP([^__SUNPRO_C], [__SUNPRO_C],
2158    SUNCC="no"
2159    AC_MSG_RESULT([no]),
2160    SUNCC="yes"
2161    GCC="no"
2162    test -n "$auto_cflags" && CFLAGS="-O -xs -xstrconst -zlazyload"
2163    GCC=""
2164    AC_MSG_RESULT([yes])
2165  )
2166])
2167
2168dnl
2169dnl PHP_CRYPT_R_STYLE
2170dnl
2171dnl Detect the style of crypt_r() if any is available.
2172dnl See APR_CHECK_CRYPT_R_STYLE() for original version.
2173dnl
2174AC_DEFUN([PHP_CRYPT_R_STYLE],
2175[AC_CACHE_CHECK([which data struct is used by crypt_r], [php_cv_crypt_r_style],
2176[php_cv_crypt_r_style=none
2177AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
2178#define _REENTRANT 1
2179#include <crypt.h>
2180], [
2181CRYPTD buffer;
2182crypt_r("passwd", "hash", &buffer);
2183])], [php_cv_crypt_r_style=cryptd], [])
2184
2185AS_VAR_IF([php_cv_crypt_r_style], [none],
2186  [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
2187#define _REENTRANT 1
2188#include <crypt.h>
2189],[
2190struct crypt_data buffer;
2191crypt_r("passwd", "hash", &buffer);
2192])], [php_cv_crypt_r_style=struct_crypt_data], [])])
2193
2194AS_VAR_IF([php_cv_crypt_r_style], [none],
2195  [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
2196#define _REENTRANT 1
2197#ifndef _GNU_SOURCE
2198#define _GNU_SOURCE
2199#endif
2200#include <crypt.h>
2201],[
2202struct crypt_data buffer;
2203crypt_r("passwd", "hash", &buffer);
2204])], [php_cv_crypt_r_style=struct_crypt_data_gnu_source], [])])
2205
2206AS_VAR_IF([php_cv_crypt_r_style], [none],
2207[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
2208#include <stdlib.h>
2209#include <unistd.h>
2210],[
2211struct crypt_data buffer;
2212crypt_r("passwd", "hash", &buffer);
2213])], [php_cv_crypt_r_style=struct_crypt_data], [])])
2214])
2215
2216AS_VAR_IF([php_cv_crypt_r_style], [cryptd],
2217  [AC_DEFINE([CRYPT_R_CRYPTD], [1], [Define to 1 if crypt_r uses CRYPTD.])])
2218
2219AS_CASE([$php_cv_crypt_r_style],
2220  [struct_crypt_data|struct_crypt_data_gnu_source],
2221    [AC_DEFINE([CRYPT_R_STRUCT_CRYPT_DATA], [1],
2222      [Define to 1 if crypt_r uses struct crypt_data.])])
2223
2224AS_VAR_IF([php_cv_crypt_r_style], [struct_crypt_data_gnu_source],
2225  [AC_DEFINE([CRYPT_R_GNU_SOURCE], [1],
2226    [Define to 1 if struct crypt_data requires _GNU_SOURCE.])])
2227
2228AS_VAR_IF([php_cv_crypt_r_style], [none],
2229  [AC_MSG_FAILURE([Unable to detect data struct used by crypt_r.])])
2230])
2231
2232dnl
2233dnl PHP_TEST_WRITE_STDOUT
2234dnl
2235AC_DEFUN([PHP_TEST_WRITE_STDOUT],
2236[AC_CACHE_CHECK([whether writing to stdout works], [php_cv_have_write_stdout],
2237  [AC_RUN_IFELSE([AC_LANG_SOURCE([
2238#ifdef HAVE_UNISTD_H
2239#include <unistd.h>
2240#endif
2241
2242#define TEXT "This is the test message -- "
2243
2244int main(void)
2245{
2246  int n;
2247
2248  n = write(1, TEXT, sizeof(TEXT)-1);
2249  return (!(n == sizeof(TEXT)-1));
2250}
2251    ])],
2252    [php_cv_have_write_stdout=yes],
2253    [php_cv_have_write_stdout=no],
2254    [AS_CASE([$host_alias],
2255      [*linux*|*midipix], [php_cv_have_write_stdout=yes],
2256      [php_cv_have_write_stdout=no])])])
2257AS_VAR_IF([php_cv_have_write_stdout], [yes],
2258  [AC_DEFINE([PHP_WRITE_STDOUT], [1], [Define to 1 if 'write(2)' works.])])
2259])
2260
2261dnl
2262dnl PHP_INIT_DTRACE(providerdesc, header-file, sources [, module])
2263dnl
2264dnl Initialize the DTrace support using the DTrace "providerdesc" file and
2265dnl generate "header-file". The "sources" is a blank-or-newline-separated list
2266dnl of files. The optional "module" is PHP extension name or path when used in
2267dnl extensions.
2268dnl
2269AC_DEFUN([PHP_INIT_DTRACE],
2270[AC_CHECK_HEADER([sys/sdt.h],,
2271  [AC_MSG_FAILURE([Cannot find required <sys/sdt.h> to enable DTrace support.])])
2272
2273dnl Set paths properly when called from extension.
2274  case "$4" in
2275    ""[)] ac_srcdir="$abs_srcdir/"; unset ac_bdir;;
2276    /*[)] ac_srcdir=$(echo "$4"|cut -c 2-)"/"; ac_bdir=$ac_srcdir;;
2277    *[)] ac_srcdir="$abs_srcdir/$1/"; ac_bdir="$4/";;
2278  esac
2279
2280dnl providerdesc.
2281  ac_provsrc=$1
2282  old_IFS=[$]IFS
2283  IFS=.
2284  set $ac_provsrc
2285  ac_provobj=[$]1
2286  IFS=$old_IFS
2287
2288dnl header-file.
2289  ac_hdrobj=$2
2290
2291dnl Add providerdesc.o or .lo into global objects when needed.
2292  case $host_alias in
2293  *freebsd*)
2294    PHP_GLOBAL_OBJS="[$]PHP_GLOBAL_OBJS [$]ac_bdir[$]ac_provsrc.lo"
2295    PHP_LDFLAGS="$PHP_LDFLAGS -lelf"
2296    ;;
2297  *solaris*)
2298    PHP_GLOBAL_OBJS="[$]PHP_GLOBAL_OBJS [$]ac_bdir[$]ac_provsrc.lo"
2299    ;;
2300  *linux*)
2301    PHP_GLOBAL_OBJS="[$]PHP_GLOBAL_OBJS [$]ac_bdir[$]ac_provsrc.lo"
2302    ;;
2303  esac
2304
2305dnl DTrace objects.
2306  old_IFS=[$]IFS
2307  for ac_src in m4_normalize([$3]); do
2308    IFS=.
2309    set $ac_src
2310    ac_obj=[$]1
2311    IFS=$old_IFS
2312
2313    PHP_DTRACE_OBJS="[$]PHP_DTRACE_OBJS [$]ac_bdir[$]ac_obj.lo"
2314  done;
2315
2316  case [$]php_sapi_module in
2317  shared[)]
2318    for ac_lo in $PHP_DTRACE_OBJS; do
2319      dtrace_objs="[$]dtrace_objs $(echo $ac_lo | $SED -e 's,\.lo$,.o,' -e 's#\(.*\)\/#\1\/.libs\/#')"
2320    done;
2321    ;;
2322  *[)]
2323    dtrace_objs='$(PHP_DTRACE_OBJS:.lo=.o)'
2324    ;;
2325  esac
2326
2327dnl Generate Makefile.objects entries. The empty $ac_provsrc command stops an
2328dnl implicit circular dependency in GNU Make which causes the .d file to be
2329dnl overwritten (Bug 61268).
2330  cat>>Makefile.objects<<EOF
2331
2332$abs_srcdir/$ac_provsrc:;
2333
2334$ac_bdir[$]ac_hdrobj: $abs_srcdir/$ac_provsrc
2335	CC="\$(CC)" CFLAGS="\$(CFLAGS_CLEAN)" dtrace -h -C -s $ac_srcdir[$]ac_provsrc -o \$[]@.bak && \$(SED) -e 's,PHP_,DTRACE_,g' \$[]@.bak > \$[]@
2336
2337\$(PHP_DTRACE_OBJS): $ac_bdir[$]ac_hdrobj
2338
2339EOF
2340
2341  case $host_alias in
2342  *solaris*|*linux*|*freebsd*)
2343    dtrace_prov_name="$(echo $ac_provsrc | $SED -e 's#\(.*\)\/##').o"
2344    dtrace_lib_dir="$(echo $ac_bdir[$]ac_provsrc | $SED -e 's#\(.*\)/[^/]*#\1#')/.libs"
2345    dtrace_d_obj="$(echo $ac_bdir[$]ac_provsrc | $SED -e 's#\(.*\)/\([^/]*\)#\1/.libs/\2#').o"
2346    dtrace_nolib_objs='$(PHP_DTRACE_OBJS:.lo=.o)'
2347    for ac_lo in $PHP_DTRACE_OBJS; do
2348      dtrace_lib_objs="[$]dtrace_lib_objs $(echo $ac_lo | $SED -e 's,\.lo$,.o,' -e 's#\(.*\)\/#\1\/.libs\/#')"
2349    done;
2350    dnl Always attempt to create both PIC and non-PIC DTrace objects (Bug 63692)
2351    cat>>Makefile.objects<<EOF
2352$ac_bdir[$]ac_provsrc.lo: \$(PHP_DTRACE_OBJS)
2353	echo "[#] Generated by Makefile for libtool" > \$[]@
2354	@test -d "$dtrace_lib_dir" || mkdir $dtrace_lib_dir
2355	if CC="\$(CC)" CFLAGS="\$(CFLAGS_CLEAN)" dtrace -G -o $dtrace_d_obj -s $abs_srcdir/$ac_provsrc $dtrace_lib_objs 2> /dev/null && test -f "$dtrace_d_obj"; then [\\]
2356	  echo "pic_object=['].libs/$dtrace_prov_name[']" >> \$[]@ [;\\]
2357	else [\\]
2358	  echo "pic_object='none'" >> \$[]@ [;\\]
2359	fi
2360	if CC="\$(CC)" CFLAGS="\$(CFLAGS_CLEAN)" dtrace -G -o $ac_bdir[$]ac_provsrc.o -s $abs_srcdir/$ac_provsrc $dtrace_nolib_objs 2> /dev/null && test -f "$ac_bdir[$]ac_provsrc.o"; then [\\]
2361	  echo "non_pic_object=[']$dtrace_prov_name[']" >> \$[]@ [;\\]
2362	else [\\]
2363	  echo "non_pic_object='none'" >> \$[]@ [;\\]
2364	fi
2365
2366EOF
2367
2368    ;;
2369  *)
2370cat>>Makefile.objects<<EOF
2371$ac_bdir[$]ac_provsrc.o: \$(PHP_DTRACE_OBJS)
2372	CC="\$(CC)" CFLAGS="\$(CFLAGS_CLEAN)" dtrace -G -o \$[]@ -s $abs_srcdir/$ac_provsrc $dtrace_objs
2373
2374EOF
2375    ;;
2376  esac
2377
2378PHP_SUBST([PHP_DTRACE_OBJS])
2379])
2380
2381dnl
2382dnl PHP_CHECK_STDINT_TYPES
2383dnl
2384AC_DEFUN([PHP_CHECK_STDINT_TYPES], [
2385  AC_CHECK_SIZEOF([int])
2386  AC_CHECK_SIZEOF([long])
2387  AC_CHECK_SIZEOF([long long])
2388  AC_CHECK_SIZEOF([size_t])
2389  AC_CHECK_SIZEOF([off_t])
2390])
2391
2392dnl
2393dnl PHP_CHECK_BUILTIN(builtin)
2394dnl
2395dnl Check GNU C builtin "builtin" and define the CPP macro
2396dnl PHP_HAVE_<BUILTIN_WITHOUT_LEADING_UNDERSCORES> to 1 if found.
2397dnl
2398AC_DEFUN([PHP_CHECK_BUILTIN],
2399[AS_VAR_PUSHDEF([php_var], [php_cv_have_$1])
2400AC_CACHE_CHECK([for $1], [php_var],
2401[AC_LINK_IFELSE([AC_LANG_SOURCE([int main(void) { m4_case([$1],
2402  [__builtin_clz], [return $1(1) ? 1 : 0;],
2403  [__builtin_clzl], [return $1(1) ? 1 : 0;],
2404  [__builtin_clzll], [return $1(1) ? 1 : 0;],
2405  [__builtin_cpu_init], [$1();],
2406  [__builtin_cpu_supports], [return $1("sse")? 1 : 0;],
2407  [__builtin_ctzl], [return $1(2L) ? 1 : 0;],
2408  [__builtin_ctzll], [return $1(2LL) ? 1 : 0;],
2409  [__builtin_expect], [return $1(1,1) ? 1 : 0;],
2410  [__builtin_frame_address], [return $1(0) != (void*)0;],
2411  [__builtin_saddl_overflow], [long tmpvar; return $1(3, 7, &tmpvar);],
2412  [__builtin_saddll_overflow], [long long tmpvar; return $1(3, 7, &tmpvar);],
2413  [__builtin_smull_overflow], [long tmpvar; return $1(3, 7, &tmpvar);],
2414  [__builtin_smulll_overflow], [long long tmpvar; return $1(3, 7, &tmpvar);],
2415  [__builtin_ssubl_overflow], [long tmpvar; return $1(3, 7, &tmpvar);],
2416  [__builtin_ssubll_overflow], [long long tmpvar; return $1(3, 7, &tmpvar);],
2417  [__builtin_unreachable], [$1();],
2418  [__builtin_usub_overflow], [unsigned int tmpvar; return $1(3, 7, &tmpvar);],
2419  [
2420    m4_warn([syntax], [Unsupported builtin '$1', the test may fail.])
2421    $1();
2422  ]) return 0; }])],
2423[AS_VAR_SET([php_var], [yes])],
2424[AS_VAR_SET([php_var], [no])])
2425])
2426AS_VAR_IF([php_var], [yes],
2427  [AC_DEFINE_UNQUOTED(AS_TR_CPP([PHP_HAVE_]m4_bpatsubst([$1], [^_*], [])), [1],
2428    [Define to 1 if the compiler supports '$1'.])])
2429AS_VAR_POPDEF([php_var])
2430])
2431
2432dnl
2433dnl PHP_PATCH_CONFIG_HEADERS([FILE])
2434dnl
2435dnl PACKAGE_* symbols are automatically defined by Autoconf. When including
2436dnl configuration header, warnings about redefined symbols are emitted for such
2437dnl symbols if they are defined by multiple libraries. This disables all
2438dnl PACKAGE_* symbols in the generated configuration header template FILE. For
2439dnl example, main/php_config.h.in for PHP or config.h.in for PHP extensions.
2440dnl
2441AC_DEFUN([PHP_PATCH_CONFIG_HEADERS], [
2442  AC_MSG_NOTICE([patching $1])
2443
2444  $SED -e 's/^#undef PACKAGE_[^ ]*/\/\* & \*\//g' < $srcdir/$1 \
2445    > $srcdir/$1.tmp && mv $srcdir/$1.tmp $srcdir/$1
2446])
2447
2448dnl
2449dnl PHP_CHECK_AVX512_SUPPORTS
2450dnl
2451dnl Check whether the compiler supports the AVX-512 extensions and define
2452dnl PHP_HAVE_AVX512_SUPPORTS to 1 if found. Note that this is a compiler check,
2453dnl not a runtime check where additional adjustments are done in the C code.
2454dnl
2455AC_DEFUN([PHP_CHECK_AVX512_SUPPORTS],
2456[AC_CACHE_CHECK([whether compiler supports AVX-512],
2457[php_cv_have_avx512],
2458[save_CFLAGS="$CFLAGS"
2459CFLAGS="-mavx512f -mavx512cd -mavx512vl -mavx512dq -mavx512bw $CFLAGS"
2460AC_LINK_IFELSE([AC_LANG_SOURCE([[
2461  #include <immintrin.h>
2462  int main(void) {
2463    __m512i mask = _mm512_set1_epi32(0x1);
2464    char out[32];
2465    _mm512_storeu_si512(out, _mm512_shuffle_epi8(mask, mask));
2466    return 0;
2467  }]])],
2468  [php_cv_have_avx512=yes],
2469  [php_cv_have_avx512=no])
2470CFLAGS="$save_CFLAGS"
2471])
2472AS_VAR_IF([php_cv_have_avx512], [yes],
2473  [AC_DEFINE([PHP_HAVE_AVX512_SUPPORTS], [1],
2474    [Define to 1 if the compiler supports AVX-512.])])
2475])
2476
2477dnl
2478dnl PHP_CHECK_AVX512_VBMI_SUPPORTS
2479dnl
2480dnl Check whether the compiler supports the AVX-512 extensions with the VBMI
2481dnl instruction set and define PHP_HAVE_AVX512_VBMI_SUPPORTS to 1 if found. Note
2482dnl that this is a compiler check, not a runtime check where additional
2483dnl adjustments are done in the C code.
2484dnl
2485AC_DEFUN([PHP_CHECK_AVX512_VBMI_SUPPORTS],
2486[AC_CACHE_CHECK([whether compiler supports AVX-512 VBMI],
2487[php_cv_have_avx512vbmi],
2488[save_CFLAGS="$CFLAGS"
2489CFLAGS="-mavx512f -mavx512cd -mavx512vl -mavx512dq -mavx512bw -mavx512vbmi $CFLAGS"
2490AC_LINK_IFELSE([AC_LANG_SOURCE([[
2491  #include <immintrin.h>
2492  int main(void) {
2493    __m512i mask = _mm512_set1_epi32(0x1);
2494    char out[32];
2495    _mm512_storeu_si512(out, _mm512_permutexvar_epi8(mask, mask));
2496    return 0;
2497  }]])],
2498  [php_cv_have_avx512vbmi=yes],
2499  [php_cv_have_avx512vbmi=no])
2500CFLAGS="$save_CFLAGS"
2501])
2502AS_VAR_IF([php_cv_have_avx512vbmi], [yes],
2503  [AC_DEFINE([PHP_HAVE_AVX512_VBMI_SUPPORTS], [1],
2504    [Define to 1 if the compiler supports AVX-512 VBMI.])])
2505])
2506
2507dnl
2508dnl PHP_CHECK_VARIABLE_ATTRIBUTE(attribute)
2509dnl
2510dnl Check whether the compiler supports the GNU C variable attribute.
2511dnl
2512AC_DEFUN([PHP_CHECK_VARIABLE_ATTRIBUTE],
2513[AS_VAR_PUSHDEF([php_var], [php_cv_have_variable_attribute_$1])
2514AC_CACHE_CHECK([for variable __attribute__(($1))], [php_var],
2515[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([m4_case([$1],
2516  [aligned],
2517    [unsigned char test[32] __attribute__(($1(__alignof__(int))));],
2518  [
2519    m4_warn([syntax], [Unsupported variable attribute $1, the test may fail])
2520    int var __attribute__(($1));
2521  ])],
2522  [])],
2523dnl By default, compilers may not classify attribute warnings as errors
2524dnl (-Werror=attributes) when encountering an unknown attribute. Accept the
2525dnl attribute only if no warnings were generated.
2526  [AS_IF([test -s conftest.err],
2527    [AS_VAR_SET([php_var], [no])],
2528    [AS_VAR_SET([php_var], [yes])])],
2529  [AS_VAR_SET([php_var], [no])])
2530])
2531AS_VAR_IF([php_var], [yes],
2532  [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_ATTRIBUTE_$1]), [1],
2533    [Define to 1 if the compiler supports the '$1' variable attribute.])])
2534AS_VAR_POPDEF([php_var])
2535])
2536
2537dnl
2538dnl PHP_REMOVE_OPTIMIZATION_FLAGS
2539dnl
2540dnl Removes known compiler optimization flags like -O, -O0, -O1, ..., -Ofast
2541dnl from CFLAGS and CXXFLAGS.
2542dnl
2543AC_DEFUN([PHP_REMOVE_OPTIMIZATION_FLAGS], [
2544  sed_script='s/\([[\t ]]\|^\)-O\([[0-9gsz]]\|fast\|\)\([[\t ]]\|$\)/\1/g'
2545  CFLAGS=$(echo "$CFLAGS" | $SED -e "$sed_script")
2546  CXXFLAGS=$(echo "$CXXFLAGS" | $SED -e "$sed_script")
2547])
2548