1
0
mirror of https://github.com/php/php-src.git synced 2026-04-12 10:33:11 +02:00
Files
archived-php-src/sapi/fpm/config.m4
Michael Orlitzky 40cdc5f298 sapi/fpm/config.m4: add a new --with-fpm-apparmor configure flag.
The existing AC_FPM_APPARMOR macro (which is always run when FPM is
enabled) checks for the existence of libapparmor, and adds it to $LIBS
if found. The result is an "automagic" dependency on libapparmor that
depends not only on the user's configuration, but also on the build
host's environment.

In particular, this can cause problems if the user just happens to
have libapparmor installed (for testing or development) when he builds
PHP. Later, he may remove libapparmor, not realizing that PHP depends
on it. At that point, FPM will cease to work due to the missing library.

This commit adds a new configure flag called "--with-fpm-apparmor",
defaulting to "no", that enables or disables the feature. The new flag
is used to signal the user's intent; whether or not he wants to use
AppArmor. If he does, then we still check for the existence and
usability of libapparmor; however, it is now an error for the library
to be missing when --with-fpm-apparmor is requested.

Gentoo-bug: https://bugs.gentoo.org/637402
PHP-bug: https://bugs.php.net/bug.php?id=75519
2020-06-21 17:08:40 +01:00

672 lines
17 KiB
Plaintext

