diff options
Diffstat (limited to 'config')
-rw-r--r-- | config/open-axiom.m4 | 344 | ||||
-rw-r--r-- | config/openaxiom-c-macros.h.in | 6 |
2 files changed, 346 insertions, 4 deletions
diff --git a/config/open-axiom.m4 b/config/open-axiom.m4 index 8d345e07..1c9332ab 100644 --- a/config/open-axiom.m4 +++ b/config/open-axiom.m4 @@ -56,10 +56,6 @@ dnl -- OPENAXIOM_PROG_LISP -- dnl ------------------------- dnl Find the host Lisp compiler to use AC_DEFUN([OPENAXIOM_PROG_LISP],[ -## host Lisp system flavor -axiom_lisp_flavor=unknown -AC_SUBST(axiom_lisp_flavor) - ## Was a host Lisp system specified? axiom_lisp= AC_ARG_WITH([lisp], [ --with-lisp=L use L as Lisp platform], @@ -97,3 +93,343 @@ else : fi ]) + +dnl ----------------------------------- +dnl -- OPENAXIOM_CHECK_GCL_INCLUSION -- +dnl ----------------------------------- +dnl Check for consistency of configure options when GCL is requested. +AC_DEFUN([OPENAXIOM_CHECK_GCL_INCLUSION],[ +AC_SUBST(axiom_include_gcl) + +case $axiom_include_gcl,$1 in + ,|no,|yes*) + ## It doesn't make sense not to include GCL when no Lisp image + ## is available. Give up. + if test $axiom_include_gcl,$AXIOM_LISP = no,; then + AC_MSG_ERROR([--disable-gcl specified but no GCL image found]) + fi + + ## No Lisp image was specified and none was available from + ## the build environment; build GCL from OpenAxiom source. + ## User may explicilty specify --enable-gcl, but may be missing + ## the dependency tarball. + if test ! -d ${srcdir}/gcl; then + AC_MSG_ERROR([The OpenAxiom dependency tarball is missing; please get it from our website.]) + fi + AXIOM_LISP='$(axiom_build_bindir)/gcl' + axiom_all_prerequisites="$axiom_all_prerequisites all-gcl" + axiom_include_gcl=yes + ;; + yes,*) + AC_MSG_ERROR([--with-lisp=$1 conflicts with --enable-gcl]) + ;; +esac +]) + +dnl --------------------------- +dnl -- OPENAXIOM_LISP_FLAVOR -- +dnl --------------------------- +dnl Determine the flavor of the host Lisp system. +AC_DEFUN([OPENAXIOM_LISP_FLAVOR],[ +OPENAXIOM_CHECK_GCL_INCLUSION($1) + +axiom_lisp_flavor=unknown +AC_SUBST(axiom_lisp_flavor) + +## Most Lisp systems don't use conventional methods for building programs. +oa_standard_linking=no +AC_SUBST(oa_standard_linking) + +## The pipe below is OK, for as of this writting, the free Lisp systems +## ECL, GCL, SBCL, CLisp, and Clozure CL all exit at end of standard input. +AC_MSG_CHECKING([which flavor of Lisp]) +if test x"$axiom_include_gcl,$axiom_lisp" = xyes; then + axiom_lisp_flavor=gcl +else + case `echo '(lisp-implementation-type)' | $1` in + *GCL*) + axiom_lisp_flavor=gcl + ;; + *"ECL"*) + axiom_lisp_flavor=ecl + oa_standard_linking=yes + ;; + *"SBCL"*) + axiom_lisp_flavor=sbcl + ;; + *"CLISP"*) + ## Not all variants of CLisp have FFI support. FFI is used + ## internally used by OpenAxiom in essential way. + if ! $1 -q -x '*features*' | grep ':FFI' > /dev/null + then + AC_MSG_ERROR([$1 does not support Foreign Function Interface. Please upgrade to a better version of CLisp or install SBCL.]) + fi + axiom_lisp_flavor=clisp + ;; + *"Armed Bear Common Lisp"*) + axiom_lisp_flavor=abcl + ;; + *"Clozure Common Lisp"*) + axiom_lisp_flavor=clozure + ;; + esac +fi +AC_MSG_RESULT([$axiom_lisp_flavor]) + +AC_DEFINE_UNQUOTED([OPENAXIOM_BASE_RTS], + [openaxiom_${axiom_lisp_flavor}_runtime], + [The kind of base runtime system for this build.]) +]) + +dnl ------------------------------ +dnl -- OPENAXIOM_HOST_COMPILERS -- +dnl ------------------------------ +dnl Check for the host C, C++, and Lisp compilers +AC_DEFUN([OPENAXIOM_HOST_COMPILERS],[ +OPENAXIOM_PROG_LISP +OPENAXIOM_LISP_FLAVOR($axiom_lisp) +OPENAXIOM_REJECT_ROTTED_LISP($AXIOM_LISP) +AC_PROG_CC +AC_PROG_CXX +OPENAXIOM_SATISFY_GCL_NEEDS +AC_PROG_CPP +]) + +dnl ------------------------- +dnl -- OPENAXIOM_GCL_HACKS -- +dnl ------------------------- +dnl Some auxiliary programs generated by GCL need to be at the +dnl right place when compiling under mingw32. +AC_DEFUN([OPENAXIOM_GCL_HACKS],[ +## The following is a horrible hack to arrange for GCL to successfully +## rebuild symbol tables with "rsym" on Windows platform. It should +## go away as soon as GCL upstream is fixed. +AC_SUBST(axiom_gcl_rsym_hack) +case $axiom_lisp_flavor,$target in + gcl,*mingw*) + axiom_gcl_rsym_hack='d=`echo "(format nil \"~a\" si::*system-directory*)" | $(AXIOM_LISP) | grep "/gcl.*/" | sed -e "s,\",,g"`; cp $$d/rsym$(EXEEXT) .' + ;; + *) + ## Breath. + axiom_gcl_rsym_hack=':' + ;; +esac +]) + +dnl --------------------------------- +dnl -- OPENAXIOM_SATISFY_GCL_NEEDS -- +dnl --------------------------------- +dnl GCL assumes that the C compiler is from GNU. +AC_DEFUN([OPENAXIOM_SATISFY_GCL_NEEDS],[ +## If we are using GCL as the base runtime system, then we do really need +# a C compiler from GNU. Well, at least for the moment. +case $axiom_lisp_flavor,$GCC in + gcl,yes) + axiom_cflags="-O2 -Wall -D_GNU_SOURCE" + ;; + + gcl,*) + AC_MSG_ERROR([We need a GNU C compiler]) + ;; +esac +AC_SUBST(axiom_cflags) +]) + +dnl -------------------------- +dnl -- OPENAXIOM_LISP_FLAGS -- +dnl -------------------------- +dnl Determine how to invoke the host Lisp systemin batch mode. +dnl We also take the opportunity to determine whether we can use +dnl dynamically loaded modules. +AC_DEFUN([OPENAXIOM_LISP_FLAGS],[ +AC_SUBST(axiom_quiet_flags) +AC_SUBST(axiom_eval_flags) + +## Can we use dynamically linked libraries? +## Tentatively answer `yes' -- this is modern time. +oa_use_dynamic_lib=yes +AC_SUBST(oa_use_dynamic_lib) + +## How are we supposed to tell the Lisp system to eval an expression +## in batch mode? What is the extension of a compiled Lisp file? +case $axiom_lisp_flavor in + gcl) + axiom_quiet_flags='-batch' + axiom_eval_flags='-eval' + oa_use_dynamic_lib=no + ;; + ecl) + axiom_quiet_flags= + axiom_eval_flags='-norc -eval' + oa_use_dynamic_lib=no + ;; + sbcl) + axiom_quiet_flags='--noinform --noprint' + axiom_eval_flags='--eval' + ;; + clisp) + axiom_quiet_flags='--quiet' + axiom_eval_flags='-norc -x' + ;; + clozure) + axiom_quiet_flags='--quiet --no-init' + axiom_eval_flags='--eval' + ;; + *) AC_MSG_ERROR([We do not know how to build OpenAxiom this $axiom_lisp]) ;; +esac +]) + + +dnl ------------------------------- +dnl -- OPENAXIOM_FILE_EXTENSIONS -- +dnl ------------------------------- +dnl Compute various file extensions used by the build system. +AC_DEFUN([OPENAXIOM_FILE_EXTENSIONS],[ +AC_SUBST(axiom_fasl_type) +AC_MSG_CHECKING([compiled Lisp file extension]) +if test x"$axiom_include_gcl" = xyes; then + axiom_fasl_type=o +else + ## We set the IFS to <space> as we don't want automatic + ## replacement of <newline> by <space>. + openaxiom_save_IFS=$IFS + IFS=' ' + axiom_fasl_type=`$1 $axiom_quiet_flags $axiom_eval_flags '(progn (format t "axiom_fasl_type=~a" (pathname-type (compile-file-pathname "foo.lisp"))) (quit))'` + + ## Now pull out the fasl type. ECL has the habit of spitting noise + ## about internal loading. Therefore, we must look only for a line that + ## begins with axiom_fasl_type. + axiom_fasl_type=`echo $axiom_fasl_type | grep '^axiom_fasl_type'` + IFS=$openaxiom_save_IFS + axiom_fasl_type=`echo $axiom_fasl_type | sed -e 's/axiom_fasl_type=//'` + if test -z $axiom_fasl_type; then + AC_MSG_ERROR([Could not determine extension for compiled Lisp files]) + fi +fi +AC_MSG_RESULT([$axiom_fasl_type]) + +## What is the extension of object and executable files on this platform? +AC_OBJEXT +AC_DEFINE_UNQUOTED([OPENAXIOM_EXEEXT], ["$ac_cv_exeext"], + [Extension of executable file.]) +]) + +dnl ------------------------------ +dnl -- OPENAXIOM_FFI_TYPE_TABLE -- +dnl ------------------------------ +dnl Build FFI type translation table used by +dnl the Boot translator and the Spad compiler +AC_DEFUN([OPENAXIOM_FFI_TYPE_TABLE],[ +AC_SUBST(void_type) +AC_SUBST(char_type) +AC_SUBST(int_type) +AC_SUBST(float_type) +AC_SUBST(double_type) +AC_SUBST(string_type) + +case $axiom_lisp_flavor in + gcl) + void_type='void' + char_type='char' + int_type='int' + float_type='float' + double_type='double' + string_type='string' + ;; + sbcl) + void_type='void' + char_type='char' + int_type='int' + float_type='float' + double_type='double' + string_type='c-string' + ;; + clisp) + void_type='nil' + char_type='character' + int_type='int' + float_type='single-float' + double_type='double-float' + string_type='c-string' + ;; + ecl) + void_type=':void' + char_type=':char' + int_type=':int' + float_type=':float' + double_type=':double' + string_type=':cstring' + ;; + clozure) + void_type=':void' + # FIXME: this is not really what we want, but good enough for now. + char_type=':unsigned-byte' + int_type=':signed-fullword' + float_type=':single-float' + double_type=':double-float' + # Clozure CL wants you to deal with your own mess + string_type=':address' + ;; + *) + AC_MSG_ERROR([We do not know how to translate native types for this Lisp]) + ;; +esac +]) + + +dnl --------------------------------------- +dnl -- OPENAXIOM_HOST_LISP_CPU_PRECISION -- +dnl --------------------------------------- +dnl Determine the register precision as seen by the host Lisp system, and +dnl set the global variable openaxiom_host_lisp_precision. +AC_DEFUN([OPENAXIOM_HOST_LISP_CPU_PRECISION], [ +if test x"$axiom_include_gcl" != xyes; then + AC_MSG_CHECKING([CPU precision as seen by $AXIOM_LISP]) + case `echo '*features*' | $AXIOM_LISP` in + *X86-64*|*X86_64*|*WORD-SIZE=64*|*64-BIT-HOST*) + # PORTME: the pattern above covers only the supported free Lisps, i.e. + # GCL, SBCL, CLisp, ECL and Clozure CL. + openaxiom_host_lisp_precision=64 + ;; + *) + # assume everything else is 32-bit + # FIXME: this is bold assumption. + openaxiom_host_lisp_precision=32 + ;; + esac + AC_MSG_RESULT([$openaxiom_host_lisp_precision]) +fi +]) + + +dnl ------------------------------------ +dnl -- OPENAXIOM_HOST_DATA_PROPERTIES -- +dnl ------------------------------------ +AC_DEFUN([OPENAXIOM_HOST_DATA_PROPERTIES],[ +OPENAXIOM_HOST_LISP_CPU_PRECISION +## Byte order of the host. +AC_C_BIGENDIAN +AC_CHECK_HEADERS([stdint.h inttypes.h]) +OPENAXIOM_STANDARD_INTEGER_TYPES +AC_CHECK_SIZEOF([void*]) +if test x"$axiom_include_gcl" = xyes; then + openaxiom_host_lisp_precision=`expr "$ac_cv_sizeof_voidp * 8"` +fi + +## Now that we have full knowledge of the host Lisp to use, tell +## the rest of the runtime about the host natural integer precision. +AC_DEFINE_UNQUOTED([OPENAXIOM_HOST_LISP_PRECISION], + [$openaxiom_host_lisp_precision], + [The width of the host Lisp and CPU registers.]) + +## Augment compiler flags with ABI directives as appropriate. +case $GCC in + yes) + CFLAGS="$CFLAGS -m$openaxiom_host_lisp_precision" + CXXFLAGS="$CXXFLAGS -m$openaxiom_host_lisp_precision" + ;; + no) + # cross fingers and pray. + ;; +esac +]) diff --git a/config/openaxiom-c-macros.h.in b/config/openaxiom-c-macros.h.in index 12124224..5b5e21e5 100644 --- a/config/openaxiom-c-macros.h.in +++ b/config/openaxiom-c-macros.h.in @@ -121,6 +121,9 @@ /* Extension of executable file. */ #undef OPENAXIOM_EXEEXT +/* The width of the host Lisp and CPU registers. */ +#undef OPENAXIOM_HOST_LISP_PRECISION + /* Whether to use the session manager as driver. */ #undef OPENAXIOM_USE_SMAN @@ -139,6 +142,9 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION +/* The size of `void*', as computed by sizeof. */ +#undef SIZEOF_VOIDP + /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS |