1dnl $Id$
2dnl config.m4 for extension swoole
3
4dnl  +----------------------------------------------------------------------+
5dnl  | Swoole                                                               |
6dnl  +----------------------------------------------------------------------+
7dnl  | This source file is subject to version 2.0 of the Apache license,    |
8dnl  | that is bundled with this package in the file LICENSE, and is        |
9dnl  | available through the world-wide-web at the following url:           |
10dnl  | http://www.apache.org/licenses/LICENSE-2.0.html                      |
11dnl  | If you did not receive a copy of the Apache2.0 license and are unable|
12dnl  | to obtain it through the world-wide-web, please send a note to       |
13dnl  | license@swoole.com so we can mail you a copy immediately.            |
14dnl  +----------------------------------------------------------------------+
15dnl  | Author: Tianfeng Han  <mikan.tenny@gmail.com>                        |
16dnl  | Author: Twosee  <twose@qq.com>                                       |
17dnl  +----------------------------------------------------------------------+
18
19PHP_ARG_ENABLE([debug-log],
20  [enable debug log],
21  [AS_HELP_STRING([--enable-debug-log],
22    [Enable swoole debug log])], [no], [no])
23
24PHP_ARG_ENABLE([trace-log],
25  [enable trace log],
26  [AS_HELP_STRING([--enable-trace-log],
27    [Enable swoole trace log])], [no], [no])
28
29PHP_ARG_ENABLE([sockets],
30  [enable sockets support],
31  [AS_HELP_STRING([--enable-sockets],
32    [Do you have sockets extension?])], [no], [no])
33
34PHP_ARG_ENABLE([openssl],
35  [enable openssl support],
36  [AS_HELP_STRING([--enable-openssl],
37    [Use openssl])], [no], [no])
38
39PHP_ARG_ENABLE([http2],
40  [enable http2.0 support],
41  [AS_HELP_STRING([--enable-http2],
42    [Use http2.0])], [no], [no])
43
44PHP_ARG_ENABLE([swoole],
45  [swoole support],
46  [AS_HELP_STRING([--enable-swoole],
47    [Enable swoole support])], [enable_swoole="yes"])
48
49PHP_ARG_ENABLE([mysqlnd],
50  [enable mysqlnd support],
51  [AS_HELP_STRING([--enable-mysqlnd],
52    [Enable mysqlnd])], [no], [no])
53
54PHP_ARG_ENABLE([cares],
55  [enable c-ares support],
56  [AS_HELP_STRING([--enable-cares],
57    [Enable cares])], [no], [no])
58
59PHP_ARG_WITH([openssl_dir],
60  [dir of openssl],
61  [AS_HELP_STRING([[--with-openssl-dir[=DIR]]],
62    [Include OpenSSL support (requires OpenSSL >= 1.0.2)])], [no], [no])
63
64PHP_ARG_WITH([jemalloc_dir],
65  [dir of jemalloc],
66  [AS_HELP_STRING([[--with-jemalloc-dir[=DIR]]],
67    [Include jemalloc support])], [no], [no])
68
69PHP_ARG_ENABLE([asan],
70  [enable asan],
71  [AS_HELP_STRING([--enable-asan],
72    [Enable asan])], [no], [no])
73
74PHP_ARG_ENABLE([swoole-coverage],
75  [whether to enable swoole coverage support],
76  [AS_HELP_STRING([--enable-swoole-coverage],
77    [Enable swoole coverage support])], [no], [no])
78
79PHP_ARG_ENABLE([swoole-dev],
80  [whether to enable Swoole developer build flags],
81  [AS_HELP_STRING([--enable-swoole-dev],
82    [Enable developer flags])], [no], [no])
83
84PHP_ARG_ENABLE([swoole-json],
85  [whether to enable Swoole JSON build flags],
86  [AS_HELP_STRING([--enable-swoole-json],
87    [Enable JSON support])], [no], [no])
88
89PHP_ARG_ENABLE([swoole-curl],
90  [whether to enable Swoole CURL build flags],
91  [AS_HELP_STRING([--enable-swoole-curl],
92    [Enable cURL support])], [no], [no])
93
94PHP_ARG_ENABLE([thread-context],
95  [whether to enable thread context],
96  [AS_HELP_STRING([--enable-thread-context],
97    [Use thread context])], [no], [no])
98
99AC_DEFUN([SWOOLE_HAVE_PHP_EXT], [
100    extname=$1
101    haveext=$[PHP_]translit($1,a-z_-,A-Z__)
102
103    AC_MSG_CHECKING([for ext/$extname support])
104    if test -x "$PHP_EXECUTABLE"; then
105        grepext=`$PHP_EXECUTABLE -m | $EGREP ^$extname\$`
106        if test "$grepext" = "$extname"; then
107            [PHP_HTTP_HAVE_EXT_]translit($1,a-z_-,A-Z__)=1
108            AC_MSG_RESULT([yes])
109            $2
110        else
111            [PHP_HTTP_HAVE_EXT_]translit($1,a-z_-,A-Z__)=
112            AC_MSG_RESULT([no])
113            $3
114        fi
115    elif test "$haveext" != "no" && test "x$haveext" != "x"; then
116        [PHP_HTTP_HAVE_EXT_]translit($1,a-z_-,A-Z__)=1
117        AC_MSG_RESULT([yes])
118        $2
119    else
120        [PHP_HTTP_HAVE_EXT_]translit($1,a-z_-,A-Z__)=
121        AC_MSG_RESULT([no])
122        $3
123    fi
124])
125
126AC_DEFUN([AC_SWOOLE_CPU_AFFINITY],
127[
128    AC_MSG_CHECKING([for cpu affinity])
129    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
130        #ifdef __FreeBSD__
131        #include <sys/types.h>
132        #include <sys/cpuset.h>
133        typedef cpuset_t cpu_set_t;
134        #else
135        #include <sched.h>
136        #endif
137    ]], [[
138        cpu_set_t cpu_set;
139        CPU_ZERO(&cpu_set);
140    ]])],[
141        AC_DEFINE([HAVE_CPU_AFFINITY], 1, [cpu affinity?])
142        AC_MSG_RESULT([yes])
143    ],[
144        AC_MSG_RESULT([no])
145    ])
146])
147
148AC_DEFUN([AC_SWOOLE_HAVE_REUSEPORT],
149[
150    AC_MSG_CHECKING([for socket REUSEPORT])
151    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
152        #include <sys/socket.h>
153    ]], [[
154        int val = 1;
155        setsockopt(0, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val));
156    ]])],[
157        AC_DEFINE([HAVE_REUSEPORT], 1, [have SO_REUSEPORT?])
158        AC_MSG_RESULT([yes])
159    ],[
160        AC_MSG_RESULT([no])
161    ])
162])
163
164AC_DEFUN([AC_SWOOLE_HAVE_FUTEX],
165[
166    AC_MSG_CHECKING([for futex])
167    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
168        #include <linux/futex.h>
169        #include <syscall.h>
170        #include <unistd.h>
171    ]], [[
172        int futex_addr;
173        int val1;
174        syscall(SYS_futex, &futex_addr, val1, NULL, NULL, 0);
175    ]])],[
176        AC_DEFINE([HAVE_FUTEX], 1, [have FUTEX?])
177        AC_MSG_RESULT([yes])
178    ],[
179        AC_MSG_RESULT([no])
180    ])
181])
182
183AC_DEFUN([AC_SWOOLE_HAVE_UCONTEXT],
184[
185    AC_MSG_CHECKING([for ucontext])
186    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
187        #define _XOPEN_SOURCE
188        #include <stdio.h>
189        #include <ucontext.h>
190        #include <unistd.h>
191    ]], [[
192        ucontext_t context;
193        getcontext(&context);
194    ]])],[
195        AC_DEFINE([HAVE_UCONTEXT], 1, [have ucontext?])
196        AC_MSG_RESULT([yes])
197    ],[
198        AC_MSG_RESULT([no])
199    ])
200])
201
202AC_DEFUN([AC_SWOOLE_HAVE_VALGRIND],
203[
204    AC_MSG_CHECKING([for valgrind])
205    AC_LANG([C++])
206    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
207        #include <valgrind/valgrind.h>
208    ]], [[
209
210    ]])],[
211        AC_DEFINE([HAVE_VALGRIND], 1, [have valgrind?])
212        AC_MSG_RESULT([yes])
213    ],[
214        AC_MSG_RESULT([no])
215    ])
216])
217
218AC_DEFUN([AC_SWOOLE_HAVE_BOOST_STACKTRACE],
219[
220    AC_MSG_CHECKING([for valgrind])
221    AC_LANG([C++])
222    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
223        #include <boost/stacktrace.hpp>
224    ]], [[
225
226    ]])],[
227        AC_DEFINE([HAVE_BOOST_STACKTRACE], 1, [have boost-stacktrace?])
228        AC_MSG_RESULT([yes])
229    ],[
230        AC_MSG_RESULT([no])
231    ])
232])
233
234AC_DEFUN([AC_SWOOLE_CHECK_SOCKETS], [
235    dnl Check for struct cmsghdr
236    AC_CACHE_CHECK([for struct cmsghdr], ac_cv_cmsghdr,
237    [
238        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
239#include <sys/types.h>
240#include <sys/socket.h>]], [[struct cmsghdr s; s]])], [ac_cv_cmsghdr=yes], [ac_cv_cmsghdr=no])
241    ])
242
243    if test "$ac_cv_cmsghdr" = yes; then
244        AC_DEFINE(HAVE_CMSGHDR,1,[Whether you have struct cmsghdr])
245    fi
246
247    AC_CHECK_FUNCS([hstrerror socketpair if_nametoindex if_indextoname])
248    AC_CHECK_HEADERS([netdb.h netinet/tcp.h sys/un.h sys/sockio.h])
249    AC_DEFINE([HAVE_SOCKETS], 1, [ ])
250
251    dnl Check for fied ss_family in sockaddr_storage (missing in AIX until 5.3)
252    AC_CACHE_CHECK([for field ss_family in struct sockaddr_storage], ac_cv_ss_family,
253    [
254        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
255#include <sys/socket.h>
256#include <sys/types.h>
257#include <netdb.h>
258    ]], [[struct sockaddr_storage sa_store; sa_store.ss_family = AF_INET6;]])],
259        [ac_cv_ss_family=yes], [ac_cv_ss_family=no])
260    ])
261
262    if test "$ac_cv_ss_family" = yes; then
263        AC_DEFINE(HAVE_SA_SS_FAMILY,1,[Whether you have sockaddr_storage.ss_family])
264    fi
265
266    dnl Check for AI_V4MAPPED flag
267    AC_CACHE_CHECK([if getaddrinfo supports AI_V4MAPPED],[ac_cv_gai_ai_v4mapped],
268    [
269        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
270#include <netdb.h>
271    ]], [[int flag = AI_V4MAPPED;]])],
272        [ac_cv_gai_ai_v4mapped=yes], [ac_cv_gai_ai_v4mapped=no])
273    ])
274
275    if test "$ac_cv_gai_ai_v4mapped" = yes; then
276        AC_DEFINE(HAVE_AI_V4MAPPED,1,[Whether you have AI_V4MAPPED])
277    fi
278
279    dnl Check for AI_ALL flag
280    AC_CACHE_CHECK([if getaddrinfo supports AI_ALL],[ac_cv_gai_ai_all],
281    [
282        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
283#include <netdb.h>
284    ]], [[int flag = AI_ALL;]])],
285        [ac_cv_gai_ai_all=yes], [ac_cv_gai_ai_all=no])
286    ])
287
288    if test "$ac_cv_gai_ai_all" = yes; then
289        AC_DEFINE(HAVE_AI_ALL,1,[Whether you have AI_ALL])
290    fi
291
292    dnl Check for AI_IDN flag
293    AC_CACHE_CHECK([if getaddrinfo supports AI_IDN],[ac_cv_gai_ai_idn],
294    [
295        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
296#include <netdb.h>
297    ]], [[int flag = AI_IDN;]])],
298            [ac_cv_gai_ai_idn=yes], [ac_cv_gai_ai_idn=no])
299    ])
300
301    if test "$ac_cv_gai_ai_idn" = yes; then
302        AC_DEFINE(HAVE_AI_IDN,1,[Whether you have AI_IDN])
303    fi
304
305    AC_CACHE_CHECK([if gethostbyname2_r is supported],[ac_cv_gethostbyname2_r],
306    [
307	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
308#include <sys/socket.h>
309#include <netdb.h>
310    ]], [[struct hostent s, *res; char ptr[256]; int err; gethostbyname2_r("example.com", AF_INET, &s, ptr, sizeof(ptr), &res, &err);]])],
311	    [ac_cv_gethostbyname2_r=yes], [ac_cv_gethostbyname2_r=no])
312    ])
313
314    if test "$ac_cv_gethostbyname2_r" = yes; then
315        AC_DEFINE(HAVE_GETHOSTBYNAME2_R,1,[Whether you have gethostbyname2_r])
316    fi
317])
318
319AC_MSG_CHECKING([if compiling with clang])
320AC_COMPILE_IFELSE([
321    AC_LANG_PROGRAM([], [[
322        #ifndef __clang__
323            not clang
324        #endif
325    ]])],
326    [CLANG=yes], [CLANG=no]
327)
328AC_MSG_RESULT([$CLANG])
329
330AC_PROG_CC_C99
331
332AC_CANONICAL_HOST
333
334if test "$PHP_SWOOLE" != "no"; then
335
336    AC_CHECK_LIB(c, accept4, AC_DEFINE(HAVE_ACCEPT4, 1, [have accept4]))
337    AC_CHECK_LIB(c, signalfd, AC_DEFINE(HAVE_SIGNALFD, 1, [have signalfd]))
338    AC_CHECK_LIB(c, eventfd, AC_DEFINE(HAVE_EVENTFD, 1, [have eventfd]))
339    AC_CHECK_LIB(c, epoll_create, AC_DEFINE(HAVE_EPOLL, 1, [have epoll]))
340    AC_CHECK_LIB(c, poll, AC_DEFINE(HAVE_POLL, 1, [have poll]))
341    AC_CHECK_LIB(c, sendfile, AC_DEFINE(HAVE_SENDFILE, 1, [have sendfile]))
342    AC_CHECK_LIB(c, kqueue, AC_DEFINE(HAVE_KQUEUE, 1, [have kqueue]))
343    AC_CHECK_LIB(execinfo, backtrace, AC_DEFINE(HAVE_EXECINFO, 1, [have execinfo]))
344    AC_CHECK_LIB(c, daemon, AC_DEFINE(HAVE_DAEMON, 1, [have daemon]))
345    AC_CHECK_LIB(c, mkostemp, AC_DEFINE(HAVE_MKOSTEMP, 1, [have mkostemp]))
346    AC_CHECK_LIB(c, inotify_init, AC_DEFINE(HAVE_INOTIFY, 1, [have inotify]))
347    AC_CHECK_LIB(c, malloc_trim, AC_DEFINE(HAVE_MALLOC_TRIM, 1, [have malloc_trim]))
348    AC_CHECK_LIB(c, inotify_init1, AC_DEFINE(HAVE_INOTIFY_INIT1, 1, [have inotify_init1]))
349    AC_CHECK_LIB(c, ptrace, AC_DEFINE(HAVE_PTRACE, 1, [have ptrace]))
350    AC_CHECK_LIB(c, getrandom, AC_DEFINE(HAVE_GETRANDOM, 1, [have getrandom]))
351    AC_CHECK_LIB(c, arc4random, AC_DEFINE(HAVE_ARC4RANDOM, 1, [have arc4random]))
352    AC_CHECK_LIB(c, CCRandomGenerateBytes, AC_DEFINE(HAVE_CCRANDOMGENERATEBYTES, 1, [have_ccrandomgeneratebytes]))
353    AC_CHECK_LIB(pthread, pthread_rwlock_init, AC_DEFINE(HAVE_RWLOCK, 1, [have pthread_rwlock_init]))
354    AC_CHECK_LIB(pthread, pthread_spin_lock, AC_DEFINE(HAVE_SPINLOCK, 1, [have pthread_spin_lock]))
355    AC_CHECK_LIB(pthread, pthread_mutex_timedlock, AC_DEFINE(HAVE_MUTEX_TIMEDLOCK, 1, [have pthread_mutex_timedlock]))
356    AC_CHECK_LIB(pthread, pthread_barrier_init, AC_DEFINE(HAVE_PTHREAD_BARRIER, 1, [have pthread_barrier_init]))
357    AC_CHECK_LIB(pthread, pthread_mutexattr_setpshared, AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_SETPSHARED, 1, [have pthread_mutexattr_setpshared]))
358    AC_CHECK_LIB(pthread, pthread_mutexattr_setrobust, AC_DEFINE(HAVE_PTHREAD_MUTEXATTR_SETROBUST, 1, [have pthread_mutexattr_setrobust]))
359    AC_CHECK_LIB(pthread, pthread_mutex_consistent, AC_DEFINE(HAVE_PTHREAD_MUTEX_CONSISTENT, 1, [have pthread_mutex_consistent]))
360    AC_CHECK_LIB(pcre, pcre_compile, AC_DEFINE(HAVE_PCRE, 1, [have pcre]))
361    AC_CHECK_LIB(cares, ares_gethostbyname, AC_DEFINE(HAVE_CARES, 1, [have c-ares]))
362
363    if test "$PHP_SWOOLE_DEV" = "yes"; then
364        AX_CHECK_COMPILE_FLAG(-Wbool-conversion,                _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wbool-conversion")
365        AX_CHECK_COMPILE_FLAG(-Wignored-qualifiers,             _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wignored-qualifiers")
366        AX_CHECK_COMPILE_FLAG(-Wduplicate-enum,                 _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wduplicate-enum")
367        AX_CHECK_COMPILE_FLAG(-Wempty-body,                     _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wempty-body")
368        AX_CHECK_COMPILE_FLAG(-Wenum-compare,                   _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wenum-compare")
369        AX_CHECK_COMPILE_FLAG(-Wextra,                          _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wextra")
370        AX_CHECK_COMPILE_FLAG(-Wformat-security,                _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wformat-security")
371        AX_CHECK_COMPILE_FLAG(-Wheader-guard,                   _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wheader-guard")
372        AX_CHECK_COMPILE_FLAG(-Wincompatible-pointer-types-discards-qualifiers, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wincompatible-pointer-types-discards-qualifiers")
373        AX_CHECK_COMPILE_FLAG(-Winit-self,                      _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Winit-self")
374        AX_CHECK_COMPILE_FLAG(-Wlogical-not-parentheses,        _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wlogical-not-parentheses")
375        AX_CHECK_COMPILE_FLAG(-Wlogical-op-parentheses,         _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wlogical-op-parentheses")
376        AX_CHECK_COMPILE_FLAG(-Wloop-analysis,                  _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wloop-analysis")
377        AX_CHECK_COMPILE_FLAG(-Wuninitialized,                  _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wuninitialized")
378        AX_CHECK_COMPILE_FLAG(-Wno-missing-field-initializers,  _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-missing-field-initializers")
379        AX_CHECK_COMPILE_FLAG(-Wno-sign-compare,                _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-sign-compare")
380        AX_CHECK_COMPILE_FLAG(-Wno-unused-const-variable,       _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-unused-const-variable")
381        AX_CHECK_COMPILE_FLAG(-Wno-unused-parameter,            _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-unused-parameter")
382        AX_CHECK_COMPILE_FLAG(-Wno-variadic-macros,             _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-variadic-macros")
383        AX_CHECK_COMPILE_FLAG(-Wparentheses,                    _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wparentheses")
384        AX_CHECK_COMPILE_FLAG(-Wpointer-bool-conversion,        _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wpointer-bool-conversion")
385        AX_CHECK_COMPILE_FLAG(-Wsizeof-array-argument,          _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wsizeof-array-argument")
386        AX_CHECK_COMPILE_FLAG(-Wwrite-strings,                  _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wwrite-strings")
387        AX_CHECK_COMPILE_FLAG(-fdiagnostics-show-option,        _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fdiagnostics-show-option")
388        AX_CHECK_COMPILE_FLAG(-fno-omit-frame-pointer,          _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fno-omit-frame-pointer")
389        AX_CHECK_COMPILE_FLAG(-fno-optimize-sibling-calls,      _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fno-optimize-sibling-calls")
390        AX_CHECK_COMPILE_FLAG(-fsanitize-address,               _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fsanitize-address")
391        AX_CHECK_COMPILE_FLAG(-fstack-protector,                _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -fstack-protector")
392
393        EXTRA_CFLAGS="$_MAINTAINER_CFLAGS"
394        CFLAGS="-g -O0 -Wall $CFLAGS"
395        CXXFLAGS="-g -O0 -Wall $CXXFLAGS"
396    fi
397
398    if test "$PHP_SWOOLE_JSON" = "yes"; then
399        AC_DEFINE(SW_USE_JSON, 1, [do we enable json decoder])
400    fi
401
402    if test "$PHP_SWOOLE_CURL" = "yes"; then
403        AC_DEFINE(SW_USE_CURL, 1, [do we enable cURL native client])
404    fi
405
406    AC_CHECK_LIB(z, gzgets, [
407        AC_DEFINE(SW_HAVE_COMPRESSION, 1, [have compression])
408        AC_DEFINE(SW_HAVE_ZLIB, 1, [have zlib])
409        PHP_ADD_LIBRARY(z, 1, SWOOLE_SHARED_LIBADD)
410    ])
411
412    AC_CHECK_LIB(brotlienc, BrotliEncoderCreateInstance, [
413        AC_CHECK_LIB(brotlidec, BrotliDecoderCreateInstance, [
414            AC_DEFINE(SW_HAVE_COMPRESSION, 1, [have compression])
415            AC_DEFINE(SW_HAVE_BROTLI, 1, [have brotli encoder])
416            PHP_ADD_LIBRARY(brotlienc, 1, SWOOLE_SHARED_LIBADD)
417            PHP_ADD_LIBRARY(brotlidec, 1, SWOOLE_SHARED_LIBADD)
418        ])
419    ])
420
421    PHP_ADD_LIBRARY(pthread)
422    PHP_SUBST(SWOOLE_SHARED_LIBADD)
423
424    AC_ARG_ENABLE(debug,
425        [  --enable-debug,         compile with debug symbols],
426        [PHP_DEBUG=$enableval],
427        [PHP_DEBUG=0]
428    )
429
430    if test "$PHP_DEBUG_LOG" != "no"; then
431        AC_DEFINE(SW_DEBUG, 1, [do we enable swoole debug])
432        PHP_DEBUG=1
433    fi
434
435    if test "$PHP_ASAN" != "no"; then
436        PHP_DEBUG=1
437        CFLAGS="$CFLAGS -fsanitize=address -fno-omit-frame-pointer"
438        CXXFLAGS="$CXXFLAGS -fsanitize=address -fno-omit-frame-pointer"
439    fi
440
441    if test "$PHP_TRACE_LOG" != "no"; then
442        AC_DEFINE(SW_LOG_TRACE_OPEN, 1, [enable trace log])
443    fi
444
445    if test "$PHP_SOCKETS" = "yes"; then
446        AC_MSG_CHECKING([for php_sockets.h])
447
448        AS_IF([test -f $abs_srcdir/ext/sockets/php_sockets.h], [AC_MSG_RESULT([ok, found in $abs_srcdir])],
449            [test -f $phpincludedir/ext/sockets/php_sockets.h], [AC_MSG_RESULT([ok, found in $phpincludedir])],
450            [AC_MSG_ERROR([cannot find php_sockets.h. Please check if sockets extension is installed.])
451        ])
452
453        AC_DEFINE(SW_SOCKETS, 1, [enable sockets support])
454
455        dnl Some systems build and package PHP socket extension separately
456        dnl and php_config.h does not have HAVE_SOCKETS defined.
457        AC_DEFINE(HAVE_SOCKETS, 1, [whether sockets extension is enabled])
458
459        PHP_ADD_EXTENSION_DEP(swoole, sockets, true)
460    fi
461
462    if test "$PHP_THREAD" = "yes"; then
463        AC_DEFINE(SW_USE_THREAD, 1, [enable thread support])
464    fi
465
466    if test "$PHP_CARES" = "yes"; then
467        AC_DEFINE(SW_USE_CARES, 1, [do we enable c-ares support])
468        PHP_ADD_LIBRARY(cares, 1, SWOOLE_SHARED_LIBADD)
469    fi
470
471    AC_SWOOLE_CPU_AFFINITY
472    AC_SWOOLE_HAVE_REUSEPORT
473    AC_SWOOLE_HAVE_FUTEX
474    AC_SWOOLE_HAVE_UCONTEXT
475    AC_SWOOLE_HAVE_VALGRIND
476    AC_SWOOLE_CHECK_SOCKETS
477    AC_SWOOLE_HAVE_BOOST_STACKTRACE
478
479    AS_CASE([$host_os],
480      [darwin*], [SW_OS="MAC"],
481      [cygwin*], [SW_OS="CYGWIN"],
482      [mingw*], [SW_OS="MINGW"],
483      [linux*], [SW_OS="LINUX"],
484      [*bsd*], [SW_OS="BSD"],
485      []
486    )
487
488    CFLAGS="-Wall -pthread $CFLAGS"
489    LDFLAGS="$LDFLAGS -lpthread"
490
491    if test "$SW_OS" = "MAC"; then
492        AC_CHECK_LIB(c, clock_gettime, AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [have clock_gettime]))
493    else
494        AC_CHECK_LIB(rt, clock_gettime, AC_DEFINE(HAVE_CLOCK_GETTIME, 1, [have clock_gettime]))
495        PHP_ADD_LIBRARY(rt, 1, SWOOLE_SHARED_LIBADD)
496    fi
497    if test "$SW_OS" = "LINUX"; then
498        LDFLAGS="$LDFLAGS -z now"
499    fi
500
501    if test "$PHP_OPENSSL" != "no" || test "$PHP_OPENSSL_DIR" != "no"; then
502        if test "$PHP_OPENSSL_DIR" != "no"; then
503            AC_DEFINE(HAVE_OPENSSL, 1, [have openssl])
504            PHP_ADD_INCLUDE("${PHP_OPENSSL_DIR}/include")
505            PHP_ADD_LIBRARY_WITH_PATH(ssl, "${PHP_OPENSSL_DIR}/${PHP_LIBDIR}")
506        else
507            AC_CHECK_LIB(ssl, SSL_connect, AC_DEFINE(HAVE_OPENSSL, 1, [have openssl]))
508        fi
509
510        AC_DEFINE(SW_USE_OPENSSL, 1, [enable openssl support])
511        PHP_ADD_LIBRARY(ssl, 1, SWOOLE_SHARED_LIBADD)
512        PHP_ADD_LIBRARY(crypto, 1, SWOOLE_SHARED_LIBADD)
513    fi
514
515    if test "$PHP_JEMALLOC_DIR" != "no"; then
516        AC_DEFINE(SW_USE_JEMALLOC, 1, [use jemalloc])
517        PHP_ADD_INCLUDE("${PHP_JEMALLOC_DIR}/include")
518        PHP_ADD_LIBRARY_WITH_PATH(jemalloc, "${PHP_JEMALLOC_DIR}/${PHP_LIBDIR}")
519        PHP_ADD_LIBRARY(jemalloc, 1, SWOOLE_SHARED_LIBADD)
520    fi
521
522    PHP_ADD_LIBRARY(pthread, 1, SWOOLE_SHARED_LIBADD)
523
524    if test "$PHP_HTTP2" = "yes"; then
525        AC_DEFINE(SW_USE_HTTP2, 1, [enable HTTP2 support])
526    fi
527
528    if test "$PHP_MYSQLND" = "yes"; then
529        PHP_ADD_EXTENSION_DEP(mysqli, mysqlnd)
530        AC_DEFINE(SW_USE_MYSQLND, 1, [use mysqlnd])
531    fi
532
533    swoole_source_file=" \
534        ext-src/php_swoole.cc \
535        ext-src/php_swoole_cxx.cc \
536        ext-src/swoole_admin_server.cc \
537        ext-src/swoole_async_coro.cc \
538        ext-src/swoole_atomic.cc \
539        ext-src/swoole_channel_coro.cc \
540        ext-src/swoole_client.cc \
541        ext-src/swoole_client_coro.cc \
542        ext-src/swoole_coroutine.cc \
543        ext-src/swoole_coroutine_scheduler.cc \
544        ext-src/swoole_coroutine_system.cc \
545        ext-src/swoole_curl.cc \
546        ext-src/swoole_event.cc \
547        ext-src/swoole_http2_client_coro.cc \
548        ext-src/swoole_http2_server.cc \
549        ext-src/swoole_http_client_coro.cc \
550        ext-src/swoole_http_request.cc \
551        ext-src/swoole_http_response.cc \
552        ext-src/swoole_http_server.cc \
553        ext-src/swoole_http_server_coro.cc \
554        ext-src/swoole_lock.cc \
555        ext-src/swoole_mysql_coro.cc \
556        ext-src/swoole_mysql_proto.cc \
557        ext-src/swoole_process.cc \
558        ext-src/swoole_process_pool.cc \
559        ext-src/swoole_redis_coro.cc \
560        ext-src/swoole_redis_server.cc \
561        ext-src/swoole_runtime.cc \
562        ext-src/swoole_server.cc \
563        ext-src/swoole_server_port.cc \
564        ext-src/swoole_socket_coro.cc \
565        ext-src/swoole_table.cc \
566        ext-src/swoole_timer.cc \
567        ext-src/swoole_websocket_server.cc \
568        src/core/base.cc \
569        src/core/channel.cc \
570        src/core/crc32.cc \
571        src/core/error.cc \
572        src/core/heap.cc \
573        src/core/log.cc \
574        src/core/string.cc \
575        src/core/timer.cc \
576        src/coroutine/base.cc \
577        src/coroutine/channel.cc \
578        src/coroutine/context.cc \
579        src/coroutine/file_lock.cc \
580        src/coroutine/hook.cc \
581        src/coroutine/socket.cc \
582        src/coroutine/system.cc \
583        src/coroutine/thread_context.cc \
584        src/lock/mutex.cc \
585        src/lock/rw_lock.cc \
586        src/lock/spin_lock.cc \
587        src/memory/buffer.cc \
588        src/memory/fixed_pool.cc \
589        src/memory/global_memory.cc \
590        src/memory/ring_buffer.cc \
591        src/memory/shared_memory.cc \
592        src/memory/table.cc \
593        src/network/address.cc \
594        src/network/client.cc \
595        src/network/dns.cc \
596        src/network/socket.cc \
597        src/network/stream.cc \
598        src/os/async_thread.cc \
599        src/os/base.cc \
600        src/os/file.cc \
601        src/os/msg_queue.cc \
602        src/os/pipe.cc \
603        src/os/process_pool.cc \
604        src/os/sendfile.cc \
605        src/os/signal.cc \
606        src/os/timer.cc \
607        src/os/unix_socket.cc \
608        src/os/wait.cc \
609        src/protocol/base.cc \
610        src/protocol/base64.cc \
611        src/protocol/dtls.cc \
612        src/protocol/http.cc \
613        src/protocol/http2.cc \
614        src/protocol/mime_type.cc \
615        src/protocol/mqtt.cc \
616        src/protocol/redis.cc \
617        src/protocol/socks5.cc \
618        src/protocol/ssl.cc \
619        src/protocol/websocket.cc \
620        src/reactor/base.cc \
621        src/reactor/epoll.cc \
622        src/reactor/kqueue.cc \
623        src/reactor/poll.cc \
624        src/reactor/select.cc \
625        src/server/base.cc \
626        src/server/manager.cc \
627        src/server/master.cc \
628        src/server/message_bus.cc \
629        src/server/port.cc \
630        src/server/process.cc \
631        src/server/reactor_process.cc \
632        src/server/reactor_thread.cc \
633        src/server/static_handler.cc \
634        src/server/task_worker.cc \
635        src/server/worker.cc \
636        src/wrapper/event.cc \
637        src/wrapper/timer.cc"
638
639    swoole_source_file="$swoole_source_file \
640        thirdparty/php/curl/interface.cc \
641        thirdparty/php/curl/multi.cc \
642        thirdparty/php/sockets/multicast.cc \
643        thirdparty/php/sockets/sendrecvmsg.cc \
644        thirdparty/php/sockets/conversions.cc \
645        thirdparty/php/sockets/sockaddr_conv.cc \
646        thirdparty/php/standard/var_decoder.cc \
647        thirdparty/php/standard/proc_open.cc"
648
649    swoole_source_file="$swoole_source_file \
650        thirdparty/swoole_http_parser.c \
651        thirdparty/multipart_parser.c"
652
653    swoole_source_file="$swoole_source_file \
654        thirdparty/hiredis/hiredis.c \
655        thirdparty/hiredis/alloc.c \
656        thirdparty/hiredis/net.c \
657        thirdparty/hiredis/read.c \
658        thirdparty/hiredis/sds.c"
659
660    swoole_source_file="$swoole_source_file \
661        thirdparty/nghttp2/nghttp2_hd.c \
662        thirdparty/nghttp2/nghttp2_rcbuf.c \
663        thirdparty/nghttp2/nghttp2_helper.c \
664        thirdparty/nghttp2/nghttp2_buf.c \
665        thirdparty/nghttp2/nghttp2_mem.c \
666        thirdparty/nghttp2/nghttp2_hd_huffman.c \
667        thirdparty/nghttp2/nghttp2_hd_huffman_data.c"
668
669    SW_ASM_DIR="thirdparty/boost/asm/"
670    SW_USE_ASM_CONTEXT="yes"
671
672    AS_CASE([$host_cpu],
673      [x86_64*], [SW_CPU="x86_64"],
674      [amd64*], [SW_CPU="x86_64"],
675      [x86*], [SW_CPU="x86"],
676      [i?86*], [SW_CPU="x86"],
677      [arm*], [SW_CPU="arm"],
678      [aarch64*], [SW_CPU="arm64"],
679      [arm64*], [SW_CPU="arm64"],
680      [mips64*], [SW_CPU="mips64"],
681      [mips*], [SW_CPU="mips32"],
682      [riscv64*], [SW_CPU="riscv64"],
683      [
684        SW_USE_ASM_CONTEXT="no"
685      ]
686    )
687
688    if test "$SW_OS" = "MAC"; then
689        SW_CONTEXT_ASM_FILE="combined_sysv_macho_gas.S"
690    elif test "$SW_CPU" = "x86_64"; then
691        if test "$SW_OS" = "LINUX" || test "$SW_OS" = "BSD"; then
692            SW_CONTEXT_ASM_FILE="x86_64_sysv_elf_gas.S"
693        else
694            SW_USE_ASM_CONTEXT="no"
695        fi
696    elif test "$SW_CPU" = "x86"; then
697        if test "$SW_OS" = "LINUX" || test "$SW_OS" = "BSD"; then
698            SW_CONTEXT_ASM_FILE="i386_sysv_elf_gas.S"
699        else
700            SW_USE_ASM_CONTEXT="no"
701        fi
702    elif test "$SW_CPU" = "arm"; then
703        if test "$SW_OS" = "LINUX" || test "$SW_OS" = "BSD"; then
704            SW_CONTEXT_ASM_FILE="arm_aapcs_elf_gas.S"
705        else
706            SW_USE_ASM_CONTEXT="no"
707        fi
708    elif test "$SW_CPU" = "arm64"; then
709        if test "$SW_OS" = "LINUX" || test "$SW_OS" = "BSD"; then
710            SW_CONTEXT_ASM_FILE="arm64_aapcs_elf_gas.S"
711        else
712            SW_USE_ASM_CONTEXT="no"
713        fi
714     elif test "$SW_CPU" = "ppc32"; then
715        if test "$SW_OS" = "LINUX"; then
716            SW_CONTEXT_ASM_FILE="ppc32_sysv_elf_gas.S"
717        else
718            SW_USE_ASM_CONTEXT="no"
719        fi
720    elif test "$SW_CPU" = "ppc64"; then
721        if test "$SW_OS" = "LINUX" || test "$SW_OS" = "BSD"; then
722            SW_CONTEXT_ASM_FILE="ppc64_sysv_elf_gas.S"
723        else
724            SW_USE_ASM_CONTEXT="no"
725        fi
726    elif test "$SW_CPU" = "mips64"; then
727        if test "$SW_OS" = "LINUX"; then
728           SW_CONTEXT_ASM_FILE="mips64_n64_elf_gas.S"
729        else
730            SW_USE_ASM_CONTEXT="no"
731        fi
732    elif test "$SW_CPU" = "mips32"; then
733        if test "$SW_OS" = "LINUX"; then
734           SW_CONTEXT_ASM_FILE="mips32_o32_elf_gas.S"
735        else
736            SW_USE_ASM_CONTEXT="no"
737        fi
738    elif test "$SW_CPU" = "riscv64"; then
739        if test "$SW_OS" = "LINUX"; then
740           SW_CONTEXT_ASM_FILE="riscv64_sysv_elf_gas.S"
741        else
742            SW_USE_ASM_CONTEXT="no"
743        fi
744    else
745        SW_USE_ASM_CONTEXT="no"
746    fi
747
748    if test "$PHP_THREAD_CONTEXT" != "no"; then
749		AC_DEFINE(SW_USE_THREAD_CONTEXT, 1, [do we enable thread context])
750		SW_USE_ASM_CONTEXT="no"
751    fi
752
753    if test "$SW_USE_ASM_CONTEXT" = "yes"; then
754        swoole_source_file="$swoole_source_file \
755            ${SW_ASM_DIR}make_${SW_CONTEXT_ASM_FILE} \
756            ${SW_ASM_DIR}jump_${SW_CONTEXT_ASM_FILE} "
757        AC_DEFINE(SW_USE_ASM_CONTEXT, 1, [use boost asm context])
758    fi
759
760    PHP_NEW_EXTENSION(swoole, $swoole_source_file, $ext_shared,, "$EXTRA_CFLAGS -DENABLE_PHP_SWOOLE", cxx)
761
762    PHP_ADD_INCLUDE([$ext_srcdir])
763    PHP_ADD_INCLUDE([$ext_srcdir/include])
764    PHP_ADD_INCLUDE([$ext_srcdir/ext-src])
765    PHP_ADD_INCLUDE([$ext_srcdir/thirdparty])
766    PHP_ADD_INCLUDE([$ext_srcdir/thirdparty/hiredis])
767
768    AC_MSG_CHECKING([swoole coverage])
769    if test "$PHP_SWOOLE_COVERAGE" != "no"; then
770        AC_MSG_RESULT([enabled])
771
772        PHP_ADD_MAKEFILE_FRAGMENT
773    else
774        AC_MSG_RESULT([disabled])
775    fi
776
777    PHP_INSTALL_HEADERS([ext/swoole], [ext-src/*.h config.h php_swoole.h \
778        include/*.h \
779        thirdparty/*.h \
780        thirdparty/nghttp2/*.h \
781        thirdparty/hiredis/*.h])
782
783    PHP_REQUIRE_CXX()
784
785    CXXFLAGS="$CXXFLAGS -Wall -Wno-unused-function -Wno-deprecated -Wno-deprecated-declarations"
786
787    if test "$SW_OS" = "CYGWIN" || test "$SW_OS" = "MINGW"; then
788        CXXFLAGS="$CXXFLAGS -std=gnu++11"
789    else
790        CXXFLAGS="$CXXFLAGS -std=c++11"
791    fi
792
793    PHP_ADD_BUILD_DIR($ext_builddir/ext-src)
794    PHP_ADD_BUILD_DIR($ext_builddir/src/core)
795    PHP_ADD_BUILD_DIR($ext_builddir/src/memory)
796    PHP_ADD_BUILD_DIR($ext_builddir/src/reactor)
797    PHP_ADD_BUILD_DIR($ext_builddir/src/lock)
798    PHP_ADD_BUILD_DIR($ext_builddir/src/os)
799    PHP_ADD_BUILD_DIR($ext_builddir/src/network)
800    PHP_ADD_BUILD_DIR($ext_builddir/src/server)
801    PHP_ADD_BUILD_DIR($ext_builddir/src/protocol)
802    PHP_ADD_BUILD_DIR($ext_builddir/src/coroutine)
803    PHP_ADD_BUILD_DIR($ext_builddir/src/wrapper)
804    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/boost)
805    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/boost/asm)
806    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/hiredis)
807    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/nghttp2)
808    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/php/sockets)
809    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/php/standard)
810    PHP_ADD_BUILD_DIR($ext_builddir/thirdparty/php/curl)
811fi
812