mirror of
https://github.com/php/php-src.git
synced 2026-04-01 05:02:27 +02:00
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).
366 lines
8.8 KiB
Plaintext
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
|