config.m4 18 KB

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