1
0
mirror of https://github.com/php/php-src.git synced 2026-04-01 05:02:27 +02:00
Files
archived-php-src/ext/opcache/config.m4
Peter Kokot f3c48f1acd Autotools: Append hash and opcache build directories (#15132)
When building in out-of-source directory, instead of creating these
build directories right away, this appends them to the list and creates
them at the end of configure phase. These don't need to be created
immediately as no files are generated in these extensions before the
configure phase is finished.

Also, the PHP_ADD_BUILD_DIR is moved after the PHP_NEW_EXTENSION when
the more common $ext_builddir variable is available (the ext/<extension>
isn't available when building with phpize).
2024-07-29 10:02:11 +02:00

366 lines
8.8 KiB
Plaintext

PHP_ARG_ENABLE([opcache],
[whether to enable Zend OPcache support],
[AS_HELP_STRING([--disable-opcache],
[Disable Zend OPcache support])],
[yes])
PHP_ARG_ENABLE([huge-code-pages],
[whether to enable copying PHP CODE pages into HUGE PAGES],
[AS_HELP_STRING([--disable-huge-code-pages],
[Disable copying PHP CODE pages into HUGE PAGES])],
[yes],
[no])
PHP_ARG_ENABLE([opcache-jit],
[whether to enable JIT],
[AS_HELP_STRING([--disable-opcache-jit],
[Disable JIT])],
[yes],
[no])
PHP_ARG_WITH([capstone],
[whether to support opcache JIT dissasembly through Capstone],
[AS_HELP_STRING([--with-capstone],
[Support opcache JIT disassembly through Capstone])],
[no],
[no])
if test "$PHP_OPCACHE" != "no"; then
dnl Always build as shared extension
ext_shared=yes
if test "$PHP_HUGE_CODE_PAGES" = "yes"; then
AC_DEFINE(HAVE_HUGE_CODE_PAGES, 1, [Define to enable copying PHP CODE pages into HUGE PAGES (experimental)])
fi
if test "$PHP_OPCACHE_JIT" = "yes"; then
case $host_cpu in
i[[34567]]86*|x86*|aarch64|amd64)
;;
*)
AC_MSG_WARN([JIT not supported by host architecture])
PHP_OPCACHE_JIT=no
;;
esac
if test "$host_vendor" = "apple" && test "$host_cpu" = "aarch64" && test "$PHP_THREAD_SAFETY" = "yes"; then
AC_MSG_WARN([JIT not supported on Apple Silicon with ZTS])
PHP_OPCACHE_JIT=no
fi
fi
if test "$PHP_OPCACHE_JIT" = "yes" ; then
AC_DEFINE(HAVE_JIT, 1, [Define to enable JIT])
ZEND_JIT_SRC=m4_normalize(["
jit/ir/ir_cfg.c
jit/ir/ir_check.c
jit/ir/ir_dump.c
jit/ir/ir_emit.c
jit/ir/ir_gcm.c
jit/ir/ir_gdb.c
jit/ir/ir_patch.c
jit/ir/ir_perf.c
jit/ir/ir_ra.c
jit/ir/ir_save.c
jit/ir/ir_sccp.c
jit/ir/ir_strtab.c
jit/ir/ir.c
jit/zend_jit_vm_helpers.c
jit/zend_jit.c
"])
dnl Find out which ABI we are using.
case $host_alias in
x86_64-*-darwin*)
IR_TARGET=IR_TARGET_X64
DASM_FLAGS="-D X64APPLE=1 -D X64=1"
DASM_ARCH="x86"
;;
*x86_64*|amd64-*-freebsd*)
IR_TARGET=IR_TARGET_X64
DASM_FLAGS="-D X64=1"
DASM_ARCH="x86"
;;
i[[34567]]86*)
IR_TARGET=IR_TARGET_X86
DASM_ARCH="x86"
;;
x86*)
IR_TARGET=IR_TARGET_X86
DASM_ARCH="x86"
;;
aarch64*)
IR_TARGET=IR_TARGET_AARCH64
DASM_ARCH="aarch64"
;;
esac
AS_VAR_IF([PHP_CAPSTONE], [yes],
[PKG_CHECK_MODULES([CAPSTONE], [capstone >= 3.0.0], [
AC_DEFINE([HAVE_CAPSTONE], [1], [Define to 1 if Capstone is available.])
PHP_EVAL_LIBLINE([$CAPSTONE_LIBS], [OPCACHE_SHARED_LIBADD])
PHP_EVAL_INCLINE([$CAPSTONE_CFLAGS])
ZEND_JIT_SRC="$ZEND_JIT_SRC jit/ir/ir_disasm.c"
])])
PHP_SUBST([IR_TARGET])
PHP_SUBST([DASM_FLAGS])
PHP_SUBST([DASM_ARCH])
JIT_CFLAGS="-I@ext_builddir@/jit/ir -D$IR_TARGET -DIR_PHP"
AS_VAR_IF([ZEND_DEBUG], [yes], [JIT_CFLAGS="$JIT_CFLAGS -DIR_DEBUG"])
fi
AC_CHECK_FUNCS([mprotect shm_create_largepage])
AC_CACHE_CHECK([for sysvipc shared memory support], [php_cv_shm_ipc],
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <string.h>
int main(void) {
pid_t pid;
int status;
int ipc_id;
char *shm;
struct shmid_ds shmbuf;
ipc_id = shmget(IPC_PRIVATE, 4096, (IPC_CREAT | SHM_R | SHM_W));
if (ipc_id == -1) {
return 1;
}
shm = shmat(ipc_id, NULL, 0);
if (shm == (void *)-1) {
shmctl(ipc_id, IPC_RMID, NULL);
return 2;
}
if (shmctl(ipc_id, IPC_STAT, &shmbuf) != 0) {
shmdt(shm);
shmctl(ipc_id, IPC_RMID, NULL);
return 3;
}
shmbuf.shm_perm.uid = getuid();
shmbuf.shm_perm.gid = getgid();
shmbuf.shm_perm.mode = 0600;
if (shmctl(ipc_id, IPC_SET, &shmbuf) != 0) {
shmdt(shm);
shmctl(ipc_id, IPC_RMID, NULL);
return 4;
}
shmctl(ipc_id, IPC_RMID, NULL);
strcpy(shm, "hello");
pid = fork();
if (pid < 0) {
return 5;
} else if (pid == 0) {
strcpy(shm, "bye");
return 6;
}
if (wait(&status) != pid) {
return 7;
}
if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) {
return 8;
}
if (strcmp(shm, "bye") != 0) {
return 9;
}
return 0;
}
]])],
[php_cv_shm_ipc=yes],
[php_cv_shm_ipc=no],
[php_cv_shm_ipc=no])])
AS_VAR_IF([php_cv_shm_ipc], [yes],
[AC_DEFINE([HAVE_SHM_IPC], [1],
[Define to 1 if you have the SysV IPC SHM support.])])
AC_CACHE_CHECK([for mmap() using MAP_ANON shared memory support],
[php_cv_shm_mmap_anon],
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <unistd.h>
#include <string.h>
#ifndef MAP_ANON
# ifdef MAP_ANONYMOUS
# define MAP_ANON MAP_ANONYMOUS
# endif
#endif
#ifndef MAP_FAILED
# define MAP_FAILED ((void*)-1)
#endif
int main(void) {
pid_t pid;
int status;
char *shm;
shm = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
if (shm == MAP_FAILED) {
return 1;
}
strcpy(shm, "hello");
pid = fork();
if (pid < 0) {
return 5;
} else if (pid == 0) {
strcpy(shm, "bye");
return 6;
}
if (wait(&status) != pid) {
return 7;
}
if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) {
return 8;
}
if (strcmp(shm, "bye") != 0) {
return 9;
}
return 0;
}
]])],
[php_cv_shm_mmap_anon=yes],
[php_cv_shm_mmap_anon=no],
[AS_CASE([$host_alias],
[*linux*|*midipix], [php_cv_shm_mmap_anon=yes],
[php_cv_shm_mmap_anon=no])])])
AS_VAR_IF([php_cv_shm_mmap_anon], [yes],
[AC_DEFINE([HAVE_SHM_MMAP_ANON], [1],
[Define to 1 if you have the mmap(MAP_ANON) SHM support.])])
dnl Check POSIX shared memory object operations and link required library as
dnl needed: rt (older Linux and Solaris <= 10). Most systems have it in the C
dnl standard library (newer Linux, illumos, Solaris 11.4, macOS, BSD-based
dnl systems...). Haiku has it in the root library, which is linked by default.
LIBS_save="$LIBS"
LIBS=
AC_SEARCH_LIBS([shm_open], [rt],
[AC_CACHE_CHECK([for mmap() using shm_open() shared memory support],
[php_cv_shm_mmap_posix],
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#ifndef MAP_FAILED
# define MAP_FAILED ((void*)-1)
#endif
int main(void) {
pid_t pid;
int status;
int fd;
char *shm;
char tmpname[4096];
sprintf(tmpname,"/opcache.test.shm.%dXXXXXX", getpid());
if (mktemp(tmpname) == NULL) {
return 1;
}
fd = shm_open(tmpname, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (fd == -1) {
return 2;
}
if (ftruncate(fd, 4096) < 0) {
close(fd);
shm_unlink(tmpname);
return 3;
}
shm = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (shm == MAP_FAILED) {
return 4;
}
shm_unlink(tmpname);
close(fd);
strcpy(shm, "hello");
pid = fork();
if (pid < 0) {
return 5;
} else if (pid == 0) {
strcpy(shm, "bye");
return 6;
}
if (wait(&status) != pid) {
return 7;
}
if (!WIFEXITED(status) || WEXITSTATUS(status) != 6) {
return 8;
}
if (strcmp(shm, "bye") != 0) {
return 9;
}
return 0;
}]])],
[php_cv_shm_mmap_posix=yes],
[php_cv_shm_mmap_posix=no],
[php_cv_shm_mmap_posix=no])
])
if test "$php_cv_shm_mmap_posix" = "yes"; then
AS_VAR_IF([ac_cv_search_shm_open], ["none required"],,
[OPCACHE_SHARED_LIBADD="$OPCACHE_SHARED_LIBADD $ac_cv_search_shm_open"])
AC_DEFINE([HAVE_SHM_MMAP_POSIX], [1],
[Define if you have POSIX mmap() SHM support])
fi
])
LIBS="$LIBS_save"
PHP_NEW_EXTENSION([opcache], m4_normalize([
shared_alloc_mmap.c
shared_alloc_posix.c
shared_alloc_shm.c
zend_accelerator_blacklist.c
zend_accelerator_debug.c
zend_accelerator_hash.c
zend_accelerator_module.c
zend_accelerator_util_funcs.c
zend_file_cache.c
zend_persist_calc.c
zend_persist.c
zend_shared_alloc.c
ZendAccelerator.c
$ZEND_JIT_SRC
]),
[shared],,
[-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1 $JIT_CFLAGS],,
[yes])
PHP_ADD_EXTENSION_DEP(opcache, pcre)
if test "$php_cv_shm_ipc" != "yes" && test "$php_cv_shm_mmap_posix" != "yes" && test "$php_cv_shm_mmap_anon" != "yes"; then
AC_MSG_ERROR([No supported shared memory caching support was found when configuring opcache. Check config.log for any errors or missing dependencies.])
fi
if test "$PHP_OPCACHE_JIT" = "yes"; then
PHP_ADD_BUILD_DIR([$ext_builddir/jit])
PHP_ADD_BUILD_DIR([$ext_builddir/jit/ir])
PHP_ADD_MAKEFILE_FRAGMENT([$ext_srcdir/jit/Makefile.frag])
fi
PHP_SUBST([OPCACHE_SHARED_LIBADD])
fi