summaryrefslogtreecommitdiff
path: root/Zend/Zend.m4
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/Zend.m4')
-rw-r--r--Zend/Zend.m4435
1 files changed, 435 insertions, 0 deletions
diff --git a/Zend/Zend.m4 b/Zend/Zend.m4
new file mode 100644
index 0000000..945409e
--- /dev/null
+++ b/Zend/Zend.m4
@@ -0,0 +1,435 @@
+dnl
+dnl $Id$
+dnl
+dnl This file contains Zend specific autoconf functions.
+dnl
+
+AC_DEFUN([LIBZEND_CHECK_INT_TYPE],[
+AC_MSG_CHECKING(for $1)
+AC_TRY_COMPILE([
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if HAVE_INTTYPES_H
+#include <inttypes.h>
+#elif HAVE_STDINT_H
+#include <stdint.h>
+#endif],
+[if (($1 *) 0)
+ return 0;
+if (sizeof ($1))
+ return 0;
+],[
+ AC_DEFINE_UNQUOTED([HAVE_]translit($1,a-z_-,A-Z__), 1,[Define if $1 type is present. ])
+ AC_MSG_RESULT(yes)
+], AC_MSG_RESULT(no)
+)dnl
+])
+
+AC_DEFUN([LIBZEND_BASIC_CHECKS],[
+
+AC_REQUIRE([AC_PROG_YACC])
+AC_REQUIRE([AC_PROG_CC])
+AC_REQUIRE([AC_PROG_CC_C_O])
+AC_REQUIRE([AC_HEADER_STDC])
+
+LIBZEND_BISON_CHECK
+
+dnl Ugly hack to get around a problem with gcc on AIX.
+if test "$CC" = "gcc" -a "$ac_cv_prog_cc_g" = "yes" -a \
+ "`uname -sv`" = "AIX 4"; then
+ CFLAGS=`echo $CFLAGS | sed -e 's/-g//'`
+fi
+
+dnl Hack to work around a Mac OS X cpp problem
+dnl Known versions needing this workaround are 5.3 and 5.4
+if test "$ac_cv_prog_gcc" = "yes" -a "`uname -s`" = "Rhapsody"; then
+ CPPFLAGS="$CPPFLAGS -traditional-cpp"
+fi
+
+AC_CHECK_HEADERS(
+inttypes.h \
+stdint.h \
+limits.h \
+malloc.h \
+string.h \
+unistd.h \
+stdarg.h \
+sys/types.h \
+sys/time.h \
+signal.h \
+unix.h \
+stdlib.h \
+dlfcn.h)
+
+AC_TYPE_SIZE_T
+AC_TYPE_SIGNAL
+
+AC_DEFUN([LIBZEND_LIBDL_CHECKS],[
+AC_CHECK_LIB(dl, dlopen, [LIBS="-ldl $LIBS"])
+AC_CHECK_FUNC(dlopen,[AC_DEFINE(HAVE_LIBDL, 1,[ ])])
+])
+
+AC_DEFUN([LIBZEND_DLSYM_CHECK],[
+dnl
+dnl Ugly hack to check if dlsym() requires a leading underscore in symbol name.
+dnl
+AC_MSG_CHECKING([whether dlsym() requires a leading underscore in symbol names])
+_LT_AC_TRY_DLOPEN_SELF([
+ AC_MSG_RESULT(no)
+], [
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(DLSYM_NEEDS_UNDERSCORE, 1, [Define if dlsym() requires a leading underscore in symbol names. ])
+], [
+ AC_MSG_RESULT(no)
+], [])
+])
+
+dnl This is required for QNX and may be some BSD derived systems
+AC_CHECK_TYPE( uint, unsigned int )
+AC_CHECK_TYPE( ulong, unsigned long )
+
+dnl Check if int32_t and uint32_t are defined
+LIBZEND_CHECK_INT_TYPE(int32_t)
+LIBZEND_CHECK_INT_TYPE(uint32_t)
+
+dnl Checks for library functions.
+AC_FUNC_VPRINTF
+AC_FUNC_MEMCMP
+AC_FUNC_ALLOCA
+AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol finite fpclass sigsetjmp)
+AC_ZEND_BROKEN_SPRINTF
+
+AC_CHECK_FUNCS(finite isfinite isinf isnan)
+
+ZEND_FP_EXCEPT
+
+ZEND_CHECK_FLOAT_PRECISION
+
+dnl test whether double cast to long preserves least significant bits
+AC_MSG_CHECKING(whether double cast to long preserves least significant bits)
+
+AC_TRY_RUN([
+#include <limits.h>
+
+int main()
+{
+ if (sizeof(long) == 4) {
+ double d = (double) LONG_MIN * LONG_MIN + 2e9;
+
+ if ((long) d == 2e9 && (long) -d == -2e9) {
+ exit(0);
+ }
+ } else if (sizeof(long) == 8) {
+ double correct = 18e18 - ((double) LONG_MIN * -2); /* Subtract ULONG_MAX + 1 */
+
+ if ((long) 18e18 == correct) { /* On 64-bit, only check between LONG_MAX and ULONG_MAX */
+ exit(0);
+ }
+ }
+ exit(1);
+}
+], [
+ AC_DEFINE([ZEND_DVAL_TO_LVAL_CAST_OK], 1, [Define if double cast to long preserves least significant bits])
+ AC_MSG_RESULT(yes)
+], [
+ AC_MSG_RESULT(no)
+], [
+ AC_MSG_RESULT(no)
+])
+
+])
+
+AC_DEFUN([LIBZEND_ENABLE_DEBUG],[
+
+AC_ARG_ENABLE(debug,
+[ --enable-debug Compile with debugging symbols],[
+ ZEND_DEBUG=$enableval
+],[
+ ZEND_DEBUG=no
+])
+
+])
+
+AC_DEFUN([LIBZEND_OTHER_CHECKS],[
+
+AC_ARG_WITH(zend-vm,
+[ --with-zend-vm=TYPE Set virtual machine dispatch method. Type is
+ one of "CALL", "SWITCH" or "GOTO" [TYPE=CALL]],[
+ PHP_ZEND_VM=$withval
+],[
+ PHP_ZEND_VM=CALL
+])
+
+AC_ARG_ENABLE(maintainer-zts,
+[ --enable-maintainer-zts Enable thread safety - for code maintainers only!!],[
+ ZEND_MAINTAINER_ZTS=$enableval
+],[
+ ZEND_MAINTAINER_ZTS=no
+])
+
+AC_ARG_ENABLE(inline-optimization,
+[ --disable-inline-optimization
+ If building zend_execute.lo fails, try this switch],[
+ ZEND_INLINE_OPTIMIZATION=$enableval
+],[
+ ZEND_INLINE_OPTIMIZATION=yes
+])
+
+AC_MSG_CHECKING([virtual machine dispatch method])
+AC_MSG_RESULT($PHP_ZEND_VM)
+
+AC_MSG_CHECKING(whether to enable thread-safety)
+AC_MSG_RESULT($ZEND_MAINTAINER_ZTS)
+
+AC_MSG_CHECKING(whether to enable inline optimization for GCC)
+AC_MSG_RESULT($ZEND_INLINE_OPTIMIZATION)
+
+AC_MSG_CHECKING(whether to enable Zend debugging)
+AC_MSG_RESULT($ZEND_DEBUG)
+
+case $PHP_ZEND_VM in
+ SWITCH)
+ AC_DEFINE(ZEND_VM_KIND,ZEND_VM_KIND_SWITCH,[virtual machine dispatch method])
+ ;;
+ GOTO)
+ AC_DEFINE(ZEND_VM_KIND,ZEND_VM_KIND_GOTO,[virtual machine dispatch method])
+ ;;
+ *)
+ PHP_ZEND_VM=CALL
+ AC_DEFINE(ZEND_VM_KIND,ZEND_VM_KIND_CALL,[virtual machine dispatch method])
+ ;;
+esac
+
+if test "$ZEND_DEBUG" = "yes"; then
+ AC_DEFINE(ZEND_DEBUG,1,[ ])
+ echo " $CFLAGS" | grep ' -g' >/dev/null || DEBUG_CFLAGS="-g"
+ if test "$CFLAGS" = "-g -O2"; then
+ CFLAGS=-g
+ fi
+ test -n "$GCC" && DEBUG_CFLAGS="$DEBUG_CFLAGS -Wall"
+ test -n "$GCC" && test "$USE_MAINTAINER_MODE" = "yes" && \
+ DEBUG_CFLAGS="$DEBUG_CFLAGS -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations"
+else
+ AC_DEFINE(ZEND_DEBUG,0,[ ])
+fi
+
+test -n "$DEBUG_CFLAGS" && CFLAGS="$CFLAGS $DEBUG_CFLAGS"
+
+if test "$ZEND_MAINTAINER_ZTS" = "yes"; then
+ AC_DEFINE(ZTS,1,[ ])
+ CFLAGS="$CFLAGS -DZTS"
+ LIBZEND_CPLUSPLUS_CHECKS
+fi
+
+changequote({,})
+if test -n "$GCC" && test "$ZEND_INLINE_OPTIMIZATION" != "yes"; then
+ INLINE_CFLAGS=`echo $ac_n "$CFLAGS $ac_c" | sed s/-O[0-9s]*//`
+else
+ INLINE_CFLAGS="$CFLAGS"
+fi
+changequote([,])
+
+AC_C_INLINE
+
+AC_SUBST(INLINE_CFLAGS)
+
+AC_MSG_CHECKING(target system is Darwin)
+if echo "$target" | grep "darwin" > /dev/null; then
+ AC_DEFINE([DARWIN], 1, [Define if the target system is darwin])
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+
+dnl test and set the alignment define for ZEND_MM
+dnl this also does the logarithmic test for ZEND_MM.
+AC_MSG_CHECKING(for MM alignment and log values)
+
+AC_TRY_RUN([
+#include <stdio.h>
+
+typedef union _mm_align_test {
+ void *ptr;
+ double dbl;
+ long lng;
+} mm_align_test;
+
+#if (defined (__GNUC__) && __GNUC__ >= 2)
+#define ZEND_MM_ALIGNMENT (__alignof__ (mm_align_test))
+#else
+#define ZEND_MM_ALIGNMENT (sizeof(mm_align_test))
+#endif
+
+int main()
+{
+ int i = ZEND_MM_ALIGNMENT;
+ int zeros = 0;
+ FILE *fp;
+
+ while (i & ~0x1) {
+ zeros++;
+ i = i >> 1;
+ }
+
+ fp = fopen("conftest.zend", "w");
+ fprintf(fp, "%d %d\n", ZEND_MM_ALIGNMENT, zeros);
+ fclose(fp);
+
+ exit(0);
+}
+], [
+ LIBZEND_MM_ALIGN=`cat conftest.zend | cut -d ' ' -f 1`
+ LIBZEND_MM_ALIGN_LOG2=`cat conftest.zend | cut -d ' ' -f 2`
+ AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT, $LIBZEND_MM_ALIGN, [ ])
+ AC_DEFINE_UNQUOTED(ZEND_MM_ALIGNMENT_LOG2, $LIBZEND_MM_ALIGN_LOG2, [ ])
+], [], [
+ dnl cross-compile needs something here
+ LIBZEND_MM_ALIGN=8
+])
+
+AC_MSG_RESULT(done)
+
+dnl test for memory allocation using mmap(MAP_ANON)
+AC_MSG_CHECKING(for memory allocation using mmap(MAP_ANON))
+
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <stdlib.h>
+#include <stdio.h>
+#ifndef MAP_ANON
+# ifdef MAP_ANONYMOUS
+# define MAP_ANON MAP_ANONYMOUS
+# endif
+#endif
+#ifndef MREMAP_MAYMOVE
+# define MREMAP_MAYMOVE 0
+#endif
+#ifndef MAP_FAILED
+# define MAP_FAILED ((void*)-1)
+#endif
+
+#define SEG_SIZE (256*1024)
+
+int main()
+{
+ void *seg = mmap(NULL, SEG_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
+ if (seg == MAP_FAILED) {
+ return 1;
+ }
+ if (munmap(seg, SEG_SIZE) != 0) {
+ return 2;
+ }
+ return 0;
+}
+], [
+ AC_DEFINE([HAVE_MEM_MMAP_ANON], 1, [Define if the target system has support for memory allocation using mmap(MAP_ANON)])
+ AC_MSG_RESULT(yes)
+], [
+ AC_MSG_RESULT(no)
+], [
+ dnl cross-compile needs something here
+ AC_MSG_RESULT(no)
+])
+
+dnl test for memory allocation using mmap("/dev/zero")
+AC_MSG_CHECKING(for memory allocation using mmap("/dev/zero"))
+
+AC_TRY_RUN([
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <stdlib.h>
+#include <stdio.h>
+#ifndef MAP_ANON
+# ifdef MAP_ANONYMOUS
+# define MAP_ANON MAP_ANONYMOUS
+# endif
+#endif
+#ifndef MREMAP_MAYMOVE
+# define MREMAP_MAYMOVE 0
+#endif
+#ifndef MAP_FAILED
+# define MAP_FAILED ((void*)-1)
+#endif
+
+#define SEG_SIZE (256*1024)
+
+int main()
+{
+ int fd;
+ void *seg;
+
+ fd = open("/dev/zero", O_RDWR, S_IRUSR | S_IWUSR);
+ if (fd < 0) {
+ return 1;
+ }
+ seg = mmap(NULL, SEG_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
+ if (seg == MAP_FAILED) {
+ return 2;
+ }
+ if (munmap(seg, SEG_SIZE) != 0) {
+ return 3;
+ }
+ if (close(fd) != 0) {
+ return 4;
+ }
+ return 0;
+}
+], [
+ AC_DEFINE([HAVE_MEM_MMAP_ZERO], 1, [Define if the target system has support for memory allocation using mmap("/dev/zero")])
+ AC_MSG_RESULT(yes)
+], [
+ AC_MSG_RESULT(no)
+], [
+ dnl cross-compile needs something here
+ AC_MSG_RESULT(no)
+])
+
+AC_CHECK_FUNCS(mremap)
+
+
+AC_ARG_ENABLE(zend-signals,
+[ --enable-zend-signals Use zend signal handling],[
+ ZEND_SIGNALS=$enableval
+],[
+ ZEND_SIGNALS=no
+])
+
+AC_CHECK_FUNC(sigaction, [
+ AC_DEFINE(HAVE_SIGACTION, 1, [Whether sigaction() is available])
+], [
+ ZEND_SIGNALS=no
+])
+if test "$ZEND_SIGNALS" = "yes"; then
+ AC_DEFINE(ZEND_SIGNALS, 1, [Use zend signal handling])
+ CFLAGS="$CFLAGS -DZEND_SIGNALS"
+fi
+
+AC_MSG_CHECKING(whether to enable zend signal handling)
+AC_MSG_RESULT($ZEND_SIGNALS)
+
+])
+
+AC_DEFUN([LIBZEND_CPLUSPLUS_CHECKS],[
+
+])
+
+AC_MSG_CHECKING(whether /dev/urandom exists)
+if test -r "/dev/urandom" && test -c "/dev/urandom"; then
+ AC_DEFINE([HAVE_DEV_URANDOM], 1, [Define if the target system has /dev/urandom device])
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+ AC_MSG_CHECKING(whether /dev/arandom exists)
+ if test -r "/dev/arandom" && test -c "/dev/arandom"; then
+ AC_DEFINE([HAVE_DEV_ARANDOM], 1, [Define if the target system has /dev/arandom device])
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ fi
+fi