New interface for building standalone programs and libraries.

This commit is contained in:
jjgarcia 2001-10-17 16:40:22 +00:00
parent 1a53fd88af
commit 7957040185
21 changed files with 641 additions and 330 deletions

View file

@ -806,6 +806,8 @@ ECLS 0.5
- PROBE-FILE would not translate logical pathnames before checking for
file existence.
- In unsafe mode, inlining AREF lead to bogus code.
* System design and portability:
- Remove function_entry_table.
@ -831,12 +833,6 @@ ECLS 0.5
These definitions are lost once the function is compiled, hence
the second error message.
- C::BUILD-ECLS rewritten to accept three keyword parameters:
:COMPONENTS, the object files, libraries and flags to be passed to
the compiler; :PROLOGUE-CODE, a string with C code to be executed
before initialization; and :EPILOGUE-CODE, a string with C code to
be executed after initializing Lisp.
- Reader macro '#,' has been dropped. LOAD-TIME-VALUE added to both
the interpreter and the compiler.
@ -846,6 +842,12 @@ ECLS 0.5
are stored in memory. It is possible to dump documentation strings
to a help file.
- New interface for building standalone programs and libraries, based
on the functions C:BUILD-ECLS, C:BUILD-STATIC-LIBRARY and
C:BUILD-SHARED-LIBRARY, all of which accept similar parameters,
:PROLOGUE-CODE, :EPILOGE-CODE, :LISP-FILES, and :LD-FLAGS. Exhaustive
documentation with examples included in the Developer's Guide.
TODO:
=====

5
src/aclocal.m4 vendored
View file

