xref: /PHP-7.4/sapi/fpm/config.m4 (revision b64a1822)
1PHP_ARG_ENABLE([fpm],,
2  [AS_HELP_STRING([--enable-fpm],
3    [Enable building of the fpm SAPI executable])],
4  [no],
5  [no])
6
7dnl Configure checks.
8AC_DEFUN([AC_FPM_STDLIBS],
9[
10  AC_CHECK_FUNCS(clearenv setproctitle setproctitle_fast)
11
12  AC_SEARCH_LIBS(socket, socket)
13  AC_SEARCH_LIBS(inet_addr, nsl)
14])
15
16AC_DEFUN([AC_FPM_PRCTL],
17[
18  AC_MSG_CHECKING([for prctl])
19
20  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/prctl.h>]], [[prctl(0, 0, 0, 0, 0);]])], [
21    AC_DEFINE([HAVE_PRCTL], 1, [do we have prctl?])
22    AC_MSG_RESULT([yes])
23  ], [
24    AC_MSG_RESULT([no])
25  ])
26])
27
28AC_DEFUN([AC_FPM_CLOCK],
29[
30  have_clock_gettime=no
31
32  AC_MSG_CHECKING([for clock_gettime])
33
34  AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <time.h>]], [[struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts);]])], [
35    have_clock_gettime=yes
36    AC_MSG_RESULT([yes])
37  ], [
38    AC_MSG_RESULT([no])
39  ])
40
41  if test "$have_clock_gettime" = "no"; then
42    AC_MSG_CHECKING([for clock_gettime in -lrt])
43
44    SAVED_LIBS="$LIBS"
45    LIBS="$LIBS -lrt"
46
47    AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <time.h>]], [[struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts);]])], [
48      have_clock_gettime=yes
49      AC_MSG_RESULT([yes])
50    ], [
51      LIBS="$SAVED_LIBS"
52      AC_MSG_RESULT([no])
53    ])
54  fi
55
56  if test "$have_clock_gettime" = "yes"; then
57    AC_DEFINE([HAVE_CLOCK_GETTIME], 1, [do we have clock_gettime?])
58  fi
59
60  have_clock_get_time=no
61
62  if test "$have_clock_gettime" = "no"; then
63    AC_MSG_CHECKING([for clock_get_time])
64
65    AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <mach/mach.h>
66      #include <mach/clock.h>
67      #include <mach/mach_error.h>
68
69      int main()
70      {
71        kern_return_t ret; clock_serv_t aClock; mach_timespec_t aTime;
72        ret = host_get_clock_service(mach_host_self(), REALTIME_CLOCK, &aClock);
73
74        if (ret != KERN_SUCCESS) {
75          return 1;
76        }
77
78        ret = clock_get_time(aClock, &aTime);
79        if (ret != KERN_SUCCESS) {
80          return 2;
81        }
82
83        return 0;
84      }
85    ]])], [
86      have_clock_get_time=yes
87      AC_MSG_RESULT([yes])
88    ], [
89      AC_MSG_RESULT([no])
90    ], [AC_MSG_RESULT([no (cross-compiling)])])
91  fi
92
93  if test "$have_clock_get_time" = "yes"; then
94    AC_DEFINE([HAVE_CLOCK_GET_TIME], 1, [do we have clock_get_time?])
95  fi
96])
97
98AC_DEFUN([AC_FPM_TRACE],
99[
100  have_ptrace=no
101  have_broken_ptrace=no
102
103  AC_MSG_CHECKING([for ptrace])
104
105  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
106    #include <sys/types.h>
107    #include <sys/ptrace.h> ]], [[ptrace(0, 0, (void *) 0, 0);]])], [
108    have_ptrace=yes
109    AC_MSG_RESULT([yes])
110  ], [
111    AC_MSG_RESULT([no])
112  ])
113
114  if test "$have_ptrace" = "yes"; then
115    AC_MSG_CHECKING([whether ptrace works])
116
117    AC_RUN_IFELSE([AC_LANG_SOURCE([[
118      #include <unistd.h>
119      #include <signal.h>
120      #include <sys/wait.h>
121      #include <sys/types.h>
122      #include <sys/ptrace.h>
123      #include <errno.h>
124
125      #if !defined(PTRACE_ATTACH) && defined(PT_ATTACH)
126      #define PTRACE_ATTACH PT_ATTACH
127      #endif
128
129      #if !defined(PTRACE_DETACH) && defined(PT_DETACH)
130      #define PTRACE_DETACH PT_DETACH
131      #endif
132
133      #if !defined(PTRACE_PEEKDATA) && defined(PT_READ_D)
134      #define PTRACE_PEEKDATA PT_READ_D
135      #endif
136
137      int main()
138      {
139        long v1 = (unsigned int) -1; /* copy will fail if sizeof(long) == 8 and we've got "int ptrace()" */
140        long v2;
141        pid_t child;
142        int status;
143
144        if ( (child = fork()) ) { /* parent */
145          int ret = 0;
146
147          if (0 > ptrace(PTRACE_ATTACH, child, 0, 0)) {
148            return 2;
149          }
150
151          waitpid(child, &status, 0);
152
153      #ifdef PT_IO
154          struct ptrace_io_desc ptio = {
155            .piod_op = PIOD_READ_D,
156            .piod_offs = &v1,
157            .piod_addr = &v2,
158            .piod_len = sizeof(v1)
159          };
160
161          if (0 > ptrace(PT_IO, child, (void *) &ptio, 0)) {
162            ret = 3;
163          }
164      #else
165          errno = 0;
166
167          v2 = ptrace(PTRACE_PEEKDATA, child, (void *) &v1, 0);
168
169          if (errno) {
170            ret = 4;
171          }
172      #endif
173          ptrace(PTRACE_DETACH, child, (void *) 1, 0);
174
175          kill(child, SIGKILL);
176
177          return ret ? ret : (v1 != v2);
178        }
179        else { /* child */
180          sleep(10);
181          return 0;
182        }
183      }
184    ]])], [
185      AC_MSG_RESULT([yes])
186    ], [
187      have_ptrace=no
188      have_broken_ptrace=yes
189      AC_MSG_RESULT([no])
190    ], [
191      AC_MSG_RESULT([skipped (cross-compiling)])
192    ])
193  fi
194
195  if test "$have_ptrace" = "yes"; then
196    AC_DEFINE([HAVE_PTRACE], 1, [do we have ptrace?])
197  fi
198
199  have_mach_vm_read=no
200
201  if test "$have_broken_ptrace" = "yes"; then
202    AC_MSG_CHECKING([for mach_vm_read])
203
204    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <mach/mach.h>
205      #include <mach/mach_vm.h>
206    ]], [[
207      mach_vm_read((vm_map_t)0, (mach_vm_address_t)0, (mach_vm_size_t)0, (vm_offset_t *)0, (mach_msg_type_number_t*)0);
208    ]])], [
209      have_mach_vm_read=yes
210      AC_MSG_RESULT([yes])
211    ], [
212      AC_MSG_RESULT([no])
213    ])
214  fi
215
216  if test "$have_mach_vm_read" = "yes"; then
217    AC_DEFINE([HAVE_MACH_VM_READ], 1, [do we have mach_vm_read?])
218  fi
219
220  proc_mem_file=""
221
222  if test -r /proc/$$/mem ; then
223    proc_mem_file="mem"
224  else
225    if test -r /proc/$$/as ; then
226      proc_mem_file="as"
227    fi
228  fi
229
230  if test -n "$proc_mem_file" ; then
231    AC_MSG_CHECKING([for proc mem file])
232
233    AC_RUN_IFELSE([AC_LANG_SOURCE([[
234      #define _GNU_SOURCE
235      #define _FILE_OFFSET_BITS 64
236      #include <stdint.h>
237      #include <unistd.h>
238      #include <sys/types.h>
239      #include <sys/stat.h>
240      #include <fcntl.h>
241      #include <stdio.h>
242      int main()
243      {
244        long v1 = (unsigned int) -1, v2 = 0;
245        char buf[128];
246        int fd;
247        sprintf(buf, "/proc/%d/$proc_mem_file", getpid());
248        fd = open(buf, O_RDONLY);
249        if (0 > fd) {
250          return 1;
251        }
252        if (sizeof(long) != pread(fd, &v2, sizeof(long), (uintptr_t) &v1)) {
253          close(fd);
254          return 1;
255        }
256        close(fd);
257        return v1 != v2;
258      }
259    ]])], [
260      AC_MSG_RESULT([$proc_mem_file])
261    ], [
262      proc_mem_file=""
263      AC_MSG_RESULT([no])
264    ], [
265      AC_MSG_RESULT([skipped (cross-compiling)])
266    ])
267  fi
268
269  if test -n "$proc_mem_file"; then
270    AC_DEFINE_UNQUOTED([PROC_MEM_FILE], "$proc_mem_file", [/proc/pid/mem interface])
271  fi
272
273  fpm_trace_type=""
274
275  if test "$have_ptrace" = "yes"; then
276    fpm_trace_type=ptrace
277
278  elif test -n "$proc_mem_file"; then
279    fpm_trace_type=pread
280
281  elif test "$have_mach_vm_read" = "yes" ; then
282    fpm_trace_type=mach
283
284  else
285    AC_MSG_WARN([FPM Trace - ptrace, pread, or mach: could not be found])
286  fi
287
288])
289
290AC_DEFUN([AC_FPM_BUILTIN_ATOMIC],
291[
292  AC_MSG_CHECKING([if gcc supports __sync_bool_compare_and_swap])
293  AC_LINK_IFELSE([AC_LANG_PROGRAM([], [[
294    int variable = 1;
295    return (__sync_bool_compare_and_swap(&variable, 1, 2)
296           && __sync_add_and_fetch(&variable, 1)) ? 1 : 0;
297  ]])], [
298    AC_MSG_RESULT([yes])
299    AC_DEFINE(HAVE_BUILTIN_ATOMIC, 1, [Define to 1 if gcc supports __sync_bool_compare_and_swap() a.o.])
300  ], [
301    AC_MSG_RESULT([no])
302  ])
303])
304
305AC_DEFUN([AC_FPM_LQ],
306[
307  have_lq=no
308
309  AC_MSG_CHECKING([for TCP_INFO])
310
311  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <netinet/tcp.h>]], [[struct tcp_info ti; int x = TCP_INFO;]])], [
312    have_lq=tcp_info
313    AC_MSG_RESULT([yes])
314  ], [
315    AC_MSG_RESULT([no])
316  ])
317
318  if test "$have_lq" = "tcp_info"; then
319    AC_DEFINE([HAVE_LQ_TCP_INFO], 1, [do we have TCP_INFO?])
320  fi
321
322  if test "$have_lq" = "no" ; then
323    AC_MSG_CHECKING([for SO_LISTENQLEN])
324
325    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/socket.h>]], [[int x = SO_LISTENQLIMIT; int y = SO_LISTENQLEN;]])], [
326      have_lq=so_listenq
327      AC_MSG_RESULT([yes])
328    ], [
329      AC_MSG_RESULT([no])
330    ])
331
332    if test "$have_lq" = "tcp_info"; then
333      AC_DEFINE([HAVE_LQ_SO_LISTENQ], 1, [do we have SO_LISTENQxxx?])
334    fi
335  fi
336])
337
338AC_DEFUN([AC_FPM_SYSCONF],
339[
340	AC_MSG_CHECKING([for sysconf])
341
342	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <unistd.h>]], [[sysconf(_SC_CLK_TCK);]])],[
343		AC_DEFINE([HAVE_SYSCONF], 1, [do we have sysconf?])
344		AC_MSG_RESULT([yes])
345	], [
346		AC_MSG_RESULT([no])
347	])
348])
349
350AC_DEFUN([AC_FPM_TIMES],
351[
352	AC_MSG_CHECKING([for times])
353
354	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/times.h>]], [[struct tms t; times(&t);]])],[
355		AC_DEFINE([HAVE_TIMES], 1, [do we have times?])
356		AC_MSG_RESULT([yes])
357	], [
358		AC_MSG_RESULT([no])
359	])
360])
361
362AC_DEFUN([AC_FPM_KQUEUE],
363[
364	AC_MSG_CHECKING([for kqueue])
365
366	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
367		#include <sys/types.h>
368		#include <sys/event.h>
369		#include <sys/time.h>
370	]], [[
371		int kfd;
372		struct kevent k;
373		kfd = kqueue();
374		/* 0 -> STDIN_FILENO */
375		EV_SET(&k, 0, EVFILT_READ , EV_ADD | EV_CLEAR, 0, 0, NULL);
376	]])], [
377		AC_DEFINE([HAVE_KQUEUE], 1, [do we have kqueue?])
378		AC_MSG_RESULT([yes])
379	], [
380		AC_MSG_RESULT([no])
381	])
382])
383
384AC_DEFUN([AC_FPM_PORT],
385[
386	AC_MSG_CHECKING([for port framework])
387
388	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
389		#include <port.h>
390	]], [[
391		int port;
392
393		port = port_create();
394		if (port < 0) {
395			return 1;
396		}
397	]])], [
398		AC_DEFINE([HAVE_PORT], 1, [do we have port framework?])
399		AC_MSG_RESULT([yes])
400	], [
401		AC_MSG_RESULT([no])
402	])
403])
404
405AC_DEFUN([AC_FPM_DEVPOLL],
406[
407	AC_MSG_CHECKING([for /dev/poll])
408
409	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
410		#include <stdio.h>
411		#include <sys/devpoll.h>
412	]], [[
413		int n, dp;
414		struct dvpoll dvp;
415		dp = 0;
416		dvp.dp_fds = NULL;
417		dvp.dp_nfds = 0;
418		dvp.dp_timeout = 0;
419		n = ioctl(dp, DP_POLL, &dvp)
420	]])], [
421		AC_DEFINE([HAVE_DEVPOLL], 1, [do we have /dev/poll?])
422		AC_MSG_RESULT([yes])
423	], [
424		AC_MSG_RESULT([no])
425	])
426])
427
428AC_DEFUN([AC_FPM_EPOLL],
429[
430	AC_MSG_CHECKING([for epoll])
431
432	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
433		#include <sys/epoll.h>
434	]], [[
435		int epollfd;
436		struct epoll_event e;
437
438		epollfd = epoll_create(1);
439		if (epollfd < 0) {
440			return 1;
441		}
442
443		e.events = EPOLLIN | EPOLLET;
444		e.data.fd = 0;
445
446		if (epoll_ctl(epollfd, EPOLL_CTL_ADD, 0, &e) == -1) {
447			return 1;
448		}
449
450		e.events = 0;
451		if (epoll_wait(epollfd, &e, 1, 1) < 0) {
452			return 1;
453		}
454	]])], [
455		AC_DEFINE([HAVE_EPOLL], 1, [do we have epoll?])
456		AC_MSG_RESULT([yes])
457	], [
458		AC_MSG_RESULT([no])
459	])
460])
461
462AC_DEFUN([AC_FPM_SELECT],
463[
464	AC_MSG_CHECKING([for select])
465
466	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
467		/* According to POSIX.1-2001 */
468		#include <sys/select.h>
469
470		/* According to earlier standards */
471		#include <sys/time.h>
472		#include <sys/types.h>
473		#include <unistd.h>
474	]], [[
475		fd_set fds;
476		struct timeval t;
477		t.tv_sec = 0;
478		t.tv_usec = 42;
479		FD_ZERO(&fds);
480		/* 0 -> STDIN_FILENO */
481		FD_SET(0, &fds);
482		select(FD_SETSIZE, &fds, NULL, NULL, &t);
483	]])], [
484		AC_DEFINE([HAVE_SELECT], 1, [do we have select?])
485		AC_MSG_RESULT([yes])
486	], [
487		AC_MSG_RESULT([no])
488	])
489])
490
491AC_DEFUN([AC_FPM_APPARMOR],
492[
493	AC_MSG_CHECKING([for apparmor])
494
495	SAVED_LIBS="$LIBS"
496	LIBS="$LIBS -lapparmor"
497
498	AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/apparmor.h>]], [[change_hat("test", 0);]])], [
499		AC_DEFINE([HAVE_APPARMOR], 1, [do we have apparmor support?])
500		AC_MSG_RESULT([yes])
501	], [
502		LIBS="$SAVED_LIBS"
503		AC_MSG_RESULT([no])
504	])
505])
506
507AC_MSG_CHECKING(for FPM build)
508if test "$PHP_FPM" != "no"; then
509  AC_MSG_RESULT($PHP_FPM)
510
511  AC_FPM_STDLIBS
512  AC_FPM_PRCTL
513  AC_FPM_CLOCK
514  AC_FPM_TRACE
515  AC_FPM_BUILTIN_ATOMIC
516  AC_FPM_LQ
517  AC_FPM_SYSCONF
518  AC_FPM_TIMES
519  AC_FPM_KQUEUE
520  AC_FPM_PORT
521  AC_FPM_DEVPOLL
522  AC_FPM_EPOLL
523  AC_FPM_SELECT
524  AC_FPM_APPARMOR
525
526  PHP_ARG_WITH([fpm-user],,
527    [AS_HELP_STRING([[--with-fpm-user[=USER]]],
528      [Set the user for php-fpm to run as. (default: nobody)])],
529    [nobody],
530    [no])
531
532  PHP_ARG_WITH([fpm-group],,
533    [AS_HELP_STRING([[--with-fpm-group[=GRP]]],
534      [Set the group for php-fpm to run as. For a system user, this should
535      usually be set to match the fpm username (default: nobody)])],
536    [nobody],
537    [no])
538
539  PHP_ARG_WITH([fpm-systemd],,
540    [AS_HELP_STRING([--with-fpm-systemd],
541      [Activate systemd integration])],
542    [no],
543    [no])
544
545  PHP_ARG_WITH([fpm-acl],,
546    [AS_HELP_STRING([--with-fpm-acl],
547      [Use POSIX Access Control Lists])],
548    [no],
549    [no])
550
551  if test "$PHP_FPM_SYSTEMD" != "no" ; then
552    PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 209])
553
554    AC_CHECK_HEADERS(systemd/sd-daemon.h, [HAVE_SD_DAEMON_H="yes"], [HAVE_SD_DAEMON_H="no"])
555    if test $HAVE_SD_DAEMON_H = "no"; then
556      AC_MSG_ERROR([Your system does not support systemd.])
557    else
558      AC_DEFINE(HAVE_SYSTEMD, 1, [FPM use systemd integration])
559      PHP_FPM_SD_FILES="fpm/fpm_systemd.c"
560      PHP_EVAL_LIBLINE($SYSTEMD_LIBS)
561      PHP_EVAL_INCLINE($SYSTEMD_CFLAGS)
562      php_fpm_systemd=notify
563    fi
564  else
565    php_fpm_systemd=simple
566  fi
567
568  if test "$PHP_FPM_ACL" != "no" ; then
569    AC_CHECK_HEADERS([sys/acl.h])
570    dnl *BSD has acl_* built into libc.
571    AC_CHECK_FUNC(acl_free, [
572      AC_DEFINE(HAVE_FPM_ACL, 1, [ POSIX Access Control List ])
573    ],[
574      AC_CHECK_LIB(acl, acl_free, [
575        PHP_ADD_LIBRARY(acl)
576        AC_DEFINE(HAVE_FPM_ACL, 1, [ POSIX Access Control List ])
577      ],[
578        AC_MSG_ERROR(libacl required not found)
579      ])
580    ])
581  fi
582
583  PHP_SUBST_OLD(php_fpm_systemd)
584  AC_DEFINE_UNQUOTED(PHP_FPM_SYSTEMD, "$php_fpm_systemd", [fpm systemd service type])
585
586  if test -z "$PHP_FPM_USER" -o "$PHP_FPM_USER" = "yes" -o "$PHP_FPM_USER" = "no"; then
587    php_fpm_user="nobody"
588  else
589    php_fpm_user="$PHP_FPM_USER"
590  fi
591
592  if test -z "$PHP_FPM_GROUP" -o "$PHP_FPM_GROUP" = "yes" -o "$PHP_FPM_GROUP" = "no"; then
593    php_fpm_group="nobody"
594  else
595    php_fpm_group="$PHP_FPM_GROUP"
596  fi
597
598  PHP_SUBST_OLD(php_fpm_user)
599  PHP_SUBST_OLD(php_fpm_group)
600  php_fpm_sysconfdir=`eval echo $sysconfdir`
601  PHP_SUBST_OLD(php_fpm_sysconfdir)
602  php_fpm_localstatedir=`eval echo $localstatedir`
603  PHP_SUBST_OLD(php_fpm_localstatedir)
604  php_fpm_prefix=`eval echo $prefix`
605  PHP_SUBST_OLD(php_fpm_prefix)
606
607  AC_DEFINE_UNQUOTED(PHP_FPM_USER, "$php_fpm_user", [fpm user name])
608  AC_DEFINE_UNQUOTED(PHP_FPM_GROUP, "$php_fpm_group", [fpm group name])
609
610  PHP_ADD_BUILD_DIR(sapi/fpm/fpm)
611  PHP_ADD_BUILD_DIR(sapi/fpm/fpm/events)
612  PHP_OUTPUT(sapi/fpm/php-fpm.conf sapi/fpm/www.conf sapi/fpm/init.d.php-fpm sapi/fpm/php-fpm.service sapi/fpm/php-fpm.8 sapi/fpm/status.html)
613  PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/fpm/Makefile.frag])
614
615  SAPI_FPM_PATH=sapi/fpm/php-fpm
616
617  if test "$fpm_trace_type" && test -f "$abs_srcdir/sapi/fpm/fpm/fpm_trace_$fpm_trace_type.c"; then
618    PHP_FPM_TRACE_FILES="fpm/fpm_trace.c fpm/fpm_trace_$fpm_trace_type.c"
619  fi
620
621  PHP_FPM_CFLAGS="-I$abs_srcdir/sapi/fpm -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1"
622
623  PHP_FPM_FILES="fpm/fpm.c \
624    fpm/fpm_children.c \
625    fpm/fpm_cleanup.c \
626    fpm/fpm_clock.c \
627    fpm/fpm_conf.c \
628    fpm/fpm_env.c \
629    fpm/fpm_events.c \
630		fpm/fpm_log.c \
631    fpm/fpm_main.c \
632    fpm/fpm_php.c \
633    fpm/fpm_php_trace.c \
634    fpm/fpm_process_ctl.c \
635    fpm/fpm_request.c \
636    fpm/fpm_shm.c \
637    fpm/fpm_scoreboard.c \
638    fpm/fpm_signals.c \
639    fpm/fpm_sockets.c \
640    fpm/fpm_status.c \
641    fpm/fpm_stdio.c \
642    fpm/fpm_unix.c \
643    fpm/fpm_worker_pool.c \
644    fpm/zlog.c \
645		fpm/events/select.c \
646		fpm/events/poll.c \
647		fpm/events/epoll.c \
648		fpm/events/kqueue.c \
649		fpm/events/devpoll.c \
650		fpm/events/port.c \
651  "
652
653  PHP_SELECT_SAPI(fpm, program, $PHP_FPM_FILES $PHP_FPM_TRACE_FILES $PHP_FPM_SD_FILES, $PHP_FPM_CFLAGS, '$(SAPI_FPM_PATH)')
654
655  case $host_alias in
656      *aix*)
657        BUILD_FPM="echo '\#! .' > php.sym && echo >>php.sym && nm -BCpg \`echo \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FPM_OBJS) | sed 's/\([A-Za-z0-9_]*\)\.lo/\1.o/g'\` | \$(AWK) '{ if (((\$\$2 == \"T\") || (\$\$2 == \"D\") || (\$\$2 == \"B\")) && (substr(\$\$3,1,1) != \".\")) { print \$\$3 } }' | sort -u >> php.sym && \$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) -Wl,-brtl -Wl,-bE:php.sym \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_FPM_OBJS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)"
658        ;;
659      *darwin*)
660        BUILD_FPM="\$(CC) \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(NATIVE_RPATHS) \$(PHP_GLOBAL_OBJS:.lo=.o) \$(PHP_BINARY_OBJS:.lo=.o) \$(PHP_FASTCGI_OBJS:.lo=.o) \$(PHP_FPM_OBJS:.lo=.o) \$(PHP_FRAMEWORKS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)"
661      ;;
662      *)
663        BUILD_FPM="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS) \$(PHP_BINARY_OBJS) \$(PHP_FASTCGI_OBJS) \$(PHP_FPM_OBJS) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)"
664      ;;
665  esac
666
667  PHP_SUBST(SAPI_FPM_PATH)
668  PHP_SUBST(BUILD_FPM)
669
670else
671  AC_MSG_RESULT(no)
672fi
673