X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=m4%2Fpsi%2Fpsi.m4;h=c534ed4a850820593e77d08556f45953cbdc8516;hp=b0bbbf3056f3908fbfd07427b684192e4b5b1416;hb=f76cbab7698c988217d56a96f3ef68005cddd5ec;hpb=fb1661f43586388050fd42b9702c7beefaae08f3 diff --git a/m4/psi/psi.m4 b/m4/psi/psi.m4 index b0bbbf3..c534ed4 100644 --- a/m4/psi/psi.m4 +++ b/m4/psi/psi.m4 @@ -1,190 +1,206 @@ -dnl Generated headers with pre-defined types, structs, consts and decls. -PSI_STDINC=$PHP_PSI_SRCDIR/php_psi_stdinc.h -PSI_STDTYPES=$PHP_PSI_SRCDIR/php_psi_stdtypes.h -PSI_TYPES=$PHP_PSI_SRCDIR/php_psi_types.h -PSI_STRUCTS=$PHP_PSI_SRCDIR/php_psi_structs.h -PSI_UNIONS=$PHP_PSI_SRCDIR/php_psi_unions.h -PSI_CONSTS=$PHP_PSI_SRCDIR/php_psi_consts.h -PSI_REDIRS=$PHP_PSI_SRCDIR/php_psi_redirs.h -PSI_MACROS=$PHP_PSI_SRCDIR/php_psi_macros.h -PSI_DECLS=$PHP_PSI_SRCDIR/php_psi_decls.h -PSI_VA_DECLS=$PHP_PSI_SRCDIR/php_psi_va_decls.h -PSI_FN_DECLS=$PHP_PSI_SRCDIR/php_psi_fn_decls.h - dnl PSI_CONFIG_INIT() dnl Creates stubs of the headers with pre-defined types etc. -dnl These headers are included by src/context.c. -dnl This macro must be called prior any checks for a type, struct, decl etc. -AC_DEFUN(PSI_CONFIG_INIT, [AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])dnl - for i in $PSI_STDTYPES $PSI_TYPES $PSI_STRUCTS $PSI_UNIONS $PSI_CONSTS $PSI_REDIRS $PSI_MACROS $PSI_DECLS $PSI_VA_DECLS $PSI_FN_DECLS; do - cat >$i <>$PSI_STDTYPES <@ = { - {PSI_T_INT8, "int8_t", NULL}, - {PSI_T_INT16, "int16_t", NULL}, - {PSI_T_INT32, "int32_t", NULL}, - {PSI_T_INT64, "int64_t", NULL}, - {PSI_T_UINT8, "uint8_t", NULL}, - {PSI_T_UINT16, "uint16_t", NULL}, - {PSI_T_UINT32, "uint32_t", NULL}, - {PSI_T_UINT64, "uint64_t", NULL}, -EOF - cat >>$PSI_TYPES <@ = { -EOF - cat >>$PSI_STRUCTS <@ = { -EOF - cat >>$PSI_UNIONS <@ = { -EOF - cat >>$PSI_CONSTS <@ = { -EOF - cat >>$PSI_REDIRS <@ = { -EOF - cat >>$PSI_MACROS <>$PSI_DECLS <@ = { -EOF - cat >>$PSI_VA_DECLS <@ = { -EOF - cat >>$PSI_FN_DECLS <@ = { -EOF +AC_DEFUN(PSI_CONFIG_INIT, [ + psi_save_LIBS=$LIBS + LIBS= + + ac_includes_default="AC_INCLUDES_DEFAULT" + + AC_MSG_CHECKING([psi source dir]) + PHP_PSI_SRCDIR=PHP_EXT_SRCDIR(psi) + AC_MSG_RESULT([$PHP_PSI_SRCDIR]) + + AC_MSG_CHECKING([psi build dir]) + case "PHP_EXT_BUILDDIR(psi)" in + ""|.) PHP_PSI_BUILDDIR=$PHP_PSI_SRCDIR + ;; + *) PHP_PSI_BUILDDIR=PHP_EXT_BUILDDIR(psi) + ;; + esac + AC_MSG_RESULT([$PHP_PSI_BUILDDIR]) + + PSI_STDTYPES= + PSI_CONSTS= + + AC_CONFIG_FILES( + [$PHP_PSI_BUILDDIR/php_psi_stdinc.h:$PHP_PSI_SRCDIR/php_psi_stdinc.h.in] + [$PHP_PSI_BUILDDIR/php_psi_posix.h:$PHP_PSI_SRCDIR/php_psi_posix.h.in] + [$PHP_PSI_BUILDDIR/php_psi_cpp.h:$PHP_PSI_SRCDIR/php_psi_cpp.h.in] + ) + ]) dnl PSI_CONFIG_DONE() dnl Finish the headers with the pre-defined types etc. AC_DEFUN(PSI_CONFIG_DONE, [ - cat >$PSI_STDINC <>$i < -AC_DEFUN(PSI_SH_CONFIG_POSIX_ENABLED, [$AS_TR_SH([psi_config_posix_]$1)]) +dnl PSI_CHECK_GNU_SOURCE +dnl Check whether _GNU_SOURCE is already defined. +AC_DEFUN([PSI_CHECK_GNU_SOURCE], [ + AC_MSG_CHECKING([for _GNU_SOURCE]) + AC_EGREP_CPP([gnu_source_not_defined], [ + #ifndef _GNU_SOURCE + gnu_source_not_defined + #endif + ], [ + AC_MSG_RESULT([needs define]) + AC_DEFINE([_GNU_SOURCE], [1], [ ]) + ], [ + AC_MSG_RESULT([already defined]) + ]) +]) -dnl PSI_CONFIG_POSIX_ENABLED(section, action-if-yes, action-if-not) -dnl Internal. Used to check if --enable-psi-posix=section was given. -AC_DEFUN(PSI_CONFIG_POSIX_ENABLED, [ - AS_TR_SH([psi_config_posix_]$1)=false - case "$PHP_PSI_POSIX" in - yes|all) - AS_TR_SH([psi_config_posix_]$1)=true - ;; - *) - if expr "$PHP_PSI_POSIX" : '\b$1\b' >/dev/null; then - AS_TR_SH([psi_config_posix_]$1)=true - fi - ;; - esac - if $AS_TR_SH([psi_config_posix_]$1); then - ifelse([$2],,:,[$2]) - else - ifelse([$3],,:,[$3]) - fi +dnl PSI_CHECK_CPP +dnl Queries the preprocessor about predefined macros and include search paths +AC_DEFUN([PSI_CHECK_CPP], [ + AC_PROG_AWK + + AC_MSG_CHECKING(for preprocessor defaults) + psi_cpp_predef=`$CPP -Wp,-dM $CPPFLAGS -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -U__BLOCKS__ - &1 >/dev/null \ + | $AWK ' + /include.*search.*start/ { + capture = 1 + next + } + /@<:@Ee@:>@nd.*search/ { + capture = 0 + } + { + if (capture) + print $1 + } + ' \ + ` + psi_cpp_predef_count=`printf %s "$psi_cpp_predef" | wc -l` + psi_cpp_search_count=`printf %s "$psi_cpp_search" | wc -l` + + AC_MSG_RESULT([$psi_cpp_predef_count predefined macros, and $psi_cpp_search_count search paths]) + + PSI_CPP_PREDEF=`printf "%s\n" "$psi_cpp_predef" | \ + $AWK '{ + gsub(/"/, "\\\\\""); + printf "\"%s\\\n\"\n", $[]0 + }' \ + ` + PSI_CPP_SEARCH=`printf %s "$psi_cpp_search" | \ + $AWK ' + { + if (i) printf "\":\" "; + else printf " "; + gsub(/^@<:@@<:@:space:@:>@@:>@+/,""); + gsub(/@<:@@<:@:space:@:>@@:>@+$/,""); + printf "\"%s\"\n", $[]0; + ++i + }' \ + ` ]) -dnl PSI_TEST_POSIX_ENABLED(section, action-if-yes, action-if-not) -dnl Shell-if test if PSI POSIX section was configured. -AC_DEFUN(PSI_SH_TEST_POSIX_ENABLED, [ - if test "PSI_SH_CONFIG_POSIX_ENABLED([$1])" && $PSI_SH_CONFIG_POSIX_ENABLED([$1]); then - ifelse([$2],,:,[$2]) +dnl PSI_CHECK_MAINTAINER_MODE +dnl Check for --enable-psi-maintainer-mode +dnl Enables Makefile dependencies and extra compile warnings +AC_DEFUN([PSI_CHECK_MAINTAINER_MODE], [ + if test "$PHP_PSI_MAINTAINER_MODE" = "yes"; then + PSI_DEPS=true + PHP_SUBST(PSI_DEPS) + CFLAGS="$CFLAGS -Wall -Wextra" else - ifelse([$3],,:,[$3]) + PSI_DEPS=false fi ]) -dnl PSI_CONFIG_POSIX(section, headers) -AC_DEFUN(PSI_CONFIG_POSIX, [ - PSI_CONFIG_POSIX_ENABLED($1, [ - PHP_CONFIGURE_PART(Configuring PSI POSIX: $1) - ifelse([$2],,:,[AC_CHECK_HEADERS($2)]) - ], [ - return 0 - ]) +dnl PSI_CHECK_THREADED_PARSER +dnl Check for --enable-psi-threaded-parser +dnl Enables threaded parser if HAVE_PTHREAD && HAVE_ASPRINTF +AC_DEFUN([PSI_CHECK_THREADED_PARSER], [ + if test "$PHP_PSI_THREADED_PARSER" = "yes"; then + AC_DEFINE([PSI_THREADED_PARSER], [HAVE_PTHREAD && HAVE_ASPRINTF], + [whether to enable the threaded parser]) + fi ]) AC_DEFUN(PSI_PTHREAD_ONCE, [ AX_PTHREAD([ LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + AC_DEFINE([HAVE_PTHREAD],[1], + [Define if you have POSIX threads libraries and header files.]) ]) ]) -AC_DEFUN(PSI_PTHREAD, [ +AC_DEFUN(PSI_CHECK_PTHREAD, [ AC_REQUIRE([PSI_PTHREAD_ONCE]) ]) dnl PSI_INCLUDES() dnl Expands to a complete list of include statements including -dnl AC_INCLUDES_DEFAULT(). -AC_DEFUN(PSI_INCLUDES, [#define PSI_INCLUDES +dnl autoconf defaults. +AC_DEFUN(PSI_INCLUDES, [ #ifndef _GNU_SOURCE # define _GNU_SOURCE #endif #ifndef _REENTRANT # define _REENTRANT #endif -AC_INCLUDES_DEFAULT() +$ac_includes_default +#ifdef HAVE_STDBOOL_H +# include +#else +# ifndef HAVE__BOOL +# ifdef __cplusplus +typedef bool _Bool; +# else +# define _Bool signed char +# endif +# endif +# define bool _Bool +# define false 0 +# define true 1 +# define __bool_true_false_are_defined 1 +#endif #ifdef HAVE_ERRNO_H # include #endif @@ -206,6 +222,9 @@ AC_INCLUDES_DEFAULT() #ifdef HAVE_ARPA_NAMESER_H # include #endif +#ifdef HAVE_ARPA_INET_H +# include +#endif #ifdef HAVE_FCNTL_H # include #endif @@ -260,14 +279,6 @@ AC_INCLUDES_DEFAULT() #endif ]) -dnl PSI_LEMON() -dnl Declare $LEMON precious, and check for a `lemon` in $PATH. -AC_DEFUN(PSI_LEMON, [ - AC_ARG_VAR(LEMON, The lemon parser generator of the SQLite project) - AC_PATH_PROG(LEMON, lemon, ./lemon) - PHP_SUBST(LEMON) -]) - dnl PSI_PKG_CONFIG() dnl Check for `pkg-config` and add possible libjit and libffi directories to dnl $PKG_CONFIG_PATH, because those libs often ship with headers etc. in @@ -284,25 +295,13 @@ dnl PSI_SH_SIZEOF(type) dnl expand to shell variable $ac_cv_sizeof_ AC_DEFUN([PSI_SH_SIZEOF], [$AS_TR_SH([ac_cv_sizeof_]$1)]) -dnl PSI_SH_OFFSETOF(type) -dnl Expand to shell variable $ac_cv_offsetof_ -AC_DEFUN([PSI_SH_OFFSETOF], [$AS_TR_SH([ac_cv_offsetof_]$1)]) - -dnl PSI_SH_ALIGNOF(type) -dnl Expand to shell variable $ac_cv_offsetof_ -AC_DEFUN([PSI_SH_ALIGNOF], [$AS_TR_SH([ac_cv_alignof_]$1)]) - dnl PSI_SH_TEST_SIZEOF(type) dnl `if` condition to test if $ac_cv_sizeof_$1 is greater than 0. AC_DEFUN([PSI_SH_TEST_SIZEOF], [test -n "$AS_TR_SH([ac_cv_sizeof_]$1)" && test "$AS_TR_SH([ac_cv_sizeof_]$1)" -gt 0]) -dnl PSI_SH_TEST_ALIGNOF(type) -dnl `if` condition to test if $ac_cv_alignof_$1 is greater than 0. -AC_DEFUN([PSI_SH_TEST_ALIGNOF], [test -n "$AS_TR_SH([ac_cv_alignof_]$1)" && test "$AS_TR_SH([ac_cv_alignof_]$1)" -gt 0]) - dnl PSI_CHECK_SIZEOF(type, special-includes) dnl AC_CHECK_SIZEOF wrapper with PSI_INCLUDES -dnl Defines psi\\SIZEOF_ pre-defined constant in $PSI_CONSTS. +dnl Defines psi\\SIZEOF_ pre-defined constant in $PSI_CONSTS_H. AC_DEFUN(PSI_CHECK_SIZEOF, [ AC_CHECK_SIZEOF($1, [], PSI_INCLUDES $2) @@ -311,50 +310,6 @@ AC_DEFUN(PSI_CHECK_SIZEOF, [ fi ]) -dnl PSI_CHECK_ALIGNOF(type, special-includes) -dnl AC_CHECK_ALIGNOF wrapper with PSI_INCLUDES -dnl Defines psi\\ALIGNOF_ pre-defined constant in $PSI_CONSTS. -AC_DEFUN(PSI_CHECK_ALIGNOF, [ - AC_CHECK_ALIGNOF($1, PSI_INCLUDES - $2) - if PSI_SH_TEST_ALIGNOF($1); then - psi_add_int_const "AS_TR_CPP([ALIGNOF_]$1)" "$AS_TR_SH([ac_cv_alignof_]$1)" - fi -]) - -dnl PSI_CHECK_OFFSETOF(struct, element) -dnl Check the offset of a struct element, implemented in the similar manner -dnl like AC_CHECK_SIZEOF. -dnl AC_DEFINEs OFFSETOF__. -AC_DEFUN(PSI_CHECK_OFFSETOF, [ - _AC_CACHE_CHECK_INT( - [offset of $2 in $1], - [AS_TR_SH([ac_cv_offsetof_$1_$2])], - [(long int) (offsetof ($1, $2))], - [PSI_INCLUDES], - [AC_MSG_FAILURE([cannot compute offsetof ($1, $2)])] - ) - AC_DEFINE_UNQUOTED( - AS_TR_CPP(offsetof_$1_$2), - $AS_TR_SH([ac_cv_offsetof_$1_$2]), - [The offset of `$2' in `$1', as computed by offsetof.] - ) -]) - - -dnl PSI_COMPUTE_STR(variable, string or expression) -dnl Compute a string constant value in a similar manner like AC_COMPUTE_INT. -AC_DEFUN(PSI_COMPUTE_STR, [ - AC_TRY_RUN( - PSI_INCLUDES - [int main() { - return EOF == fputs($2, fopen("conftest.out", "w")); - } - ], [ - eval $1=\\\"`cat conftest.out`\\\" - ]) -]) - dnl PSI_CHECK_LIBJIT() dnl Check for libjit in $PHP_PSI_LIBJIT or standard locations dnl AC_DEFINEs HAVE_LIBJIT. @@ -404,9 +359,10 @@ AC_DEFUN(PSI_CHECK_LIBFFI, [ AC_MSG_CHECKING(for libffi) psi_cv_libffi_dir=`$PKG_CONFIG --variable=prefix libffi` AC_MSG_RESULT($psi_cv_libffi_dir) - PHP_EVAL_INCLINE(`$PKG_CONFIG --cflags libffi`) - PHP_EVAL_LIBLINE(`$PKG_CONFIG --libs libffi`, PSI_SHARED_LIBADD) + PHP_EVAL_INCLINE([`$PKG_CONFIG --cflags libffi`]) + PHP_EVAL_LIBLINE([`$PKG_CONFIG --libs libffi`], PSI_SHARED_LIBADD) dnl ` AC_DEFINE(HAVE_LIBFFI, 1, Have libffi) + AC_DEFINE_UNQUOTED([PHP_PSI_LIBFFI_VERSION], ["`$PKG_CONFIG --modversion libffi`"], [libffi version]) else AC_CACHE_CHECK(for libffi, psi_cv_libffi_dir, [ for psi_cv_libffi_dir in $PHP_PSI_LIBFFI {/usr{,/local},/opt}{,/libffi} @@ -426,6 +382,13 @@ AC_DEFUN(PSI_CHECK_LIBFFI, [ AC_MSG_WARN([Could not find libffi, please provide the base install path]) fi fi + + save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS $INCLUDES" + AC_CHECK_DECL(FFI_STDCALL,[AC_DEFINE([HAVE_FFI_STDCALL],[1],[ ])],,[#include "ffi.h"]) + AC_CHECK_DECL(FFI_FASTCALL,[AC_DEFINE([HAVE_FFI_FASTCALL],[1],[ ])],,[#include "ffi.h"]) + CFLAGS=$save_CFLAGS + PHP_CHECK_LIBRARY(ffi, ffi_closure_alloc, [ PHP_CHECK_LIBRARY(ffi, ffi_prep_closure_loc, [ AC_DEFINE(PSI_HAVE_FFI_PREP_CLOSURE_LOC, 1, [ ])