PHP_ARG_ENABLE([fpm],,
[AS_HELP_STRING([--enable-fpm],
[Enable building of the fpm SAPI executable])],
[no],
[no])
dnl Configure checks.
AC_DEFUN([AC_FPM_STDLIBS],
[
AC_CHECK_FUNCS(clearenv setproctitle setproctitle_fast)
AC_SEARCH_LIBS(socket, socket)
AC_SEARCH_LIBS(inet_addr, nsl)
])
AC_DEFUN([AC_FPM_PRCTL],
[
AC_MSG_CHECKING([for prctl])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/prctl.h>]], [[prctl(0, 0, 0, 0, 0);]])], [
AC_DEFINE([HAVE_PRCTL], 1, [do we have prctl?])
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
])
AC_DEFUN([AC_FPM_CLOCK],
[
have_clock_gettime=no
AC_MSG_CHECKING([for clock_gettime])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <time.h>]], [[struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts);]])], [
have_clock_gettime=yes
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
if test "$have_clock_gettime" = "no"; then
AC_MSG_CHECKING([for clock_gettime in -lrt])
SAVED_LIBS="$LIBS"
LIBS="$LIBS -lrt"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <time.h>]], [[struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts);]])], [
have_clock_gettime=yes
AC_MSG_RESULT([yes])
], [
LIBS="$SAVED_LIBS"
AC_MSG_RESULT([no])
])
fi
if test "$have_clock_gettime" = "yes"; then
AC_DEFINE([HAVE_CLOCK_GETTIME], 1, [do we have clock_gettime?])
fi
have_clock_get_time=no
if test "$have_clock_gettime" = "no"; then
AC_MSG_CHECKING([for clock_get_time])
AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <mach/mach.h>
#include <mach/clock.h>
#include <mach/mach_error.h>
int main()
{
kern_return_t ret; clock_serv_t aClock; mach_timespec_t aTime;
ret = host_get_clock_service(mach_host_self(), REALTIME_CLOCK, &aClock);
if (ret != KERN_SUCCESS) {
return 1;
}
ret = clock_get_time(aClock, &aTime);
if (ret != KERN_SUCCESS) {
return 2;
}
return 0;
}
]])], [
have_clock_get_time=yes
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
], [AC_MSG_RESULT([no (cross-compiling)])])
fi
if test "$have_clock_get_time" = "yes"; then
AC_DEFINE([HAVE_CLOCK_GET_TIME], 1, [do we have clock_get_time?])
fi
])
AC_DEFUN([AC_FPM_TRACE],
[
have_ptrace=no
have_broken_ptrace=no
AC_MSG_CHECKING([for ptrace])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/types.h>
#include <sys/ptrace.h> ]], [[ptrace(0, 0, (void *) 0, 0);]])], [
have_ptrace=yes
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
if test "$have_ptrace" = "yes"; then
AC_MSG_CHECKING([whether ptrace works])
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/ptrace.h>
#include <errno.h>
#if !defined(PTRACE_ATTACH) && defined(PT_ATTACH)
#define PTRACE_ATTACH PT_ATTACH
#endif
#if !defined(PTRACE_DETACH) && defined(PT_DETACH)
#define PTRACE_DETACH PT_DETACH
#endif
#if !defined(PTRACE_PEEKDATA) && defined(PT_READ_D)
#define PTRACE_PEEKDATA PT_READ_D
#endif
int main()
{
long v1 = (unsigned int) -1; /* copy will fail if sizeof(long) == 8 and we've got "int ptrace()" */
long v2;
pid_t child;
int status;
if ( (child = fork()) ) { /* parent */
int ret = 0;
if (0 > ptrace(PTRACE_ATTACH, child, 0, 0)) {
return 2;
}
waitpid(child, &status, 0);
#ifdef PT_IO
struct ptrace_io_desc ptio = {
.piod_op = PIOD_READ_D,
.piod_offs = &v1,
.piod_addr = &v2,
.piod_len = sizeof(v1)
};
if (0 > ptrace(PT_IO, child, (void *) &ptio, 0)) {
ret = 3;
}
#else
errno = 0;
v2 = ptrace(PTRACE_PEEKDATA, child, (void *) &v1, 0);
if (errno) {
ret = 4;
}
#endif
ptrace(PTRACE_DETACH, child, (void *) 1, 0);
kill(child, SIGKILL);
return ret ? ret : (v1 != v2);
}
else { /* child */
sleep(10);
return 0;
}
}
]])], [
AC_MSG_RESULT([yes])
], [
have_ptrace=no
have_broken_ptrace=yes
AC_MSG_RESULT([no])
], [
AC_MSG_RESULT([skipped (cross-compiling)])
])
fi
if test "$have_ptrace" = "yes"; then
AC_DEFINE([HAVE_PTRACE], 1, [do we have ptrace?])
fi
have_mach_vm_read=no
if test "$have_broken_ptrace" = "yes"; then
AC_MSG_CHECKING([for mach_vm_read])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <mach/mach.h>
#include <mach/mach_vm.h>
]], [[
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);
]])], [
have_mach_vm_read=yes
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
fi
if test "$have_mach_vm_read" = "yes"; then
AC_DEFINE([HAVE_MACH_VM_READ], 1, [do we have mach_vm_read?])
fi
proc_mem_file=""
if test -r /proc/$$/mem ; then
proc_mem_file="mem"
else
if test -r /proc/$$/as ; then
proc_mem_file="as"
fi
fi
if test -n "$proc_mem_file" ; then
AC_MSG_CHECKING([for proc mem file])
AC_RUN_IFELSE([AC_LANG_SOURCE([[
#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64
#include <stdint.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
long v1 = (unsigned int) -1, v2 = 0;
char buf[128];
int fd;
sprintf(buf, "/proc/%d/$proc_mem_file", getpid());
fd = open(buf, O_RDONLY);
if (0 > fd) {
return 1;
}
if (sizeof(long) != pread(fd, &v2, sizeof(long), (uintptr_t) &v1)) {
close(fd);
return 1;
}
close(fd);
return v1 != v2;
}
]])], [
AC_MSG_RESULT([$proc_mem_file])
], [
proc_mem_file=""
AC_MSG_RESULT([no])
], [
AC_MSG_RESULT([skipped (cross-compiling)])
])
fi
if test -n "$proc_mem_file"; then
AC_DEFINE_UNQUOTED([PROC_MEM_FILE], "$proc_mem_file", [/proc/pid/mem interface])
fi
fpm_trace_type=""
if test "$have_ptrace" = "yes"; then
fpm_trace_type=ptrace
elif test -n "$proc_mem_file"; then
fpm_trace_type=pread
elif test "$have_mach_vm_read" = "yes" ; then
fpm_trace_type=mach
else
AC_MSG_WARN([FPM Trace - ptrace, pread, or mach: could not be found])
fi
])
AC_DEFUN([AC_FPM_BUILTIN_ATOMIC],
[
AC_MSG_CHECKING([if gcc supports __sync_bool_compare_and_swap])
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [[
int variable = 1;
return (__sync_bool_compare_and_swap(&variable, 1, 2)
&& __sync_add_and_fetch(&variable, 1)) ? 1 : 0;
]])], [
AC_MSG_RESULT([yes])
AC_DEFINE(HAVE_BUILTIN_ATOMIC, 1, [Define to 1 if gcc supports __sync_bool_compare_and_swap() a.o.])
], [
AC_MSG_RESULT([no])
])
])
AC_DEFUN([AC_FPM_LQ],
[
have_lq=no
AC_MSG_CHECKING([for TCP_INFO])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <netinet/tcp.h>]], [[struct tcp_info ti; int x = TCP_INFO;]])], [
have_lq=tcp_info
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
if test "$have_lq" = "tcp_info"; then
AC_DEFINE([HAVE_LQ_TCP_INFO], 1, [do we have TCP_INFO?])
fi
if test "$have_lq" = "no" ; then
AC_MSG_CHECKING([for SO_LISTENQLEN])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/socket.h>]], [[int x = SO_LISTENQLIMIT; int y = SO_LISTENQLEN;]])], [
have_lq=so_listenq
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
if test "$have_lq" = "tcp_info"; then
AC_DEFINE([HAVE_LQ_SO_LISTENQ], 1, [do we have SO_LISTENQxxx?])
fi
fi
])
AC_DEFUN([AC_FPM_SYSCONF],
[
AC_MSG_CHECKING([for sysconf])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <unistd.h>]], [[sysconf(_SC_CLK_TCK);]])],[
AC_DEFINE([HAVE_SYSCONF], 1, [do we have sysconf?])
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
])
AC_DEFUN([AC_FPM_TIMES],
[
AC_MSG_CHECKING([for times])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/times.h>]], [[struct tms t; times(&t);]])],[
AC_DEFINE([HAVE_TIMES], 1, [do we have times?])
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
])
AC_DEFUN([AC_FPM_KQUEUE],
[
AC_MSG_CHECKING([for kqueue])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/types.h>
#include <sys/event.h>
#include <sys/time.h>
]], [[
int kfd;
struct kevent k;
kfd = kqueue();
/* 0 -> STDIN_FILENO */
EV_SET(&k, 0, EVFILT_READ , EV_ADD | EV_CLEAR, 0, 0, NULL);
]])], [
AC_DEFINE([HAVE_KQUEUE], 1, [do we have kqueue?])
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
])
AC_DEFUN([AC_FPM_PORT],
[
AC_MSG_CHECKING([for port framework])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <port.h>
]], [[
int port;
port = port_create();
if (port < 0) {
return 1;
}
]])], [
AC_DEFINE([HAVE_PORT], 1, [do we have port framework?])
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
])
AC_DEFUN([AC_FPM_DEVPOLL],
[
AC_MSG_CHECKING([for /dev/poll])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <stdio.h>
#include <sys/devpoll.h>
]], [[
int n, dp;
struct dvpoll dvp;
dp = 0;
dvp.dp_fds = NULL;
dvp.dp_nfds = 0;
dvp.dp_timeout = 0;
n = ioctl(dp, DP_POLL, &dvp)
]])], [
AC_DEFINE([HAVE_DEVPOLL], 1, [do we have /dev/poll?])
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
])
AC_DEFUN([AC_FPM_EPOLL],
[
AC_MSG_CHECKING([for epoll])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/epoll.h>
]], [[
int epollfd;
struct epoll_event e;
epollfd = epoll_create(1);
if (epollfd < 0) {
return 1;
}
e.events = EPOLLIN | EPOLLET;
e.data.fd = 0;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, 0, &e) == -1) {
return 1;
}
e.events = 0;
if (epoll_wait(epollfd, &e, 1, 1) < 0) {
return 1;
}
]])], [
AC_DEFINE([HAVE_EPOLL], 1, [do we have epoll?])
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
])
AC_DEFUN([AC_FPM_SELECT],
[
AC_MSG_CHECKING([for select])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
/* According to POSIX.1-2001 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
]], [[
fd_set fds;
struct timeval t;
t.tv_sec = 0;
t.tv_usec = 42;
FD_ZERO(&fds);
/* 0 -> STDIN_FILENO */
FD_SET(0, &fds);
select(FD_SETSIZE, &fds, NULL, NULL, &t);
]])], [
AC_DEFINE([HAVE_SELECT], 1, [do we have select?])
AC_MSG_RESULT([yes])
], [
AC_MSG_RESULT([no])
])
])
AC_MSG_CHECKING(for FPM build)
if test "$PHP_FPM" != "no"; then
AC_MSG_RESULT($PHP_FPM)
AC_FPM_STDLIBS
AC_FPM_PRCTL
AC_FPM_CLOCK
AC_FPM_TRACE
AC_FPM_BUILTIN_ATOMIC
AC_FPM_LQ
AC_FPM_SYSCONF
AC_FPM_TIMES
AC_FPM_KQUEUE
AC_FPM_PORT
AC_FPM_DEVPOLL
AC_FPM_EPOLL
AC_FPM_SELECT
PHP_ARG_WITH([fpm-user],,
[AS_HELP_STRING([[--with-fpm-user[=USER]]],
[Set the user for php-fpm to run as. (default: nobody)])],
[nobody],
[no])
PHP_ARG_WITH([fpm-group],,
[AS_HELP_STRING([[--with-fpm-group[=GRP]]],
[Set the group for php-fpm to run as. For a system user, this should
usually be set to match the fpm username (default: nobody)])],
[nobody],
[no])
PHP_ARG_WITH([fpm-systemd],,
[AS_HELP_STRING([--with-fpm-systemd],
[Activate systemd integration])],
[no],
[no])
PHP_ARG_WITH([fpm-acl],,
[AS_HELP_STRING([--with-fpm-acl],
[Use POSIX Access Control Lists])],
[no],
[no])
PHP_ARG_WITH([fpm-apparmor],,
[AS_HELP_STRING([--with-fpm-apparmor],
[Support AppArmor confinement through libapparmor])],
[no],
[no])
if test "$PHP_FPM_SYSTEMD" != "no" ; then
PKG_CHECK_MODULES([SYSTEMD], [libsystemd >= 209])
AC_CHECK_HEADERS(systemd/sd-daemon.h, [HAVE_SD_DAEMON_H="yes"], [HAVE_SD_DAEMON_H="no"])
if test $HAVE_SD_DAEMON_H = "no"; then
AC_MSG_ERROR([Your system does not support systemd.])
else
AC_DEFINE(HAVE_SYSTEMD, 1, [FPM use systemd integration])
PHP_FPM_SD_FILES="fpm/fpm_systemd.c"
PHP_EVAL_LIBLINE($SYSTEMD_LIBS)
PHP_EVAL_INCLINE($SYSTEMD_CFLAGS)
php_fpm_systemd=notify
fi
else
php_fpm_systemd=simple
fi
if test "$PHP_FPM_ACL" != "no" ; then
AC_CHECK_HEADERS([sys/acl.h])
dnl *BSD has acl_* built into libc.
AC_CHECK_FUNC(acl_free, [
AC_DEFINE(HAVE_FPM_ACL, 1, [ POSIX Access Control List ])
],[
AC_CHECK_LIB(acl, acl_free, [
PHP_ADD_LIBRARY(acl)
AC_DEFINE(HAVE_FPM_ACL, 1, [ POSIX Access Control List ])
],[
AC_MSG_ERROR(libacl required not found)
])
])
fi
if test "x$PHP_FPM_APPARMOR" != "xno" ; then
AC_CHECK_HEADERS([sys/apparmor.h])
AC_CHECK_LIB(apparmor, change_hat, [
PHP_ADD_LIBRARY(apparmor)
AC_DEFINE(HAVE_APPARMOR, 1, [ AppArmor confinement available ])
],[
AC_MSG_ERROR(libapparmor required but not found)
])
fi
PHP_SUBST_OLD(php_fpm_systemd)
AC_DEFINE_UNQUOTED(PHP_FPM_SYSTEMD, "$php_fpm_systemd", [fpm systemd service type])
if test -z "$PHP_FPM_USER" -o "$PHP_FPM_USER" = "yes" -o "$PHP_FPM_USER" = "no"; then
php_fpm_user="nobody"
else
php_fpm_user="$PHP_FPM_USER"
fi
if test -z "$PHP_FPM_GROUP" -o "$PHP_FPM_GROUP" = "yes" -o "$PHP_FPM_GROUP" = "no"; then
php_fpm_group="nobody"
else
php_fpm_group="$PHP_FPM_GROUP"
fi
PHP_SUBST_OLD(php_fpm_user)
PHP_SUBST_OLD(php_fpm_group)
php_fpm_sysconfdir=`eval echo $sysconfdir`
PHP_SUBST_OLD(php_fpm_sysconfdir)
php_fpm_localstatedir=`eval echo $localstatedir`
PHP_SUBST_OLD(php_fpm_localstatedir)
php_fpm_prefix=`eval echo $prefix`
PHP_SUBST_OLD(php_fpm_prefix)
AC_DEFINE_UNQUOTED(PHP_FPM_USER, "$php_fpm_user", [fpm user name])
AC_DEFINE_UNQUOTED(PHP_FPM_GROUP, "$php_fpm_group", [fpm group name])
PHP_ADD_BUILD_DIR(sapi/fpm/fpm)
PHP_ADD_BUILD_DIR(sapi/fpm/fpm/events)
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)
PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/sapi/fpm/Makefile.frag])
SAPI_FPM_PATH=sapi/fpm/php-fpm
if test "$fpm_trace_type" && test -f "$abs_srcdir/sapi/fpm/fpm/fpm_trace_$fpm_trace_type.c"; then
PHP_FPM_TRACE_FILES="fpm/fpm_trace.c fpm/fpm_trace_$fpm_trace_type.c"
fi
PHP_FPM_CFLAGS="-I$abs_srcdir/sapi/fpm -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1"
PHP_FPM_FILES="fpm/fpm.c \
fpm/fpm_children.c \
fpm/fpm_cleanup.c \
fpm/fpm_clock.c \
fpm/fpm_conf.c \
fpm/fpm_env.c \
fpm/fpm_events.c \
fpm/fpm_log.c \
fpm/fpm_main.c \
fpm/fpm_php.c \
fpm/fpm_php_trace.c \
fpm/fpm_process_ctl.c \
fpm/fpm_request.c \
fpm/fpm_shm.c \
fpm/fpm_scoreboard.c \
fpm/fpm_signals.c \
fpm/fpm_sockets.c \
fpm/fpm_status.c \
fpm/fpm_stdio.c \
fpm/fpm_unix.c \
fpm/fpm_worker_pool.c \
fpm/zlog.c \
fpm/events/select.c \
fpm/events/poll.c \
fpm/events/epoll.c \
fpm/events/kqueue.c \
fpm/events/devpoll.c \
fpm/events/port.c \
"
PHP_SELECT_SAPI(fpm, program, $PHP_FPM_FILES $PHP_FPM_TRACE_FILES $PHP_FPM_SD_FILES, $PHP_FPM_CFLAGS, '$(SAPI_FPM_PATH)')
case $host_alias in
*aix*)
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)"
;;
*darwin*)
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)"
;;
*)
BUILD_FPM="\$(LIBTOOL) --mode=link \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \$(PHP_GLOBAL_OBJS:.lo=.o) \$(PHP_BINARY_OBJS:.lo=.o) \$(PHP_FASTCGI_OBJS:.lo=.o) \$(PHP_FPM_OBJS:.lo=.o) \$(EXTRA_LIBS) \$(FPM_EXTRA_LIBS) \$(ZEND_EXTRA_LIBS) -o \$(SAPI_FPM_PATH)"
;;
esac
PHP_SUBST(SAPI_FPM_PATH)
PHP_SUBST(BUILD_FPM)
else
AC_MSG_RESULT(no)
fi