xref: /PHP-8.2/ext/opcache/config.m4 (revision 8d7364f0)
1PHP_ARG_ENABLE([opcache],
2  [whether to enable Zend OPcache support],
3  [AS_HELP_STRING([--disable-opcache],
4    [Disable Zend OPcache support])],
5  [yes])
6
7PHP_ARG_ENABLE([huge-code-pages],
8  [whether to enable copying PHP CODE pages into HUGE PAGES],
9  [AS_HELP_STRING([--disable-huge-code-pages],
10    [Disable copying PHP CODE pages into HUGE PAGES])],
11  [yes],
12  [no])
13
14PHP_ARG_ENABLE([opcache-jit],
15  [whether to enable JIT],
16  [AS_HELP_STRING([--disable-opcache-jit],
17    [Disable JIT])],
18  [yes],
19  [no])
20
21PHP_ARG_WITH([capstone],,
22  [AS_HELP_STRING([--with-capstone],
23    [support opcache JIT disassembly through capstone])],
24  [no],
25  [no])
26
27if test "$PHP_OPCACHE" != "no"; then
28
29  dnl Always build as shared extension
30  ext_shared=yes
31
32  if test "$PHP_HUGE_CODE_PAGES" = "yes"; then
33    AC_DEFINE(HAVE_HUGE_CODE_PAGES, 1, [Define to enable copying PHP CODE pages into HUGE PAGES (experimental)])
34  fi
35
36  if test "$PHP_OPCACHE_JIT" = "yes"; then
37    case $host_cpu in
38      i[[34567]]86*|x86*|aarch64|amd64)
39        ;;
40      *)
41        AC_MSG_WARN([JIT not supported by host architecture])
42        PHP_OPCACHE_JIT=no
43        ;;
44    esac
45  fi
46
47  if test "$PHP_OPCACHE_JIT" = "yes" ; then
48    AC_DEFINE(HAVE_JIT, 1, [Define to enable JIT])
49    AC_DEFINE(ZEND_JIT_IR, 1, [Use JIT IR framework])
50    ZEND_JIT_SRC="jit/zend_jit.c jit/zend_jit_vm_helpers.c jit/ir/ir.c jit/ir/ir_strtab.c \
51		jit/ir/ir_cfg.c	jit/ir/ir_sccp.c jit/ir/ir_gcm.c jit/ir/ir_ra.c jit/ir/ir_save.c \
52		jit/ir/ir_dump.c jit/ir/ir_gdb.c jit/ir/ir_perf.c jit/ir/ir_check.c \
53		jit/ir/ir_patch.c jit/ir/ir_emit.c"
54
55    dnl Find out which ABI we are using.
56    case $host_alias in
57      x86_64-*-darwin*)
58        IR_TARGET=IR_TARGET_X64
59        DASM_FLAGS="-D X64APPLE=1 -D X64=1"
60        DASM_ARCH="x86"
61        ;;
62      *x86_64*|amd64-*-freebsd*)
63        IR_TARGET=IR_TARGET_X64
64        DASM_FLAGS="-D X64=1"
65        DASM_ARCH="x86"
66        ;;
67      i[[34567]]86*)
68        IR_TARGET=IR_TARGET_X86
69        DASM_ARCH="x86"
70        ;;
71      x86*)
72        IR_TARGET=IR_TARGET_X86
73        DASM_ARCH="x86"
74        ;;
75      aarch64*)
76        IR_TARGET=IR_TARGET_AARCH64
77        DASM_ARCH="aarch64"
78        ;;
79     esac
80
81    AS_IF([test x"$with_capstone" = "xyes"],[
82      PKG_CHECK_MODULES([CAPSTONE],[capstone >= 3.0.0],[
83        AC_DEFINE([HAVE_CAPSTONE], [1], [Capstone is available])
84        PHP_EVAL_LIBLINE($CAPSTONE_LIBS, OPCACHE_SHARED_LIBADD)
85        PHP_EVAL_INCLINE($CAPSTONE_CFLAGS)
86        ZEND_JIT_SRC+=" jit/ir/ir_disasm.c"
87      ],[
88        AC_MSG_ERROR([capstone >= 3.0 required but not found])
89      ])
90    ])
91
92    PHP_SUBST(IR_TARGET)
93    PHP_SUBST(DASM_FLAGS)
94    PHP_SUBST(DASM_ARCH)
95
96    JIT_CFLAGS="-I@ext_builddir@/jit/ir -D${IR_TARGET} -DIR_PHP"
97    if test "$ZEND_DEBUG" = "yes"; then
98      JIT_CFLAGS="${JIT_CFLAGS} -DIR_DEBUG"
99    fi
100  fi
101
102  AC_CHECK_FUNCS([mprotect memfd_create shm_create_largepage])
103
104  AC_MSG_CHECKING(for sysvipc shared memory support)
105  AC_RUN_IFELSE([AC_LANG_SOURCE([[
106#include <sys/types.h>
107#include <sys/wait.h>
108#include <sys/ipc.h>
109#include <sys/shm.h>
110#include <unistd.h>
111#include <string.h>
112
113int main(void) {
114  pid_t pid;
115  int status;
116  int ipc_id;
117  char *shm;
118  struct shmid_ds shmbuf;
119
120  ipc_id = shmget(IPC_PRIVATE, 4096, (IPC_CREAT | SHM_R | SHM_W));
121  if (ipc_id == -1) {
122    return 1;
123  }
124
125  shm = shmat(ipc_id, NULL, 0);
126  if (shm == (void *)-1) {
127    shmctl(ipc_id, IPC_RMID, NULL);
128    return 2;
129  }
130
131  if (shmctl(ipc_id, IPC_STAT, &shmbuf) != 0) {
132    shmdt(shm);
133    shmctl(ipc_id, IPC_RMID, NULL);
134    return 3;
135  }
136
137  shmbuf.shm_perm.uid = getuid();
138  shmbuf.shm_perm.gid = getgid();
139  shmbuf.shm_perm.mode = 0600;
140
141  if (shmctl(ipc_id, IPC_SET, &shmbuf) != 0) {
142    shmdt(shm);
143    shmctl(ipc_id, IPC_RMID, NULL);
144    return 4;
145  }
146
147  shmctl(ipc_id, IPC_RMID, NULL);
148
149  strcpy(shm, "hello");
150
151  pid = fork();
152  if (pid < 0) {
153    return 5;
154  } else if (pid == 0) {
155    strcpy(shm, "bye");
156    return 6;
157  }
158  if (wait(&status) != pid) {
159    return 7;
160  }
161  if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) {
162    return 8;
163  }
164  if (strcmp(shm, "bye") != 0) {
165    return 9;
166  }
167  return 0;
168}
169]])],[have_shm_ipc=yes],[have_shm_ipc=no],[have_shm_ipc=no])
170  if test "$have_shm_ipc" = "yes"; then
171    AC_DEFINE(HAVE_SHM_IPC, 1, [Define if you have SysV IPC SHM support])
172  fi
173  AC_MSG_RESULT([$have_shm_ipc])
174
175  AC_MSG_CHECKING(for mmap() using MAP_ANON shared memory support)
176  AC_RUN_IFELSE([AC_LANG_SOURCE([[
177#include <sys/types.h>
178#include <sys/wait.h>
179#include <sys/mman.h>
180#include <unistd.h>
181#include <string.h>
182
183#ifndef MAP_ANON
184# ifdef MAP_ANONYMOUS
185#  define MAP_ANON MAP_ANONYMOUS
186# endif
187#endif
188#ifndef MAP_FAILED
189# define MAP_FAILED ((void*)-1)
190#endif
191
192int main(void) {
193  pid_t pid;
194  int status;
195  char *shm;
196
197  shm = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
198  if (shm == MAP_FAILED) {
199    return 1;
200  }
201
202  strcpy(shm, "hello");
203
204  pid = fork();
205  if (pid < 0) {
206    return 5;
207  } else if (pid == 0) {
208    strcpy(shm, "bye");
209    return 6;
210  }
211  if (wait(&status) != pid) {
212    return 7;
213  }
214  if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) {
215    return 8;
216  }
217  if (strcmp(shm, "bye") != 0) {
218    return 9;
219  }
220  return 0;
221}
222]])],[have_shm_mmap_anon=yes],[have_shm_mmap_anon=no],[
223  case $host_alias in
224    *linux*)
225      have_shm_mmap_anon=yes
226      ;;
227    *)
228      have_shm_mmap_anon=no
229      ;;
230  esac
231])
232  if test "$have_shm_mmap_anon" = "yes"; then
233    AC_DEFINE(HAVE_SHM_MMAP_ANON, 1, [Define if you have mmap(MAP_ANON) SHM support])
234  fi
235  AC_MSG_RESULT([$have_shm_mmap_anon])
236
237  PHP_CHECK_FUNC_LIB(shm_open, rt, root)
238  AC_MSG_CHECKING(for mmap() using shm_open() shared memory support)
239  AC_RUN_IFELSE([AC_LANG_SOURCE([[
240#include <sys/types.h>
241#include <sys/wait.h>
242#include <sys/mman.h>
243#include <sys/stat.h>
244#include <fcntl.h>
245#include <unistd.h>
246#include <string.h>
247#include <stdlib.h>
248#include <stdio.h>
249
250#ifndef MAP_FAILED
251# define MAP_FAILED ((void*)-1)
252#endif
253
254int main(void) {
255  pid_t pid;
256  int status;
257  int fd;
258  char *shm;
259  char tmpname[4096];
260
261  sprintf(tmpname,"/opcache.test.shm.%dXXXXXX", getpid());
262  if (mktemp(tmpname) == NULL) {
263    return 1;
264  }
265  fd = shm_open(tmpname, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
266  if (fd == -1) {
267    return 2;
268  }
269  if (ftruncate(fd, 4096) < 0) {
270    close(fd);
271    shm_unlink(tmpname);
272    return 3;
273  }
274
275  shm = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
276  if (shm == MAP_FAILED) {
277    return 4;
278  }
279  shm_unlink(tmpname);
280  close(fd);
281
282  strcpy(shm, "hello");
283
284  pid = fork();
285  if (pid < 0) {
286    return 5;
287  } else if (pid == 0) {
288    strcpy(shm, "bye");
289    return 6;
290  }
291  if (wait(&status) != pid) {
292    return 7;
293  }
294  if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) {
295    return 8;
296  }
297  if (strcmp(shm, "bye") != 0) {
298    return 9;
299  }
300  return 0;
301}
302]])],[have_shm_mmap_posix=yes],[have_shm_mmap_posix=no],[have_shm_mmap_posix=no])
303  AC_MSG_RESULT([$have_shm_mmap_posix])
304  if test "$have_shm_mmap_posix" = "yes"; then
305    AC_DEFINE(HAVE_SHM_MMAP_POSIX, 1, [Define if you have POSIX mmap() SHM support])
306    PHP_CHECK_LIBRARY(rt, shm_unlink, [PHP_ADD_LIBRARY(rt,1,OPCACHE_SHARED_LIBADD)])
307  fi
308
309  PHP_NEW_EXTENSION(opcache,
310	ZendAccelerator.c \
311	zend_accelerator_blacklist.c \
312	zend_accelerator_debug.c \
313	zend_accelerator_hash.c \
314	zend_accelerator_module.c \
315	zend_persist.c \
316	zend_persist_calc.c \
317	zend_file_cache.c \
318	zend_shared_alloc.c \
319	zend_accelerator_util_funcs.c \
320	shared_alloc_shm.c \
321	shared_alloc_mmap.c \
322	shared_alloc_posix.c \
323	$ZEND_JIT_SRC,
324	shared,,"-Wno-implicit-fallthrough -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 ${JIT_CFLAGS}",,yes)
325
326  PHP_ADD_EXTENSION_DEP(opcache, pcre)
327
328  if test "$have_shm_ipc" != "yes" && test "$have_shm_mmap_posix" != "yes" && test "$have_shm_mmap_anon" != "yes"; then
329    AC_MSG_ERROR([No supported shared memory caching support was found when configuring opcache. Check config.log for any errors or missing dependencies.])
330  fi
331
332  if test "$PHP_OPCACHE_JIT" = "yes"; then
333    PHP_ADD_BUILD_DIR([$ext_builddir/jit], 1)
334    PHP_ADD_BUILD_DIR([$ext_builddir/jit/ir], 1)
335    PHP_ADD_MAKEFILE_FRAGMENT($ext_srcdir/jit/Makefile.frag)
336  fi
337  PHP_SUBST(OPCACHE_SHARED_LIBADD)
338fi
339