@ -110,7 +110,12 @@ eval `${CPP} -D${host} ${tempcname} \
rm ${tempcname}
]
AC_MSG_CHECKING(for ld flags when building shared libraries)
if test "${shared}" = "yes" -a "${SHARED_LDFLAGS}" ; then
AC_MSG_RESULT([${SHARED_LDFLAGS}])
else
shared="no";
AC_MSG_RESULT(cannot build)
fi
AC_MSG_CHECKING(for required libraries)
AC_MSG_RESULT([${CLIBS}])
AC_MSG_CHECKING(for architecture)

View file

@ -364,7 +364,7 @@ const struct function_info all_functions[] = {
/* load.d */
{"LOAD", clLload, cl},
#ifdef USE_DLOPEN
#ifdef ENABLE_DLOPEN
{"LOAD-BINARY", siLload_binary, si},
#endif
{"LOAD-SOURCE", siLload_source, si},

View file

@ -33,7 +33,7 @@ cl_stack_set_size(cl_index new_size)
cl_index top = cl_stack_top - cl_stack;
cl_object *new_stack;
printf("*+*+*+\n");
/*printf("*+*+*+\n");*/
if (top > new_size)
FEerror("Internal error: cannot shrink stack that much.",0);

View file

@ -32,7 +32,7 @@ cl_object @'si::*source-pathname*';
/******************************* ------- ******************************/
#ifdef USE_DLOPEN
#ifdef ENABLE_DLOPEN
@(defun si::load_binary (filename verbose print)
cl_object block;
cl_object basename;
@ -79,7 +79,7 @@ GO_ON:
read_VV(block, block->cblock.entry);
@(return Cnil)
@)
#endif /* USE_DLOPEN */
#endif /* ENABLE_DLOPEN */
@(defun si::load_source (filename verbose print)
cl_object x, strm;
@ -215,18 +215,18 @@ init_load(void)
#endif PDE
load_source = make_si_ordinary("LOAD-SOURCE");
#ifdef USE_DLOPEN
#ifdef ENABLE_DLOPEN
load_binary = make_si_ordinary("LOAD-BINARY");
#endif
SYM_VAL(@'si::*load-hooks*') = list(4,
#ifdef USE_DLOPEN
#ifdef ENABLE_DLOPEN
CONS(make_simple_string("so"), load_binary),
#endif
CONS(make_simple_string("lsp"), load_source),
CONS(make_simple_string("lisp"), load_source),
CONS(Cnil, load_source));
#ifdef USE_DLOPEN
#ifdef ENABLE_DLOPEN
if (dlopen(NULL, RTLD_NOW|RTLD_GLOBAL) == NULL)
printf(";;; Error dlopening self file\n;;; Error: %s\n", dlerror());
#endif

View file

@ -180,7 +180,7 @@ init_main(void)
ADD_FEATURE("ANSI-CL");
#ifdef USE_DLOPEN
#ifdef ENABLE_DLOPEN
ADD_FEATURE("DLOPEN");
#endif

View file

@ -2294,11 +2294,9 @@ read_VV(cl_object block, void *entry)
(*entry_point)(block);
len = block->cblock.data_size;
if (len == 0)
return;
#ifdef GBC_BOEHM
VV = block->cblock.data = alloc(len * sizeof(cl_object));
VV = block->cblock.data = len? alloc(len * sizeof(cl_object)) : NULL;
#else
VV = block->cblock.data;
#endif
@ -2315,11 +2313,13 @@ read_VV(cl_object block, void *entry)
setup_standard_READ();
in = make_string_input_stream(make_simple_string(block->cblock.data_text),
0, block->cblock.data_text_size);
in = OBJNULL;
if (frs_push(FRS_PROTECT, Cnil))
e = TRUE;
else {
if (len == 0) goto NO_DATA;
in=make_string_input_stream(make_simple_string(block->cblock.data_text),
0, block->cblock.data_text_size);
read_VV_block = block;
for (i = 0 ; i < len; i++) {
sharp_eq_context = Cnil;
@ -2335,16 +2335,18 @@ read_VV(cl_object block, void *entry)
}
if (i < len)
FEerror("Not enough data while loading binary file",0);
SYM_VAL(@'*package*') = old_package;
#ifdef PDE
bds_bind(@'si::*source-pathname*', VV[block->cblock.source_pathname]);
#endif
NO_DATA:
SYM_VAL(@'*package*') = old_package;
(*entry_point)(MAKE_FIXNUM(0));
e = FALSE;
}
frs_pop();
close_stream(in, 0);
if (in != OBJNULL)
close_stream(in, 0);
read_VV_block = OBJNULL;
bds_unwind(old_bds_top);

View file

@ -37,7 +37,10 @@
*cc*
*cc-optimize*
build-ecls
make-library
build-static-library
build-shared-library
shared-library-pathname
static-library-pathname
*suppress-compiler-warnings*
*suppress-compiler-notes*))

View file

@ -59,45 +59,25 @@ coprocessor).")
string result))
result))
(defun library-pathname (name shared &optional(directory "./"))
(if shared
(make-pathname :name name :type "so" :defaults directory)
(make-pathname :name (concatenate 'string "lib" name)
:type "a" :defaults directory)))
(defun static-library-pathname (output-file)
(let* ((real-name (format nil "lib~A.a" (pathname-name output-file))))
(merge-pathnames real-name output-file)))
(defun compile-file-pathname (name &key output-file)
(merge-pathnames (or output-file name) #+dlopen #P".so" #-dlopen #P".o"))
(defun shared-library-pathname (output-file)
#-dlopen
(error "Dynamically loadable libraries not supported in this system.")
#+dlopen
(let* ((real-name (format nil "~A.so" (pathname-name output-file))))
(merge-pathnames real-name output-file)))
(defun make-library (lib objects &key (output-dir "./") (shared nil))
(let* ((lib (string-upcase lib))
(init-name (mapcar #'(lambda (x) (string-upcase (pathname-name x)))
objects))
(liba (library-pathname (string-downcase lib) shared output-dir))
(libc (make-pathname :name lib :type "c" :defaults output-dir))
(libo (make-pathname :name lib :type "o" :defaults output-dir)))
(with-open-file (libc-file libc :direction :output)
(format libc-file
"
void
init_~A(cl_object)
{
~{ extern void init_~A(cl_object);~%~}
~{ read_VV((void*)0,init_~A);~%~}
}
"
lib init-name init-name)
(compiler-cc libc libo)
#-dlopen
(safe-system (format nil "ar cr ~A ~A ~{~A ~}"
(namestring liba) (namestring libo) objects))
#+dlopen
(if shared
(apply #'shared-cc (namestring liba) (namestring libo) objects)
(safe-system (format nil "ar cr ~A ~A ~{~A ~}"
(namestring liba) (namestring libo) objects)))
(delete-file (namestring libc))
(delete-file (namestring libo)))
liba))
(defun compile-file-pathname (name &key output-file system-p)
(let ((extension ".o"))
(unless system-p
#+dlopen
(setq extension ".so")
#-dlopen
(error "This platform only supports compiling files with :SYSTEM-P T"))
(merge-pathnames extension (or output-file name))))
(defun linker-cc (o-pathname &rest options)
(safe-system
@ -120,38 +100,95 @@ init_~A(cl_object)
options
"")))
(defun build-ecls (name &key components (prologue-code "")
(epilogue-code "
funcall(1,_intern(\"TOP-LEVEL\",system_package));
return;"))
(let ((c-name (make-pathname :name name :type "c"))
(o-name (make-pathname :name name :type "o"))
(ld-flags (list "-lecls" #+CLOS "-lclos" "-llsp")))
(with-open-file (c-file c-name :direction :output)
(format c-file "
#include \"ecls.h\"
extern cl_object lisp_package;
(defconstant +lisp-program-main+ "
#include <ecls.h>
int
main(int argc, char **argv)
{
~{ extern void init_~A(cl_object);~%~}
~A
cl_boot(argc, argv);
siLpackage_lock(2, lisp_package, Ct);~%" prologue-code)
(dolist (item (reverse components))
(cond ((symbolp item)
(format c-file " init_~A();~%" (string-upcase item))
(push (format nil "-l~A" (string-downcase item)) ld-flags))
((stringp item)
(push item ld-flags))
(t
(error "compiler::build-ecls wrong argument ~A" item))))
(format c-file "~A;~%}~%" epilogue-code))
(compiler-cc c-name o-name)
(apply #'linker-cc name (namestring o-name) ld-flags)
(delete-file c-name)
))
~{ read_VV((void*)0,init_~A);~%~}
~A
}")
(defconstant +lisp-library-main+ "
#include <ecls.h>
int
init_~A(cl_object foo)
{
~{ extern void init_~A();~%~}
~A
~{ read_VV((void*)0,init_~A);~%~}
~A
}")
(defun builder (target output-name &key lisp-files ld-flags (prologue-code "")
(epilogue-code (if (eq target :program) "
funcall(1,_intern(\"TOP-LEVEL\",system_package));
return;" "")))
(let* (init-name c-name o-name)
(when (eq target :program)
(setq ld-flags (append ld-flags '("-lecls" "-lclos" "-llsp"))))
(dolist (item (reverse lisp-files))
(cond ((symbolp item)
(push (format nil "-l~A" (string-downcase item)) ld-flags)
(push (string-upcase item) init-name))
(t
(push (namestring (merge-pathnames ".o" item)) ld-flags)
(setq item (pathname-name item))
(push (string-upcase item) init-name))))
(setq c-name (namestring (merge-pathnames ".c" output-name))
o-name (namestring (merge-pathnames ".o" output-name)))
(ecase target
(:program
(setq output-name (namestring output-name))
(with-open-file (c-file c-name :direction :output)
(format c-file +lisp-program-main+ init-name prologue-code init-name
epilogue-code))
(compiler-cc c-name o-name)
(apply #'linker-cc output-name (namestring o-name) ld-flags))
(:static-library
(when (symbolp output-name)
(setq output-name (static-library-pathname output-name)))
(let ((library-name (string-upcase (pathname-name output-name))))
(unless (equalp (subseq library-name 0 3) "LIB")
(error "Filename ~A is not a valid library name."
output-name))
(with-open-file (c-file c-name :direction :output)
(format c-file +lisp-library-main+
;; Remove the leading "lib"
(subseq library-name 3)
init-name prologue-code init-name epilogue-code)))
(compiler-cc c-name o-name)
(safe-system (format nil "ar cr ~A ~A ~{~A ~}"
output-name o-name ld-flags)))
#+dlopen
(:shared-library
(when (or (symbolp output-name) (not (pathname-type output-name)))
(setq output-name (shared-library-pathname output-name)))
(with-open-file (c-file c-name :direction :output)
(format c-file +lisp-library-main+
"CODE" init-name prologue-code init-name epilogue-code))
(compiler-cc c-name o-name)
(apply #'shared-cc output-name o-name ld-flags)))
;(delete-file c-name)
(delete-file o-name)
output-name))
(defun build-ecls (&rest args)
(apply #'builder :program args))
(defun build-static-library (&rest args)
(apply #'builder :static-library args))
(defun build-shared-library (&rest args)
#-dlopen
(error "Dynamically loadable libraries not supported in this system.")
#+dlopen
(apply #'builder :shared-library args))
(defun compile-file (input-pathname
&key (output-file 'T)

View file

@ -111,10 +111,16 @@
:inline-always ((t fixnum) t nil t "aref1(#0,#1)")
:inline-unsafe ((t t) t nil t "aref1(#0,fix(#1))")
:inline-unsafe ((t fixnum) t nil t "aref1(#0,#1)")
:inline-unsafe (((array t) t) t nil nil "(#0)->vector.self.t[fix(#1)]")
:inline-unsafe (((array bit) t) fixnum nil nil "aref_bv(#0,fix(#1))")
:inline-unsafe (((array t) fixnum) t nil nil "(#0)->vector.self.t[#1]")
:inline-unsafe (((array bit) fixnum) fixnum nil nil "aref_bv(#0,#1)")
:inline-unsafe (((array base-char) fixnum) t nil nil
"CODE_CHAR((#0)->string.self[#1])")
:inline-unsafe (((array long-float) fixnum) t nil nil
"make_longfloat((#0)->array.self.lf[#1])")
:inline-unsafe (((array short-float) fixnum) t nil nil
"make_shortfloat((#0)->array.self.sf[#1])")
:inline-unsafe (((array fixnum) fixnum) t nil nil
"MAKE_FIXNUM((#0)->array.self.fix[#1])")
:inline-unsafe (((array base-char) fixnum) fixnum nil nil
"(#0)->string.self[#1]")
:inline-unsafe (((array base-char) fixnum) character nil nil
@ -124,7 +130,8 @@
:inline-unsafe (((array short-float) fixnum) short-float nil nil
"(#0)->array.self.sf[#1]")
:inline-unsafe (((array fixnum) fixnum) fixnum nil nil
"(#0)->array.self.fix[#1]"))
"(#0)->array.self.fix[#1]")
)
(SI::ASET (T ARRAY *) NIL NIL NIL
:inline-unsafe ((t t t t) t t nil
"@0;aset(#1,fix(#2)*(#1)->array.dims[1]+fix(#3),#0)")

View file

@ -38,6 +38,6 @@
;(sbt::operate-on-system clos :load)
)
(compiler::build-ecls "ecls" :components '(#+(and (not dlopen) WANTS-CMP) cmp))
(compiler::build-ecls "ecls" :lisp-files '(#+(and (not dlopen) WANTS-CMP) cmp))
(quit)

253
src/configure vendored
View file

@ -21,6 +21,8 @@ ac_help="$ac_help
--enable-local-gmp Use already installed GMP library."
ac_help="$ac_help
--with-gmp=args Configure supplied GMP library with arguments."
ac_help="$ac_help
--disable-shared Enable building dynamically loadable extensions."
ac_help="$ac_help
--with-x use the X Window System"
@ -574,7 +576,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
fi
echo $ac_n "checking host system type""... $ac_c" 1>&6
echo "configure:578: checking host system type" >&5
echo "configure:580: checking host system type" >&5
host_alias=$host
case "$host_alias" in
@ -636,6 +638,12 @@ else
gmp_flags=""
fi
# Check whether --enable-shared or --disable-shared was given.
if test "${enable_shared+set}" = set; then
enableval="$enable_shared"
shared="$enable_shared"
fi
### ----------------------------------------------------------------------
### Checks for programs
@ -643,7 +651,7 @@ fi
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:647: checking for $ac_word" >&5
echo "configure:655: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -673,7 +681,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:677: checking for $ac_word" >&5
echo "configure:685: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -724,7 +732,7 @@ fi
# Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:728: checking for $ac_word" >&5
echo "configure:736: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -756,7 +764,7 @@ fi
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:760: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
echo "configure:768: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@ -767,12 +775,12 @@ cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext << EOF
#line 771 "configure"
#line 779 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
if { (eval echo configure:776: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:784: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
@ -798,12 +806,12 @@ if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:802: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "configure:810: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:807: checking whether we are using GNU C" >&5
echo "configure:815: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -812,7 +820,7 @@ else
yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:816: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:824: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
@ -831,7 +839,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:835: checking whether ${CC-cc} accepts -g" >&5
echo "configure:843: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -866,7 +874,7 @@ if test "$GCC" != "yes"; then
{ echo "configure: error: Cannot build ECLS without GCC" 1>&2; exit 1; }
fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:870: checking how to run the C preprocessor" >&5
echo "configure:878: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
@ -881,13 +889,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
#line 885 "configure"
#line 893 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:891: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:899: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@ -898,13 +906,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
#line 902 "configure"
#line 910 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:908: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:916: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@ -915,13 +923,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
#line 919 "configure"
#line 927 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:925: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:933: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@ -948,7 +956,7 @@ echo "$ac_t""$CPP" 1>&6
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:952: checking for $ac_word" >&5
echo "configure:960: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -987,7 +995,7 @@ fi
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
echo "configure:991: checking for a BSD compatible install" >&5
echo "configure:999: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -1040,7 +1048,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
# sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
echo "configure:1044: checking whether ln -s works" >&5
echo "configure:1052: checking whether ln -s works" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1061,12 +1069,12 @@ else
fi
# sets variable LN_S
echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
echo "configure:1065: checking for Cygwin environment" >&5
echo "configure:1073: checking for Cygwin environment" >&5
if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1070 "configure"
#line 1078 "configure"
#include "confdefs.h"
int main() {
@ -1077,7 +1085,7 @@ int main() {
return __CYGWIN__;
; return 0; }
EOF
if { (eval echo configure:1081: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:1089: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_cygwin=yes
else
@ -1094,19 +1102,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6
CYGWIN=
test "$ac_cv_cygwin" = yes && CYGWIN=yes
echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
echo "configure:1098: checking for mingw32 environment" >&5
echo "configure:1106: checking for mingw32 environment" >&5
if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1103 "configure"
#line 1111 "configure"
#include "confdefs.h"
int main() {
return __MINGW32__;
; return 0; }
EOF
if { (eval echo configure:1110: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:1118: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_mingw32=yes
else
@ -1125,7 +1133,7 @@ test "$ac_cv_mingw32" = yes && MINGW32=yes
echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
echo "configure:1129: checking for executable suffix" >&5
echo "configure:1137: checking for executable suffix" >&5
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1135,7 +1143,7 @@ else
rm -f conftest*
echo 'int main () { return 0; }' > conftest.$ac_ext
ac_cv_exeext=
if { (eval echo configure:1139: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
if { (eval echo configure:1147: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
for file in conftest.*; do
case $file in
*.c | *.C | *.o | *.obj) ;;
@ -1156,7 +1164,7 @@ echo "$ac_t""${ac_cv_exeext}" 1>&6
ac_exeext=$EXEEXT
echo $ac_n "checking for getpwnam in -lsun""... $ac_c" 1>&6
echo "configure:1160: checking for getpwnam in -lsun" >&5
echo "configure:1168: checking for getpwnam in -lsun" >&5
ac_lib_var=`echo sun'_'getpwnam | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -1164,7 +1172,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lsun $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1168 "configure"
#line 1176 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -1175,7 +1183,7 @@ int main() {
getpwnam()
; return 0; }
EOF
if { (eval echo configure:1179: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:1187: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -1207,17 +1215,17 @@ for ac_hdr in sys/resource.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:1211: checking for $ac_hdr" >&5
echo "configure:1219: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1216 "configure"
#line 1224 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1221: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:1229: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@ -1247,17 +1255,17 @@ for ac_hdr in sys/utsname.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:1251: checking for $ac_hdr" >&5
echo "configure:1259: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1256 "configure"
#line 1264 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1261: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:1269: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@ -1287,17 +1295,17 @@ for ac_hdr in float.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:1291: checking for $ac_hdr" >&5
echo "configure:1299: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1296 "configure"
#line 1304 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1301: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:1309: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@ -1326,12 +1334,12 @@ done
for ac_func in nanosleep
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:1330: checking for $ac_func" >&5
echo "configure:1338: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 1335 "configure"
#line 1343 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@ -1354,7 +1362,7 @@ $ac_func();
; return 0; }
EOF
if { (eval echo configure:1358: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:1366: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@ -1379,7 +1387,7 @@ fi
done
echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
echo "configure:1383: checking for POSIXized ISC" >&5
echo "configure:1391: checking for POSIXized ISC" >&5
if test -d /etc/conf/kconfig.d &&
grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
then
@ -1498,19 +1506,24 @@ eval `${CPP} -D${host} ${tempcname} \
rm ${tempcname}
echo $ac_n "checking for ld flags when building shared libraries""... $ac_c" 1>&6
echo "configure:1502: checking for ld flags when building shared libraries" >&5
echo "configure:1510: checking for ld flags when building shared libraries" >&5
if test "${shared}" = "yes" -a "${SHARED_LDFLAGS}" ; then
echo "$ac_t""${SHARED_LDFLAGS}" 1>&6
else
shared="no";
echo "$ac_t""cannot build" 1>&6
fi
echo $ac_n "checking for required libraries""... $ac_c" 1>&6
echo "configure:1505: checking for required libraries" >&5
echo "configure:1518: checking for required libraries" >&5
echo "$ac_t""${CLIBS}" 1>&6
echo $ac_n "checking for architecture""... $ac_c" 1>&6
echo "configure:1508: checking for architecture" >&5
echo "configure:1521: checking for architecture" >&5
echo "$ac_t""${architecture}" 1>&6
echo $ac_n "checking for software type""... $ac_c" 1>&6
echo "configure:1511: checking for software type" >&5
echo "configure:1524: checking for software type" >&5
echo "$ac_t""${software_type}" 1>&6
echo $ac_n "checking for software version""... $ac_c" 1>&6
echo "configure:1514: checking for software version" >&5
echo "configure:1527: checking for software version" >&5
echo "$ac_t""${software_version}" 1>&6
@ -1538,6 +1551,12 @@ EOF
else
EXTRA_OBJS="${EXTRA_OBJS} alloc.o gbc.o"
fi
if test ${shared} = "yes"; then
cat >> confdefs.h <<\EOF
#define ENABLE_DLOPEN 1
EOF
fi
if test ${gmp} ; then
cat >> confdefs.h <<\EOF
@ -1554,7 +1573,11 @@ if test ${runtime} ; then
EOF
else
LSP_LIBRARIES="${LSP_LIBRARIES} libcmp.a"
if test ${shared} = "yes" ; then
LSP_LIBRARIES="${LSP_LIBRARIES} cmp.so"
else
LSP_LIBRARIES="${LSP_LIBRARIES} libcmp.a"
fi
fi
if test ${tk} ; then
TKLIBS="-ltk -ltcl -lXpm @XLIBS@"
@ -1595,13 +1618,13 @@ fi
echo $ac_n "checking whether stack growns downwards""... $ac_c" 1>&6
echo "configure:1599: checking whether stack growns downwards" >&5
echo "configure:1622: checking whether stack growns downwards" >&5
if test "$cross_compiling" = yes; then
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
else
cat > conftest.$ac_ext <<EOF
#line 1605 "configure"
#line 1628 "configure"
#include "confdefs.h"
char *f2() {
@ -1622,7 +1645,7 @@ int main() {
}
EOF
if { (eval echo configure:1626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
if { (eval echo configure:1649: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
echo "$ac_t""yes" 1>&6
cat >> confdefs.h <<\EOF
@ -1640,12 +1663,12 @@ fi
echo $ac_n "checking if arguments can be accessed through vector""... $ac_c" 1>&6
echo "configure:1644: checking if arguments can be accessed through vector" >&5
echo "configure:1667: checking if arguments can be accessed through vector" >&5
if test "$cross_compiling" = yes; then
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
else
cat > conftest.$ac_ext <<EOF
#line 1649 "configure"
#line 1672 "configure"
#include "confdefs.h"
#include <stdarg.h>
@ -1670,7 +1693,7 @@ int main() {
}
EOF
if { (eval echo configure:1674: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
if { (eval echo configure:1697: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
echo "$ac_t""yes" 1>&6
else
@ -1689,12 +1712,12 @@ fi
echo $ac_n "checking appropiate type for fixnums""... $ac_c" 1>&6
echo "configure:1693: checking appropiate type for fixnums" >&5
echo "configure:1716: checking appropiate type for fixnums" >&5
if test "$cross_compiling" = yes; then
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
else
cat > conftest.$ac_ext <<EOF
#line 1698 "configure"
#line 1721 "configure"
#include "confdefs.h"
#include <stdio.h>
int main() {
@ -1709,7 +1732,7 @@ int main() {
exit(0);
}
EOF
if { (eval echo configure:1713: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
if { (eval echo configure:1736: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
cl_fixnum=`cat conftestval`
echo "$ac_t""${cl_fixnum}" 1>&6
@ -1727,12 +1750,12 @@ rm -fr conftest*
fi
echo $ac_n "checking most positive fixnum""... $ac_c" 1>&6
echo "configure:1731: checking most positive fixnum" >&5
echo "configure:1754: checking most positive fixnum" >&5
if test "$cross_compiling" = yes; then
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
else
cat > conftest.$ac_ext <<EOF
#line 1736 "configure"
#line 1759 "configure"
#include "confdefs.h"
#include <stdio.h>
int main() {
@ -1750,7 +1773,7 @@ int main() {
exit(0);
}
EOF
if { (eval echo configure:1754: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
if { (eval echo configure:1777: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
cl_fixnum_limit=`cat conftestval`
echo "$ac_t""${cl_fixnum_limit}" 1>&6
@ -1770,14 +1793,14 @@ fi
echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
echo "configure:1774: checking whether byte ordering is bigendian" >&5
echo "configure:1797: checking whether byte ordering is bigendian" >&5
if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_cv_c_bigendian=unknown
# See if sys/param.h defines the BYTE_ORDER macro.
cat > conftest.$ac_ext <<EOF
#line 1781 "configure"
#line 1804 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/param.h>
@ -1788,11 +1811,11 @@ int main() {
#endif
; return 0; }
EOF
if { (eval echo configure:1792: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:1815: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
# It does; now see whether it defined to BIG_ENDIAN or not.
cat > conftest.$ac_ext <<EOF
#line 1796 "configure"
#line 1819 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/param.h>
@ -1803,7 +1826,7 @@ int main() {
#endif
; return 0; }
EOF
if { (eval echo configure:1807: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:1830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_bigendian=yes
else
@ -1823,7 +1846,7 @@ if test "$cross_compiling" = yes; then
{ echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
else
cat > conftest.$ac_ext <<EOF
#line 1827 "configure"
#line 1850 "configure"
#include "confdefs.h"
main () {
/* Are we little or big endian? From Harbison&Steele. */
@ -1836,7 +1859,7 @@ main () {
exit (u.c[sizeof (long) - 1] == 1);
}
EOF
if { (eval echo configure:1840: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
if { (eval echo configure:1863: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_c_bigendian=no
else
@ -1865,7 +1888,7 @@ fi
# Uses ac_ vars as temps to allow command line to override cache and checks.
# --without-x overrides everything else, but does not touch the cache.
echo $ac_n "checking for X""... $ac_c" 1>&6
echo "configure:1869: checking for X" >&5
echo "configure:1892: checking for X" >&5
# Check whether --with-x or --without-x was given.
if test "${with_x+set}" = set; then
@ -1927,12 +1950,12 @@ if test "$ac_x_includes" = NO; then
# First, try using that file with no special directory specified.
cat > conftest.$ac_ext <<EOF
#line 1931 "configure"
#line 1954 "configure"
#include "confdefs.h"
#include <$x_direct_test_include>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1936: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:1959: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@ -2001,14 +2024,14 @@ if test "$ac_x_libraries" = NO; then
ac_save_LIBS="$LIBS"
LIBS="-l$x_direct_test_library $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2005 "configure"
#line 2028 "configure"
#include "confdefs.h"
int main() {
${x_direct_test_function}()
; return 0; }
EOF
if { (eval echo configure:2012: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2035: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
LIBS="$ac_save_LIBS"
# We can link X programs with no special library path.
@ -2114,17 +2137,17 @@ else
case "`(uname -sr) 2>/dev/null`" in
"SunOS 5"*)
echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
echo "configure:2118: checking whether -R must be followed by a space" >&5
echo "configure:2141: checking whether -R must be followed by a space" >&5
ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
cat > conftest.$ac_ext <<EOF
#line 2121 "configure"
#line 2144 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
if { (eval echo configure:2128: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_R_nospace=yes
else
@ -2140,14 +2163,14 @@ rm -f conftest*
else
LIBS="$ac_xsave_LIBS -R $x_libraries"
cat > conftest.$ac_ext <<EOF
#line 2144 "configure"
#line 2167 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
if { (eval echo configure:2151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2174: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_R_space=yes
else
@ -2179,7 +2202,7 @@ rm -f conftest*
# libraries were built with DECnet support. And karl@cs.umb.edu says
# the Alpha needs dnet_stub (dnet does not exist).
echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
echo "configure:2183: checking for dnet_ntoa in -ldnet" >&5
echo "configure:2206: checking for dnet_ntoa in -ldnet" >&5
ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -2187,7 +2210,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-ldnet $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2191 "configure"
#line 2214 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2198,7 +2221,7 @@ int main() {
dnet_ntoa()
; return 0; }
EOF
if { (eval echo configure:2202: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2225: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2220,7 +2243,7 @@ fi
if test $ac_cv_lib_dnet_dnet_ntoa = no; then
echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
echo "configure:2224: checking for dnet_ntoa in -ldnet_stub" >&5
echo "configure:2247: checking for dnet_ntoa in -ldnet_stub" >&5
ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -2228,7 +2251,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-ldnet_stub $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2232 "configure"
#line 2255 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2239,7 +2262,7 @@ int main() {
dnet_ntoa()
; return 0; }
EOF
if { (eval echo configure:2243: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2266: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2268,12 +2291,12 @@ fi
# The nsl library prevents programs from opening the X display
# on Irix 5.2, according to dickey@clark.net.
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
echo "configure:2272: checking for gethostbyname" >&5
echo "configure:2295: checking for gethostbyname" >&5
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2277 "configure"
#line 2300 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char gethostbyname(); below. */
@ -2296,7 +2319,7 @@ gethostbyname();
; return 0; }
EOF
if { (eval echo configure:2300: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2323: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_gethostbyname=yes"
else
@ -2317,7 +2340,7 @@ fi
if test $ac_cv_func_gethostbyname = no; then
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
echo "configure:2321: checking for gethostbyname in -lnsl" >&5
echo "configure:2344: checking for gethostbyname in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -2325,7 +2348,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lnsl $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2329 "configure"
#line 2352 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2336,7 +2359,7 @@ int main() {
gethostbyname()
; return 0; }
EOF
if { (eval echo configure:2340: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2363: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2366,12 +2389,12 @@ fi
# -lsocket must be given before -lnsl if both are needed.
# We assume that if connect needs -lnsl, so does gethostbyname.
echo $ac_n "checking for connect""... $ac_c" 1>&6
echo "configure:2370: checking for connect" >&5
echo "configure:2393: checking for connect" >&5
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2375 "configure"
#line 2398 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char connect(); below. */
@ -2394,7 +2417,7 @@ connect();
; return 0; }
EOF
if { (eval echo configure:2398: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2421: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_connect=yes"
else
@ -2415,7 +2438,7 @@ fi
if test $ac_cv_func_connect = no; then
echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
echo "configure:2419: checking for connect in -lsocket" >&5
echo "configure:2442: checking for connect in -lsocket" >&5
ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -2423,7 +2446,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2427 "configure"
#line 2450 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2434,7 +2457,7 @@ int main() {
connect()
; return 0; }
EOF
if { (eval echo configure:2438: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2461: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2458,12 +2481,12 @@ fi
# gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
echo $ac_n "checking for remove""... $ac_c" 1>&6
echo "configure:2462: checking for remove" >&5
echo "configure:2485: checking for remove" >&5
if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2467 "configure"
#line 2490 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char remove(); below. */
@ -2486,7 +2509,7 @@ remove();
; return 0; }
EOF
if { (eval echo configure:2490: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2513: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_remove=yes"
else
@ -2507,7 +2530,7 @@ fi
if test $ac_cv_func_remove = no; then
echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
echo "configure:2511: checking for remove in -lposix" >&5
echo "configure:2534: checking for remove in -lposix" >&5
ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -2515,7 +2538,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lposix $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2519 "configure"
#line 2542 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2526,7 +2549,7 @@ int main() {
remove()
; return 0; }
EOF
if { (eval echo configure:2530: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2550,12 +2573,12 @@ fi
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
echo $ac_n "checking for shmat""... $ac_c" 1>&6
echo "configure:2554: checking for shmat" >&5
echo "configure:2577: checking for shmat" >&5
if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2559 "configure"
#line 2582 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char shmat(); below. */
@ -2578,7 +2601,7 @@ shmat();
; return 0; }
EOF
if { (eval echo configure:2582: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2605: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_shmat=yes"
else
@ -2599,7 +2622,7 @@ fi
if test $ac_cv_func_shmat = no; then
echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
echo "configure:2603: checking for shmat in -lipc" >&5
echo "configure:2626: checking for shmat in -lipc" >&5
ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -2607,7 +2630,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lipc $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2611 "configure"
#line 2634 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2618,7 +2641,7 @@ int main() {
shmat()
; return 0; }
EOF
if { (eval echo configure:2622: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2645: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2651,7 +2674,7 @@ fi
# libraries we check for below, so use a different variable.
# --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
echo "configure:2655: checking for IceConnectionNumber in -lICE" >&5
echo "configure:2678: checking for IceConnectionNumber in -lICE" >&5
ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -2659,7 +2682,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lICE $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
#line 2663 "configure"
#line 2686 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -2670,7 +2693,7 @@ int main() {
IceConnectionNumber()
; return 0; }
EOF
if { (eval echo configure:2674: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
if { (eval echo configure:2697: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -2714,7 +2737,7 @@ fi
XLIBS="$XLIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
echo $ac_n "checking checking for gmp...""... $ac_c" 1>&6
echo "configure:2718: checking checking for gmp..." >&5
echo "configure:2741: checking checking for gmp..." >&5
if test ${gmp} ; then
echo "$ac_t""no" 1>&6
else
@ -2726,7 +2749,7 @@ else
fi
fi
echo $ac_n "checking checking for Boehm-Weiser gc...""... $ac_c" 1>&6
echo "configure:2730: checking checking for Boehm-Weiser gc..." >&5
echo "configure:2753: checking checking for Boehm-Weiser gc..." >&5
if test ${boehm} ; then
echo "$ac_t""yes" 1>&6
test -d gc && rm -rf gc

View file

@ -72,6 +72,9 @@ dnl threads="$enable_threads")
dnl AC_ARG_ENABLE(runtime,
dnl [--enable-runtime Build no compiler.],
dnl runtime="$enable_runtime")
AC_ARG_ENABLE(shared,
[--disable-shared Enable building dynamically loadable extensions.],
shared="$enable_shared")
### ----------------------------------------------------------------------
### Checks for programs
@ -149,6 +152,9 @@ if test ${boehm} ; then
else
EXTRA_OBJS="${EXTRA_OBJS} alloc.o gbc.o"
fi
if test ${shared} = "yes"; then
AC_DEFINE(ENABLE_DLOPEN)
fi
if test ${gmp} ; then
AC_DEFINE(HAVE_LOCAL_GMP)
else
@ -158,7 +164,11 @@ fi
if test ${runtime} ; then
AC_DEFINE(RUNTIME)
else
LSP_LIBRARIES="${LSP_LIBRARIES} libcmp.a"
if test ${shared} = "yes" ; then
LSP_LIBRARIES="${LSP_LIBRARIES} cmp.so"
else
LSP_LIBRARIES="${LSP_LIBRARIES} libcmp.a"
fi
fi
if test ${tk} ; then
TKLIBS="-ltk -ltcl -lXpm @XLIBS@"

View file

@ -60,9 +60,7 @@ benchmark.html: $(srcdir)/benchmark.in.html ../gabriel/BENCHMARK
echo '<pre>'; cat ../gabriel/BENCHMARK; echo '</pre>'; \
cat $(srcdir)/end) | $(FILTER) > $@
../gabriel/BENCHMARK:
cd ../gabriel; \
if (which lisp && which clisp) > /dev/null; then make; \
else echo "No benchmarks available" > BENCHMARK; fi
echo "No benchmarks available" > $@
license.html: $(top_srcdir)/../Copyright
(cat $(srcdir)/head; \
echo '<pre>'; cat $?; echo '</pre>'; \

View file

@ -47,17 +47,16 @@ differs from standards.
@menu
* Introduction:: How @ecls{} relates to C/C++.
* Building executables:: How to build executables.
* Building programs:: How to build programs using ECLS.
* Lisp objects:: Dealing with lisp object from C.
* The interpreter:: Understanding the interpreter.
* The compiler:: How the Lisp2C translator works.
* Examples:: Examples of mixed programming.
* Porting @ecls{}:: Porting @ecls{} to other architectures.
@end menu
@c ---------------------------------------------------------------------
@node Introduction, Building executables, Top, Top
@node Introduction, Building programs, Top, Top
@chapter Introduction
@ecls{} is an implementation of the @clisp{} language that is based on a kernel
@ -81,47 +80,322 @@ programs so that they can be invoked from @ecls{}. In addition, the user can
write Lisp function definitions in the C language to increase runtime
efficiency.
@node Building executables, Lisp objects, Introduction, Top
@chapter Building a customized image
@c ---------------------------------------------------------------------
@ecls{} can be used to control a C library, or it can be used as an embedded
language to provide some flexibility to an already existing C program. In both
cases @ecls{} should perform equally well, as far as you follow these rules:
@node Building programs, Lisp objects, Introduction, Top
@chapter Building programs
In this chapter we describe how you can use @ecls{} to build programs and
loadable extensions that you can later on distribute to other people.
@menu
* What can @ecls{} do?::
* Compiling files::
* Building standalone executables::
* Building libraries::
* Compiler examples::
@end menu
@node What can @ecls{} do?, Compiling files, Building programs, Building programs
@section What can @ecls{} do?
Some day for some reasons you will be in the need to distribute code that
has been developed using @ecls{}. In the following sections we will describe
the means that @ecls{} offers you to do so. Basically, these are the
alternatives
@table @sc
@item Source code
You distribute your programs in source code form. This is the easiest and most
portable way, but not the fastest one.
@item Standalone programs
You translate all your lisp code to C using the @ecls{} compiler. The final
object files can be linked against other C/C++ libraries to obtain a standalone
executable.
@item You can build statically linked libraries.
You translate all your lisp code to C and combine the resulting object files
into a single library with @file{.a} extension. You can distribute this library
to other people and the final users can utilize these libraries to build
standalone programs.
@item You can build dynamically loadable libraries.
This is the most flexible way. You translate all lisp code to C and link it
against possibly other C/C++ libraries to obtain a dynamically loadable library
(file type @file{.so} under unix). This library can be loaded a startup time to
add new functionality to the @ecls{} environment.
@end table
In several of these options, we have mentioned the possibility to include C/C++
code. Even if this is possible, you cannot use ordinary C/C++ compilers and
makefiles to build @ecls{} extensions, let it be programs or
libraries. Briefly, you have to organize your code as follows
@enumerate
@item Organize the C code as a library, let it be static or dynamic.
@item Build a function, say @code{mymain()}, in which the initialization phase
for your library is performed.
@item Group the code that interfaces to Lisp in separate C files, all of which
should include @code{#include <ecls.h>} at the beginning.
@item Let @ecls{} build the final executable.
@item Compile your lisp source files.
@item Let @ecls{} build the final executable or library.
@end enumerate
@noindent
In the final step there are ways to instruct @ecls{} to call your
initialization function (@code{mymain()} in the example above). These means
are explained in the following sections.
The final step, that is building the executable should be performed within a
working @ecls{} image. The function to build customized images is
@var{c::build-ecls}. The description of this function is as follows.
@c ---------------------------------------------------------------------
@defun {c::build-ecls} {@var{image-name} @keys{} :components :prologue-code :epilogue-code}
@node Compiling files, Building standalone executables, What can @ecls{} do?, Building programs
@section Compiling files
@ecls{} supports two types of compilation. One is bytecodes compilation. This
process is performed on-the-fly, as you load source files with lisp code. This
leads to a series of bytes for each instruction, the so called
"bytecodes". These bytecodes are interpreted in a virtual machine, which is
written in C and which is reasonably fast.
The other type of compilation is the so-called "native" compilation. This
process consists on translating the lisp source file to C language. The
intermediate file is later compiled using a C compiler. The result is an object
file which may have different purposes.
@table @sc
@item dynamically loadable object files
These are produced in a @ecls{} built with support for dynamically loadable
libraries (Feature @kwd{DLOPEN} is in @var{*features*}), when no extra
arguments are passed to @code{compile-file}. These object files typically have
the @file{.so} extension, and can be loaded with @code{load}. They cannot be used
to build libraries nor standalone executable programs.
@item linkable object files
These are produced when invoking @code{compile-file} with the keyword argument
@kwd{system-p} set to true. The object file typically has the @file{.o}
extension. It cannot be loaded with @code{load}, but it can be used to build
libraries or standalone executable programs.
@end table
@c ---------------------------------------------------------------------
@node Building standalone executables, Building libraries, Compiling files, Building programs
@section Building standalone executables
To build an executable you need a working @ecls{} image with the compiler. The
function to build customized images is @var{c::build-ecls}. The description of
this function is as follows.
@defun {c:build-ecls} {@var{image-name} @keys{} @var{lisp-files} @var{ld-flags} @var{prologue-code} @var{epilogue-code}}
This function builds a lisp image up from the core lisp library, plus all
listed components. Each component is either:
components listed in @var{lisp-files}. Each component is either:
@itemize
@item A symbol: Names a compiled lisp library. Currenty only @code{'CMP} is
supported, which corresponds to the lisp->C translator.
@item A string: Denotes an object file, a library, or any flag which is passed
to the compiler.
@item A symbol: Names a statically linked library built from lisp code.
@item A string: Denotes an object file built from lisp code.
@end itemize
@noindent
@var{ld-flags} is a list of strings with aditional parameters to be passed
to the linker. You can include here your favorite C/C++ libraries.
In order to build the lisp image, @var{c::build-ecls} first writes down a piece
of C code which initializes the lisp environment. You can customize the
initialization process by suppling code to be executed before
(@var{prologue-code}) or after (@var{epilogue-code}) setting up the lisp
environment. Typically @var{prologue-code} defaults to an empty string, while
@var{epilogue-code} invokes the classical lisp @var{top-level}.
@var{prologue-code} and @var{epilogue-code} are used to customize the
initialization process of the lisp image. In order to build the executable,
@var{c:build-ecls} first writes down a piece of C code which initializes the
lisp environment. You can customize the initialization process by suppling code
to be executed before (@var{prologue-code}) or after (@var{epilogue-code})
setting up the lisp environment. Typically @var{prologue-code} defaults to an
empty string, while @var{epilogue-code} invokes the classical lisp
@var{top-level}.
@end defun
@c ---------------------------------------------------------------------
@node Lisp objects, The interpreter, Building executables, Top
@node Building libraries, Compiler examples, Building standalone executables, Building programs
@section Building libraries
To build a library you proceed more or less the same way as with standalone
executables. There are two different functions depending on whether you need
to build static or dynamically loadable libraries.
@defun {c:build-static-library} {@var{library-name} @keys{} @var{lisp-files} @var{prologue-code} @var{epilogue-code}}
@defunx {c:build-shared-library} {@var{library-name} @keys{} @var{lisp-files} @var{prologue-code} @var{epilogue-code} @var{ld-flags}}
This function builds a library file up from the object files listed in
@var{lisp-files}. Each of the arguments to @var{lisp-file} must name a single
object file produced with @code{compile-file}.
@var{library-name} is the physical pathname corresponding to the library. The
value of @var{library-name} must follow some system-specific conventions. To
make your program portable, @var{library-name} should be built using the output
of @code{c:library-pathname}.
@var{prologue-code} and @var{epilogue-code} are strings with C code to be
executed before and after initializing the library, respectively. For
dynamically linked libraries you can also provide a list of strings in
@var{ld-flags}. These strings are additional parameters for the linker and
their purpose is to link C/C++ extensions into the library.
@end defun
@defun {c:static-library-pathname} {@var{filename-base}}
@defunx {c:shared-library-pathname} {@var{filename-base}}
These function outputs a valid library pathname built using @var{filename-base}
to extract the directory and part of the file name, and using the type of
library to determine the right file type.
The output of this function is system specific. For example, under FreeBSD
@example
> (c:static-library-pathname "/this/path/mylib")
#P"/this/path/libmylib.a"
> (c:shared-library-pathname "/this/path/mylib")
#P"/this/path/mylib.so"
@end example
@end defun
@c ---------------------------------------------------------------------
@node Compiler examples, , Building libraries, Building programs
@section Compiler examples
@subsection The @file{hello.lsp} file
In the follwoing examples we will use the same lisp program. You have to
create a file called @file{hello.lsp} which contains the following lines
@example
(princ "Hello world!")
(terpri)
(quit)
@end example
@noindent
If you start @ecls{} and load this file in the Common-Lisp environment you
will see the @code{"Hello world!"} message and the interpreter will be closed.
@example
ECLS (ECoLisp-Spain) 0.4
Copyright (C) 1984 Taiichi Yuasa and Masami Hagiya
Copyright (C) 1993 Giuseppe Attardi
Copyright (C) 2000 Juan J. Garcia-Ripoll
ECLS is free software, and you are welcome to redistribute it
under certain conditions; see file 'Copyright' for details.
Type :h for Help. Top level.
> @b{(load "hello.lsp")}
;;; Loading hello.lsp
Hello world!
Bye.
@end example
@subsection Example of loadable object file
You can only perform the example in this section if your @ecls{} image supports
dynamically loading of object files. This is true if you find the keyword
@kwd{dlopen} in the @var{*features*} variable. This is true, for instance,
in a typical FreeBSD or Linux box,
@example
Type :h for Help. Top level.
> @b{*features*}
(:IEEE-FLOATING-POINT :IBM-PC :I386 :BSD :UNIX :DLOPEN :ANSI-CL :CLOS
:BOEHM-GC :ECLS :COMMON)
@end example
In this example we build a loadable extension which prints the @code{"Hello
world!"} message. First you need to create a the @file{hello.lsp} file. Next
you have to enter the @ecls{} environment and type @code{(compile-file
"hello.lsp")}. This produces a loadable object file.
@example
Type :h for Help. Top level.
> @b{(compile-file "hello.lsp")}
;;; Loading /home/worm/lib/ecls/cmp.so
;;; Compiling hello.lsp.
;;; End of Pass 1.
;;; Calling the C compiler...
"gcc -g -O2 -Dfreebsd -O -I/home/worm/lib/ecls//h -w -c hello.c -o hello.o"
"ld -shared -o hello.so -L/home/worm/lib/ecls/ hello.o "
;;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3
;;; Finished compiling hello.lsp.
#P"hello.so"
> @b{(load "hello")}
;;; Loading hello.so
Hello world!
Bye.
@end example
@subsection Example of standalone program
In this example we build a standalone program which prints the @code{"Hello
world!"} message and does nothing else. First you must create the
@file{hello.lsp} file shown above. Next you have to enter the @ecls{}
environment and type @code{(compile-file "hello.lsp" :system-p t)}. This
produces an object file that can be linked agains the @ecls{} core image.
@example
Type :h for Help. Top level.
> @b{(compile-file "hello.lsp" :system-p t)}
;;; Loading /home/worm/lib/ecls/cmp.so
;;; Compiling hello.lsp.
;;; End of Pass 1.
;;; Calling the C compiler...
"gcc -g -O2 -Dfreebsd -O -I/home/worm/lib/ecls//h -w -c hello.c -o hello.o"
;;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3
;;; Finished compiling hello.lsp.
#P"hello.o
@end example
@noindent
The final step is to build the executable using the @code{c:build-ecls}
instruction.
@example
> @b{(c:build-ecls "myecls" :lisp-files '("hello.o"))}
"gcc -g -O2 -Dfreebsd -O -I/home/worm/lib/ecls//h -w -c myecls.c -o myecls.o"
"gcc -w -o myecls -L/home/worm/lib/ecls/ myecls.o hello.o -lecls -lclos -llsp -lgmp -Wl,--export-dynamic -lgc -lcompat -lgmp -lm"
"myecls"
@end example
@noindent
Now you can execute this program from your favourite shell.
@example
worm@@arrakis.es% @b{./myecls}
Hello world!
Bye.
@end example
@subsection Example of loadable library
You can only perform the example in this section if your @ecls{} image supports
dynamically loading of object files. In this example we build a loadable
library which prints the @code{"Hello world!"} message and does nothing
else. First you must create the @file{hello.lsp} file shown above. Next you
have to enter the @ecls{} environment and type @code{(compile-file "hello.lsp"
:system-p t)}. This produces an object file that can be linked to form a loadable
library.
@example
Type :h for Help. Top level.
> @b{(compile-file "hello.lsp" :system-p t)}
;;; Loading /home/worm/lib/ecls/cmp.so
;;; Compiling hello.lsp.
;;; End of Pass 1.
;;; Calling the C compiler...
"gcc -g -O2 -Dfreebsd -O -I/home/worm/lib/ecls//h -w -c hello.c -o hello.o"
;;; OPTIMIZE levels: Safety=0 (No runtime error checking), Space=0, Speed=3
;;; Finished compiling hello.lsp.
#P"hello.o
@end example
@noindent
The final step is to build the library using the @code{c:build-shared-library}
instruction.
@example
> @b{(c:build-shared-library (c:shared-library-pathname "myecls") :lisp-files '("hello.o"))}
"gcc -g -O2 -Dfreebsd -O -I/home/worm/lib/ecls//h -w -c myecls.c -o myecls.o"
"gcc -w -o myecls.so -L/home/worm/lib/ecls/ myecls.o hello.o -lecls -lclos -llsp -lgmp -Wl,--export-dynamic -lgc -lcompat -lgmp -lm"
"myecls.so"
@end example
@noindent
Now you can load this extension from any @ecls{} image, even those you produce
with @code{c:build-ecls}
@example
> (load (c:shared-library-pathname "myecls"))
;;; Loading myecls.so
Hello world!
Bye.
@end example
@c ---------------------------------------------------------------------
@node Lisp objects, The interpreter, Building programs, Top
@chapter Manipulating lisp objects
If you want to extend, fix or simply customize @ecls{} for your own needs,
@ -783,7 +1057,7 @@ Block names: FACT. ;;; The block FACT is established.
@c ---------------------------------------------------------------------
@node The compiler, Examples, The interpreter, Top
@node The compiler, Porting @ecls{}, The interpreter, Top
@chapter The compiler
@menu
@ -1285,40 +1559,7 @@ C-type:
@c ---------------------------------------------------------------------
@node Examples, Porting @ecls{}, The compiler, Top
@chapter Examples of customization
Let us see how this all works in practice. We will assume that @ecls{} is
installed and that it works. The first example simply gives @ecls{} another
boot message. You just have to type this at the @ecls{} prompt
@example
(c::build-ecls "myecls"
:prologue-code "printf(\"Lisp image to be initialized...\\n\");"
:epilogue-code "printf(\"...lisp image initialized!!!\\n\");
funcall(1,_intern(\"TPL\",system_package));")
@end example
@noindent
With the following text you have a new image:
@example
% ./myecls
Lisp image to be initialized...
*+*+*+
...lisp image initialized!!!
ECLS (ECoLisp-Spain) 0.4
Copyright (C) 1984 Taiichi Yuasa and Masami Hagiya
Copyright (C) 1993 Giuseppe Attardi
Copyright (C) 2000 Juan J. Garcia-Ripoll
ECLS is free software, and you are welcome to redistribute it
under certain conditions; see file 'Copyright' for details.
Type :h for Help. Top level.
@end example
@c ---------------------------------------------------------------------
@node Porting @ecls{}, , Examples, Top
@node Porting @ecls{}, , The compiler, Top
@chapter Porting @ecls{}
To port @ecls{} to a new architecture, the following steps are required:

View file

@ -64,6 +64,7 @@ interface with other languages.
* CLOS:: Common-Lisp's Object System.
* Multithread:: Lisp lightweight processes or threads.
* Everything:: All functions/variables/etc enumerated.
* ::
* Bibliography:: Some interesting books.
@end menu
@ -140,64 +141,26 @@ William F. Schelter improved KCL in several areas and developed Austin Kyoto
@clisp{} (AKCL). Many ideas and code from AKCL have been incorporated in
@ecls{}.
The following is the full list of contributors to ECoLisp:
The following is the full list of contributors to ECoLisp: Taiichi Yuasa and
Masami Hagiya (KCL), William F. Schelter (Dynamic loader, conservative Gc),
Giuseppe Attardi (Top-level, trace, stepper, compiler, CLOS, multithread),
Marcus Daniels (Linux port) Cornelis van der Laan (FreeBSD port) David Rudloff
(NeXT port) Dan Stanger, Don Cohen, and Brian Spilsbury.
We have to thank for the following pieces of software that have helped in the
development of @ecls{}
@table @sc
@item Authors:
@table @sc
@item KCL:
Taiichi Yuasa and Masami Hagiya
@item Dynamic loader:
William F. Schelter (@email{wfs@@fireant.ma.utexas.edu})
@item Conservative GC:
William F. Schelter
@item Top-level, trace, stepper:
Giuseppe Attardi
@item Compiler:
Giuseppe Attardi
@item CLOS:
Giuseppe Attardi with excepts from PCL by Gregor Kiczales
@item Multithread:
Giuseppe Attardi, Stefano Diomedi, Tito Flagella
@item Unification:
Giuseppe Attardi, Mauro Gaspari
@item Bruno Haible
For the Cltl2-compliance test
@item Peter Van Eynde
For the ANSI-compliance test
@item Symbolic's Inc.
For the ANSI-compliant LOOP macro.
@end table
@item MSDOS EMX port:
Giuseppe Attardi
@item ndmake45.exe
Make utility by D. G. Kneller
@item MSDOS GO32 port:
Giuseppe Attardi
@item ndmake45.exe
Make utility by D. G. Kneller
@item Linux port:
Marcus Daniels (@email{marcus@@ee.pdx.edu})
@item FreeBSD port:
Cornelis van der Laan (@email{nils@@ims.uni-stuttgart.de})
@item NeXT port:
David Rudloff (@email{rudloff@@steinway.u-strasbg.fr})
@item Other contributors:
Dan Stanger (@email{dxs@@evolving.com}), Don Cohen
(@email{donc@@ISI.EDU}), Brian Spilsbury
(@email{brian@@bizo.biz.usyd.edu.au})
@end table
There is no list of contributors to @ecls{}, yet, but you are free to contact me
at the following address:
@example
Juan Jose Garcia-Ripoll (@email{worm@@arrakis.es})
Universidad de Castilla-La Mancha
Departamento de Matematicas,
E.T.S.I. Industriales,
Av. Camilo Jose Cela, 3
E-13071, Ciudad Real, Spain
@end example
The @ecls{} project also owes a lot to the people who have tested this program
and contributed with suggestions and error messages: Eric Marsden, Hannu
Koivisto and Jeff Bowden, and others whose name I may have omitted.
@node Copyright, Installation, Credits, Introduction
@section Copyright

View file

@ -2,7 +2,7 @@ top_srcdir=@top_srcdir@
srcdir=@srcdir@
FILES = CMUCLc ECLSc CLISPc CMUCLi ECLSi CLISPi
LISP ?= ../ecls -eval '(setf (logical-pathname-translations "SYS") '"'"'(("SYS:*.*" "../*.*")))'
LISP ?= ../ecls -dir `pwd`/
NAME ?= ECLSc
COMPILE ?= NIL

View file

@ -3,6 +3,9 @@
;;; TRIANG -- Board game benchmark.
(defvar a)
(defvar b)
(defvar c)
(defvar answer)
(defvar final)
@ -91,5 +94,11 @@
(try i 1)))
(defun testtriang ()
(declare (notinline cos aref))
(print (cos 1.0))
(triang-setup)
(print board)
(print (aref a 22))
(print (aref b 22))
(print (aref c 22))
(gogogo 22))

View file

@ -38,6 +38,9 @@
/* Use Boehm's garbage collector */
#undef GBC_BOEHM
/* Allow loading dynamically linked code */
#undef ENABLE_DLOPEN
/* Undefine this if you do not want ECLS to check for circular lists */
#define ECLS_SAFE

View file

@ -79,6 +79,10 @@ after compilation."
(load "SYS:cmp")
(apply 'compile args))
(defun compile-file-pathname (&rest args)
(load "SYS:cmp")
(apply 'compile-file-pathname args))
(defun disassemble (&rest args)
"Args: (&optional (thing nil) &key (h-file nil) (data-file nil))
Compiles the form specified by THING and prints the intermediate C language

View file

@ -83,9 +83,12 @@
:type (system-fasl-extension system)
:defaults (system-fasl-directory system)))
(defun make-library-pathname (system)
(compiler::library-pathname (string-downcase (system-name system))
:directory (system-library-directory system)))
(defun make-library-pathname (system shared)
(let* ((name (string-downcase (system-name system)))
(directory (system-library-directory system))
(output-name (merge-pathnames name directory)))
(funcall (if shared #'c:shared-library-pathname #'c:static-library-pathname)
output-name)))
;;; ----------------------------------------------------------------------
;;; Operations on modules
@ -210,11 +213,12 @@
(objects (mapcar #'(lambda (x) (make-binary-pathname (module-name (cadr x)) system))
(remove-if-not #'(lambda (x) (eq (car x) :LOAD))
transforms)))
(library (string-downcase (system-name system))))
(shared (eq mode :shared-library))
(library (make-library-pathname system shared)))
(print (cons library objects))
(compiler::make-library library objects
:output-dir (system-library-directory system)
:shared (eq mode :SHARED-LIBRARY)))
(funcall (if shared #'c::build-shared-library
#'c::build-static-library)
library :lisp-files objects))
nil)
(:COMPILE
(make-transformations system