mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-10 22:10:21 +02:00
Merge branch 'wingo'
This commit is contained in:
commit
9c0cd73e61
41 changed files with 323 additions and 232 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -72,7 +72,6 @@ guile-readline/guile-readline-config.h.in
|
|||
TAGS
|
||||
guile-1.8.pc
|
||||
gdb-pre-inst-guile
|
||||
libguile/stack-limit-calibration.scm
|
||||
cscope.out
|
||||
cscope.files
|
||||
*.log
|
||||
|
|
|
@ -24,16 +24,14 @@
|
|||
#
|
||||
AUTOMAKE_OPTIONS = 1.10
|
||||
|
||||
SUBDIRS = lib libguile guile-config guile-readline emacs \
|
||||
SUBDIRS = lib meta libguile guile-readline emacs \
|
||||
scripts srfi doc examples test-suite benchmark-suite lang am \
|
||||
module testsuite
|
||||
|
||||
bin_SCRIPTS = guile-tools
|
||||
|
||||
include_HEADERS = libguile.h
|
||||
|
||||
EXTRA_DIST = LICENSE HACKING GUILE-VERSION \
|
||||
m4/ChangeLog-2008 FAQ guile-1.8.pc.in \
|
||||
m4/ChangeLog-2008 FAQ \
|
||||
m4/autobuild.m4 ChangeLog-2008
|
||||
|
||||
TESTS = check-guile
|
||||
|
@ -42,7 +40,4 @@ ACLOCAL_AMFLAGS = -I m4
|
|||
|
||||
DISTCLEANFILES = check-guile.log
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = guile-1.8.pc
|
||||
|
||||
# Makefile.am ends here
|
||||
|
|
20
README
20
README
|
@ -223,9 +223,23 @@ GUILE_FOR_BUILD variable, it defaults to just "guile".
|
|||
|
||||
Using Guile Without Installing It =========================================
|
||||
|
||||
The top directory of the Guile sources contains a script called
|
||||
"pre-inst-guile" that can be used to run the Guile that has just been
|
||||
built.
|
||||
The "meta/" subdirectory of the Guile sources contains a script called
|
||||
"guile" that can be used to run the Guile that has just been built. Note
|
||||
that this is not the same "guile" as the one that is installed; this
|
||||
"guile" is a wrapper script that sets up the environment appropriately,
|
||||
then invokes the Guile binary.
|
||||
|
||||
You may also build external packages against an uninstalled Guile build
|
||||
tree. The "uninstalled-env" script in the "meta/" subdirectory will set
|
||||
up an environment with a path including "meta/", a modified dynamic
|
||||
linker path, a modified PKG_CONFIG_PATH, etc.
|
||||
|
||||
For example, you can enter this environment via invoking
|
||||
|
||||
meta/uninstalled-env bash
|
||||
|
||||
Within that shell, other packages should be able to build against
|
||||
uninstalled Guile.
|
||||
|
||||
|
||||
Installing SLIB ===========================================================
|
||||
|
|
|
@ -10,6 +10,4 @@ CLEANFILES = $(GOBJECTS)
|
|||
SUFFIXES = .scm .go
|
||||
.scm.go:
|
||||
$(MKDIR_P) `dirname $@`
|
||||
$(top_builddir)/pre-inst-guile \
|
||||
-l $(top_builddir)/libguile/stack-limit-calibration.scm \
|
||||
$(top_srcdir)/scripts/compile -o "$@" "$<"
|
||||
$(top_builddir)/meta/uninstalled-env guile-tools compile -o "$@" "$<"
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
## Code:
|
||||
|
||||
preinstguile = $(top_builddir_absolute)/pre-inst-guile
|
||||
preinstguile = $(top_builddir_absolute)/meta/guile
|
||||
preinstguiletool = GUILE="$(preinstguile)" $(top_srcdir)/scripts
|
||||
|
||||
## am/pre-inst-guile ends here
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#! /bin/sh
|
||||
# Usage: check-guile [-i GUILE-INTERPRETER] [GUILE-TEST-ARGS]
|
||||
# If `-i GUILE-INTERPRETER' is omitted, use ${top_builddir}/pre-inst-guile.
|
||||
# If `-i GUILE-INTERPRETER' is omitted, use ${top_builddir}/meta/guile.
|
||||
# See ${top_srcdir}/test-suite/guile-test for documentation on GUILE-TEST-ARGS.
|
||||
#
|
||||
# Example invocations:
|
||||
|
@ -21,7 +21,7 @@ if [ x"$1" = x-i ] ; then
|
|||
shift
|
||||
shift
|
||||
else
|
||||
guile=${top_builddir}/pre-inst-guile
|
||||
guile=${top_builddir}/meta/guile
|
||||
fi
|
||||
|
||||
GUILE_LOAD_PATH=$TEST_SUITE_DIR
|
||||
|
@ -41,7 +41,6 @@ if [ ! -f guile-procedures.txt ] ; then
|
|||
fi
|
||||
|
||||
exec $guile \
|
||||
-l ${top_builddir}/libguile/stack-limit-calibration.scm \
|
||||
-e main -s "$TEST_SUITE_DIR/guile-test" \
|
||||
--test-suite "$TEST_SUITE_DIR/tests" \
|
||||
--log-file check-guile.log "$@"
|
||||
|
|
16
configure.in
16
configure.in
|
@ -883,6 +883,8 @@ if test -n "$have_sys_un_h" ; then
|
|||
[Define if the system supports Unix-domain (file-domain) sockets.])
|
||||
fi
|
||||
|
||||
AC_CHECK_FUNCS(getrlimit setrlimit)
|
||||
|
||||
AC_CHECK_FUNCS(socketpair getgroups setgroups setpwent pause tzset)
|
||||
|
||||
AC_CHECK_FUNCS(sethostent gethostent endhostent dnl
|
||||
|
@ -1532,13 +1534,13 @@ AC_CONFIG_FILES([
|
|||
doc/tutorial/Makefile
|
||||
emacs/Makefile
|
||||
examples/Makefile
|
||||
guile-config/Makefile
|
||||
lang/Makefile
|
||||
libguile/Makefile
|
||||
scripts/Makefile
|
||||
srfi/Makefile
|
||||
test-suite/Makefile
|
||||
test-suite/standalone/Makefile
|
||||
meta/Makefile
|
||||
module/Makefile
|
||||
module/ice-9/Makefile
|
||||
module/ice-9/debugger/Makefile
|
||||
|
@ -1549,13 +1551,15 @@ AC_CONFIG_FILES([
|
|||
testsuite/Makefile
|
||||
])
|
||||
|
||||
AC_CONFIG_FILES([guile-1.8.pc])
|
||||
AC_CONFIG_FILES([meta/guile-1.8.pc])
|
||||
AC_CONFIG_FILES([meta/guile-1.8-uninstalled.pc])
|
||||
AC_CONFIG_FILES([check-guile], [chmod +x check-guile])
|
||||
AC_CONFIG_FILES([benchmark-guile], [chmod +x benchmark-guile])
|
||||
AC_CONFIG_FILES([guile-tools], [chmod +x guile-tools])
|
||||
AC_CONFIG_FILES([pre-inst-guile], [chmod +x pre-inst-guile])
|
||||
AC_CONFIG_FILES([pre-inst-guile-env], [chmod +x pre-inst-guile-env])
|
||||
AC_CONFIG_FILES([gdb-pre-inst-guile], [chmod +x gdb-pre-inst-guile])
|
||||
AC_CONFIG_FILES([meta/guile-config], [chmod +x meta/guile-config])
|
||||
AC_CONFIG_FILES([meta/guile-tools], [chmod +x meta/guile-tools])
|
||||
AC_CONFIG_FILES([meta/guile], [chmod +x meta/guile])
|
||||
AC_CONFIG_FILES([meta/uninstalled-env], [chmod +x meta/uninstalled-env])
|
||||
AC_CONFIG_FILES([meta/gdb-uninstalled-guile], [chmod +x meta/gdb-uninstalled-guile])
|
||||
AC_CONFIG_FILES([libguile/guile-snarf],
|
||||
[chmod +x libguile/guile-snarf])
|
||||
AC_CONFIG_FILES([libguile/guile-doc-snarf],
|
||||
|
|
|
@ -89,8 +89,8 @@ include $(top_srcdir)/am/pre-inst-guile
|
|||
# Automated snarfing
|
||||
|
||||
autoconf.texi: autoconf-macros.texi
|
||||
autoconf-macros.texi: $(top_srcdir)/guile-config/guile.m4
|
||||
$(preinstguiletool)/snarf-guile-m4-docs $(top_srcdir)/guile-config/guile.m4 \
|
||||
autoconf-macros.texi: $(top_srcdir)/meta/guile.m4
|
||||
$(preinstguiletool)/snarf-guile-m4-docs $(top_srcdir)/meta/guile.m4 \
|
||||
> $(srcdir)/$@
|
||||
|
||||
lib-version.texi: $(top_srcdir)/GUILE-VERSION
|
||||
|
|
|
@ -233,7 +233,7 @@ Report bugs to <bug-guile@gnu.org>.~%"))
|
|||
(ref-env (assoc-ref args 'reference-environment))
|
||||
(bdwgc-env (or (assoc-ref args 'bdwgc-environment)
|
||||
(string-append "GUILE=" bench-dir
|
||||
"/../pre-inst-guile")))
|
||||
"/../meta/guile")))
|
||||
(prof-opts (assoc-ref args 'profile-options)))
|
||||
(for-each (lambda (benchmark)
|
||||
(let ((ref (parse-result (run-reference-guile ref-env
|
||||
|
|
|
@ -256,7 +256,7 @@ EXTRA_DIST = ChangeLog-scm ChangeLog-threads \
|
|||
cpp_errno.c cpp_err_symbols.in cpp_err_symbols.c \
|
||||
cpp_sig_symbols.c cpp_sig_symbols.in cpp_cnvt.awk \
|
||||
c-tokenize.lex version.h.in \
|
||||
scmconfig.h.top libgettext.h measure-hwm.scm
|
||||
scmconfig.h.top libgettext.h
|
||||
# $(DOT_DOC_FILES) $(EXTRA_DOT_DOC_FILES) \
|
||||
# guile-procedures.txt guile.texi
|
||||
|
||||
|
@ -351,24 +351,6 @@ guile-procedures.txt: guile-procedures.texi
|
|||
|
||||
endif
|
||||
|
||||
# Stack limit calibration to allow the compiler to run when creating
|
||||
# the initial `.go' files and for `make check'. (For why we do this, see
|
||||
# the comments in measure-hwm.scm.)
|
||||
#
|
||||
# The fact that "libguile" comes before "module" and "test-suite"
|
||||
# in SUBDIRS in our toplevel Makefile.am ensures that the
|
||||
# stack-limit-calibration.scm program will be run before we compile
|
||||
# files or run tests.
|
||||
#
|
||||
# We don't care about the exit code of `measure-hwm.scm' because the
|
||||
# important thing about stack-limit-calibration.scm is just that it is
|
||||
# generated in the first place, so that it can be loaded in `am/guilec'
|
||||
# and by the test suite.
|
||||
BUILT_SOURCES += stack-limit-calibration.scm
|
||||
|
||||
stack-limit-calibration.scm: measure-hwm.scm guile$(EXEEXT)
|
||||
-$(preinstguile) -s $(srcdir)/measure-hwm.scm > $@
|
||||
|
||||
c-tokenize.c: c-tokenize.lex
|
||||
flex -t $(srcdir)/c-tokenize.lex > $@ || { rm $@; false; }
|
||||
|
||||
|
@ -423,8 +405,9 @@ MOSTLYCLEANFILES = \
|
|||
cpp_err_symbols_here cpp_err_symbols_diff cpp_err_symbols_new \
|
||||
cpp_sig_symbols_here cpp_sig_symbols_diff cpp_sig_symbols_new \
|
||||
version.h version.h.tmp \
|
||||
scmconfig.h scmconfig.h.tmp stack-limit-calibration.scm
|
||||
scmconfig.h scmconfig.h.tmp
|
||||
|
||||
CLEANFILES = libpath.h *.x *.doc guile-procedures.txt guile-procedures.texi guile.texi
|
||||
CLEANFILES = libpath.h *.x *.doc guile-procedures.txt guile-procedures.texi guile.texi \
|
||||
vm-i-*.i
|
||||
|
||||
MAINTAINERCLEANFILES = c-tokenize.c
|
||||
|
|
|
@ -21,6 +21,11 @@
|
|||
# include <config.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_GETRLIMIT
|
||||
#include <sys/time.h>
|
||||
#include <sys/resource.h>
|
||||
#endif
|
||||
|
||||
#include "libguile/_scm.h"
|
||||
#include "libguile/async.h"
|
||||
#include "libguile/eval.h"
|
||||
|
@ -513,11 +518,42 @@ SCM_DEFINE (scm_debug_hang, "debug-hang", 0, 1, 0,
|
|||
#undef FUNC_NAME
|
||||
#endif
|
||||
|
||||
static void
|
||||
init_stack_limit (void)
|
||||
{
|
||||
#ifdef HAVE_GETRLIMIT
|
||||
struct rlimit lim;
|
||||
if (getrlimit (RLIMIT_STACK, &lim) == 0)
|
||||
{
|
||||
int bytes = lim.rlim_cur, words;
|
||||
|
||||
/* set our internal stack limit to 1 MB or 80% of the rlimit, whichever
|
||||
is lower. */
|
||||
if (bytes == RLIM_INFINITY)
|
||||
bytes = lim.rlim_max;
|
||||
|
||||
if (bytes == RLIM_INFINITY)
|
||||
words = 1024 * 1024 / sizeof (scm_t_bits);
|
||||
else
|
||||
{
|
||||
bytes = bytes * 8 / 10;
|
||||
if (bytes > 1024 * 1024)
|
||||
bytes = 1024 * 1024;
|
||||
words = bytes / sizeof (scm_t_bits);
|
||||
}
|
||||
|
||||
SCM_STACK_LIMIT = words;
|
||||
}
|
||||
errno = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
scm_init_debug ()
|
||||
{
|
||||
init_stack_limit ();
|
||||
scm_init_opts (scm_debug_options, scm_debug_opts);
|
||||
|
||||
scm_tc16_memoized = scm_make_smob_type ("memoized", 0);
|
||||
|
|
|
@ -76,6 +76,7 @@ load_extension (SCM lib, SCM init)
|
|||
{
|
||||
extension_t *ext;
|
||||
char *clib, *cinit;
|
||||
int found = 0;
|
||||
|
||||
scm_dynwind_begin (0);
|
||||
|
||||
|
@ -89,10 +90,14 @@ load_extension (SCM lib, SCM init)
|
|||
&& !strcmp (ext->init, cinit))
|
||||
{
|
||||
ext->func (ext->data);
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
scm_dynwind_end ();
|
||||
|
||||
if (found)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Dynamically link the library. */
|
||||
|
|
|
@ -26,6 +26,8 @@
|
|||
|
||||
|
||||
|
||||
typedef void (*scm_t_extension_init_func)(void*);
|
||||
|
||||
SCM_API void scm_c_register_extension (const char *lib, const char *init,
|
||||
void (*func) (void *), void *data);
|
||||
|
||||
|
|
|
@ -297,6 +297,8 @@ scm_bootstrap_frames (void)
|
|||
scm_set_smob_mark (scm_tc16_vm_frame, vm_frame_mark);
|
||||
scm_set_smob_free (scm_tc16_vm_frame, vm_frame_free);
|
||||
scm_set_smob_print (scm_tc16_vm_frame, vm_frame_print);
|
||||
scm_c_register_extension ("libguile", "scm_init_frames",
|
||||
(scm_t_extension_init_func)scm_init_frames, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -215,6 +215,9 @@ SCM_DEFINE (scm_opcode_to_instruction, "opcode->instruction", 1, 0, 0,
|
|||
void
|
||||
scm_bootstrap_instructions (void)
|
||||
{
|
||||
scm_c_register_extension ("libguile", "scm_init_instructions",
|
||||
(scm_t_extension_init_func)scm_init_instructions,
|
||||
NULL);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -1,136 +0,0 @@
|
|||
;;;; Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
;;;;
|
||||
;;;; This library is free software; you can redistribute it and/or
|
||||
;;;; modify it under the terms of the GNU Lesser General Public
|
||||
;;;; License as published by the Free Software Foundation; either
|
||||
;;;; version 2.1 of the License, or (at your option) any later version.
|
||||
;;;;
|
||||
;;;; This library is distributed in the hope that it will be useful,
|
||||
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
;;;; Lesser General Public License for more details.
|
||||
;;;;
|
||||
;;;; You should have received a copy of the GNU Lesser General Public
|
||||
;;;; License along with this library; if not, write to the Free Software
|
||||
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
;;;;
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;;; This code is run during the Guile build, in order to set the stack
|
||||
;;; limit to a value that will allow the `make check' tests to pass,
|
||||
;;; taking into account the average stack usage on the build platform.
|
||||
;;; For more detail, see the text below that gets written out to the
|
||||
;;; stack limit calibration file.
|
||||
|
||||
;;; Code:
|
||||
|
||||
;; Store off Guile's default stack limit.
|
||||
(define default-stack-limit (cadr (memq 'stack (debug-options))))
|
||||
|
||||
;; Now disable the stack limit, so that we don't get a stack overflow
|
||||
;; while running this code!
|
||||
(debug-set! stack 0)
|
||||
|
||||
;; Define a variable to hold the measured stack high water mark (HWM).
|
||||
(define top-repl-hwm-measured 0)
|
||||
|
||||
;; Use an evaluator trap to measure the stack size at every
|
||||
;; evaluation step, and increase top-repl-hwm-measured if it is less
|
||||
;; than the measured stack size.
|
||||
(trap-set! enter-frame-handler
|
||||
(lambda _
|
||||
(let ((stack-size (%get-stack-size)))
|
||||
(if (< top-repl-hwm-measured stack-size)
|
||||
(set! top-repl-hwm-measured stack-size)))))
|
||||
(trap-enable 'enter-frame)
|
||||
(trap-enable 'traps)
|
||||
|
||||
;; Call (turn-on-debugging) and (top-repl) in order to simulate as
|
||||
;; closely as possible what happens - and in particular, how much
|
||||
;; stack is used - when a standard Guile REPL is started up.
|
||||
;;
|
||||
;; `make check' stack overflow errors have been reported in the past
|
||||
;; for:
|
||||
;;
|
||||
;; - test-suite/standalone/test-use-srfi, which runs `guile -q
|
||||
;; --use-srfi=...' a few times, with standard input for the REPL
|
||||
;; coming from a shell script
|
||||
;;
|
||||
;; - test-suite/tests/elisp.test, which does not involve the REPL, but
|
||||
;; has a lot of `use-modules' calls.
|
||||
;;
|
||||
;; Stack high water mark (HWM) measurements show that the HWM is
|
||||
;; higher in the test-use-srfi case - specifically because of the
|
||||
;; complexity of (top-repl) - so that is what we simulate for our
|
||||
;; calibration model here.
|
||||
(turn-on-debugging)
|
||||
(with-output-to-port (%make-void-port "w")
|
||||
(lambda ()
|
||||
(with-input-from-string "\n" top-repl)))
|
||||
|
||||
;; top-repl-hwm-measured now contains the stack HWM that resulted from
|
||||
;; running that code.
|
||||
|
||||
;; This is the value of top-repl-hwm-measured that we get on a
|
||||
;; `canonical' build platform. (See text below for what that means.)
|
||||
(define top-repl-hwm-i686-pc-linux-gnu 9461)
|
||||
|
||||
;; Using the above results, output code that tests can run in order to
|
||||
;; configure the stack limit correctly for the current build platform.
|
||||
(format #t "\
|
||||
;; Stack limit calibration file.
|
||||
;;
|
||||
;; This file is automatically generated by Guile when it builds, in
|
||||
;; order to set the stack limit to a value that reflects the stack
|
||||
;; usage of the build platform (OS + compiler + compilation options),
|
||||
;; specifically so that none of Guile's own tests (which are run by
|
||||
;; `make check') fail because of a benign stack overflow condition.
|
||||
;;
|
||||
;; By a `benign' stack overflow condition, we mean one where the test
|
||||
;; code is behaving correctly, but exceeds the configured stack limit
|
||||
;; because the limit is set too low. A non-benign stack overflow
|
||||
;; condition would be if a piece of test code behaved significantly
|
||||
;; differently on some platform to how it does normally, and as a
|
||||
;; result consumed a lot more stack. Although they seem pretty
|
||||
;; unlikely, we would want to catch non-benign conditions like this,
|
||||
;; and that is why we don't just do `(debug-set! stack 0)' when
|
||||
;; running `make check'.
|
||||
;;
|
||||
;; Although the primary purpose of this file is to prevent `make
|
||||
;; check' from failing without good reason, Guile developers and users
|
||||
;; may also find the following information useful, when determining
|
||||
;; what stack limit to configure for their own programs.
|
||||
|
||||
(let (;; The stack high water mark measured when starting up the
|
||||
;; standard Guile REPL on the current build platform.
|
||||
(top-repl-hwm-measured ~a)
|
||||
|
||||
;; The value of top-repl-hwm-measured that we get when building
|
||||
;; Guile on an i686 PC GNU/Linux system, after configuring with
|
||||
;; `./configure --enable-maintainer-mode --with-threads'.
|
||||
;; (Hereafter referred to as the `canonical' build platform.)
|
||||
(top-repl-hwm-i686-pc-linux-gnu ~a)
|
||||
|
||||
;; Guile's default stack limit (i.e. the initial, C-coded value
|
||||
;; of the 'stack debug option). In the context of this file,
|
||||
;; the important thing about this number is that we know that
|
||||
;; it allows all of the `make check' tests to pass on the
|
||||
;; canonical build platform.
|
||||
(default-stack-limit ~a)
|
||||
|
||||
;; Calibrated stack limit. This is the default stack limit,
|
||||
;; scaled by the factor between top-repl-hwm-i686-pc-linux-gnu
|
||||
;; and top-repl-hwm-measured.
|
||||
(calibrated-stack-limit ~a))
|
||||
|
||||
;; Configure the calibrated stack limit.
|
||||
(debug-set! stack calibrated-stack-limit))
|
||||
"
|
||||
top-repl-hwm-measured
|
||||
top-repl-hwm-i686-pc-linux-gnu
|
||||
default-stack-limit
|
||||
;; Use quotient here to get an integer result, rather than a
|
||||
;; rational.
|
||||
(quotient (* default-stack-limit top-repl-hwm-measured)
|
||||
top-repl-hwm-i686-pc-linux-gnu))
|
|
@ -266,6 +266,8 @@ scm_bootstrap_objcodes (void)
|
|||
{
|
||||
scm_tc16_objcode = scm_make_smob_type ("objcode", 0);
|
||||
scm_set_smob_mark (scm_tc16_objcode, objcode_mark);
|
||||
scm_c_register_extension ("libguile", "scm_init_objcodes",
|
||||
(scm_t_extension_init_func)scm_init_objcodes, NULL);
|
||||
}
|
||||
|
||||
/* Before, we used __BYTE_ORDER, but that is not defined on all
|
||||
|
|
174
libguile/posix.c
174
libguile/posix.c
|
@ -33,6 +33,7 @@
|
|||
#include "libguile/srfi-13.h"
|
||||
#include "libguile/srfi-14.h"
|
||||
#include "libguile/vectors.h"
|
||||
#include "libguile/values.h"
|
||||
#include "libguile/lang.h"
|
||||
|
||||
#include "libguile/validate.h"
|
||||
|
@ -463,6 +464,179 @@ SCM_DEFINE (scm_setgrent, "setgr", 0, 1, 0,
|
|||
#endif /* HAVE_GETGRENT */
|
||||
|
||||
|
||||
#ifdef HAVE_GETRLIMIT
|
||||
#ifdef RLIMIT_AS
|
||||
SCM_SYMBOL (sym_as, "as");
|
||||
#endif
|
||||
#ifdef RLIMIT_CORE
|
||||
SCM_SYMBOL (sym_core, "core");
|
||||
#endif
|
||||
#ifdef RLIMIT_CPU
|
||||
SCM_SYMBOL (sym_cpu, "cpu");
|
||||
#endif
|
||||
#ifdef RLIMIT_DATA
|
||||
SCM_SYMBOL (sym_data, "data");
|
||||
#endif
|
||||
#ifdef RLIMIT_FSIZE
|
||||
SCM_SYMBOL (sym_fsize, "fsize");
|
||||
#endif
|
||||
#ifdef RLIMIT_MEMLOCK
|
||||
SCM_SYMBOL (sym_memlock, "memlock");
|
||||
#endif
|
||||
#ifdef RLIMIT_MSGQUEUE
|
||||
SCM_SYMBOL (sym_msgqueue, "msgqueue");
|
||||
#endif
|
||||
#ifdef RLIMIT_NICE
|
||||
SCM_SYMBOL (sym_nice, "nice");
|
||||
#endif
|
||||
#ifdef RLIMIT_NOFILE
|
||||
SCM_SYMBOL (sym_nofile, "nofile");
|
||||
#endif
|
||||
#ifdef RLIMIT_NPROC
|
||||
SCM_SYMBOL (sym_nproc, "nproc");
|
||||
#endif
|
||||
#ifdef RLIMIT_RSS
|
||||
SCM_SYMBOL (sym_rss, "rss");
|
||||
#endif
|
||||
#ifdef RLIMIT_RTPRIO
|
||||
SCM_SYMBOL (sym_rtprio, "rtprio");
|
||||
#endif
|
||||
#ifdef RLIMIT_RTPRIO
|
||||
SCM_SYMBOL (sym_rttime, "rttime");
|
||||
#endif
|
||||
#ifdef RLIMIT_SIGPENDING
|
||||
SCM_SYMBOL (sym_sigpending, "sigpending");
|
||||
#endif
|
||||
#ifdef RLIMIT_STACK
|
||||
SCM_SYMBOL (sym_stack, "stack");
|
||||
#endif
|
||||
|
||||
static int
|
||||
scm_to_resource (SCM s, const char *func, int pos)
|
||||
{
|
||||
if (scm_is_number (s))
|
||||
return scm_to_int (s);
|
||||
|
||||
SCM_ASSERT_TYPE (scm_is_symbol (s), s, pos, func, "symbol");
|
||||
|
||||
#ifdef RLIMIT_AS
|
||||
if (s == sym_as)
|
||||
return RLIMIT_AS;
|
||||
#endif
|
||||
#ifdef RLIMIT_CORE
|
||||
if (s == sym_core)
|
||||
return RLIMIT_CORE;
|
||||
#endif
|
||||
#ifdef RLIMIT_CPU
|
||||
if (s == sym_cpu)
|
||||
return RLIMIT_CPU;
|
||||
#endif
|
||||
#ifdef RLIMIT_DATA
|
||||
if (s == sym_data)
|
||||
return RLIMIT_DATA;
|
||||
#endif
|
||||
#ifdef RLIMIT_FSIZE
|
||||
if (s == sym_fsize)
|
||||
return RLIMIT_FSIZE;
|
||||
#endif
|
||||
#ifdef RLIMIT_MEMLOCK
|
||||
if (s == sym_memlock)
|
||||
return RLIMIT_MEMLOCK;
|
||||
#endif
|
||||
#ifdef RLIMIT_MSGQUEUE
|
||||
if (s == sym_msgqueue)
|
||||
return RLIMIT_MSGQUEUE;
|
||||
#endif
|
||||
#ifdef RLIMIT_NICE
|
||||
if (s == sym_nice)
|
||||
return RLIMIT_NICE;
|
||||
#endif
|
||||
#ifdef RLIMIT_NOFILE
|
||||
if (s == sym_nofile)
|
||||
return RLIMIT_NOFILE;
|
||||
#endif
|
||||
#ifdef RLIMIT_NPROC
|
||||
if (s == sym_nproc)
|
||||
return RLIMIT_NPROC;
|
||||
#endif
|
||||
#ifdef RLIMIT_RSS
|
||||
if (s == sym_rss)
|
||||
return RLIMIT_RSS;
|
||||
#endif
|
||||
#ifdef RLIMIT_RTPRIO
|
||||
if (s == sym_rtprio)
|
||||
return RLIMIT_RTPRIO;
|
||||
#endif
|
||||
#ifdef RLIMIT_RTPRIO
|
||||
if (s == sym_rttime)
|
||||
return RLIMIT_RTPRIO;
|
||||
#endif
|
||||
#ifdef RLIMIT_SIGPENDING
|
||||
if (s == sym_sigpending)
|
||||
return RLIMIT_SIGPENDING;
|
||||
#endif
|
||||
#ifdef RLIMIT_STACK
|
||||
if (s == sym_stack)
|
||||
return RLIMIT_STACK;
|
||||
#endif
|
||||
|
||||
scm_misc_error (func, "invalid rlimit resource ~A", scm_list_1 (s));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SCM_DEFINE (scm_getrlimit, "getrlimit", 1, 0, 0,
|
||||
(SCM resource),
|
||||
"Get a resource limit for this process. @var{resource} identifies the resource,\n"
|
||||
"either as an integer or as a symbol. For example, @code{(getrlimit 'stack)}\n"
|
||||
"gets the limits associated with @code{RLIMIT_STACK}.\n\n"
|
||||
"@code{getrlimit} returns two values, the soft and the hard limit. If no\n"
|
||||
"limit is set for the resource in question, the returned limit will be @code{#f}.")
|
||||
#define FUNC_NAME s_scm_getrlimit
|
||||
{
|
||||
int iresource;
|
||||
struct rlimit lim = { 0, 0 };
|
||||
|
||||
iresource = scm_to_resource (resource, FUNC_NAME, 1);
|
||||
|
||||
if (getrlimit (iresource, &lim) != 0)
|
||||
scm_syserror (FUNC_NAME);
|
||||
|
||||
return scm_values (scm_list_2 ((lim.rlim_cur == RLIM_INFINITY) ? SCM_BOOL_F
|
||||
: scm_from_long (lim.rlim_cur),
|
||||
(lim.rlim_max == RLIM_INFINITY) ? SCM_BOOL_F
|
||||
: scm_from_long (lim.rlim_max)));
|
||||
}
|
||||
#undef FUNC_NAME
|
||||
|
||||
|
||||
#ifdef HAVE_SETRLIMIT
|
||||
SCM_DEFINE (scm_setrlimit, "setrlimit", 3, 0, 0,
|
||||
(SCM resource, SCM soft, SCM hard),
|
||||
"Set a resource limit for this process. @var{resource} identifies the resource,\n"
|
||||
"either as an integer or as a symbol. @var{soft} and @var{hard} should be integers,\n"
|
||||
"or @code{#f} to indicate no limit (i.e., @code{RLIM_INFINITY}).\n\n"
|
||||
"For example, @code{(setrlimit 'stack 150000 300000)} sets the @code{RLIMIT_STACK}\n"
|
||||
"limit to 150 kilobytes, with a hard limit of 300 kB.")
|
||||
#define FUNC_NAME s_scm_setrlimit
|
||||
{
|
||||
int iresource;
|
||||
struct rlimit lim = { 0, 0 };
|
||||
|
||||
iresource = scm_to_resource (resource, FUNC_NAME, 1);
|
||||
|
||||
lim.rlim_cur = (soft == SCM_BOOL_F) ? RLIM_INFINITY : scm_to_long (soft);
|
||||
lim.rlim_max = (hard == SCM_BOOL_F) ? RLIM_INFINITY : scm_to_long (hard);
|
||||
|
||||
if (setrlimit (iresource, &lim) != 0)
|
||||
scm_syserror (FUNC_NAME);
|
||||
|
||||
return SCM_UNSPECIFIED;
|
||||
}
|
||||
#undef FUNC_NAME
|
||||
#endif /* HAVE_SETRLIMIT */
|
||||
#endif /* HAVE_GETRLIMIT */
|
||||
|
||||
|
||||
SCM_DEFINE (scm_kill, "kill", 2, 0, 0,
|
||||
(SCM pid, SCM sig),
|
||||
"Sends a signal to the specified process or group of processes.\n\n"
|
||||
|
|
|
@ -41,6 +41,8 @@ SCM_API SCM scm_getpwuid (SCM user);
|
|||
SCM_API SCM scm_setpwent (SCM arg);
|
||||
SCM_API SCM scm_getgrgid (SCM name);
|
||||
SCM_API SCM scm_setgrent (SCM arg);
|
||||
SCM_API SCM scm_getrlimit (SCM resource);
|
||||
SCM_API SCM scm_setrlimit (SCM resource, SCM soft, SCM hard);
|
||||
SCM_API SCM scm_kill (SCM pid, SCM sig);
|
||||
SCM_API SCM scm_waitpid (SCM pid, SCM options);
|
||||
SCM_API SCM scm_status_exit_val (SCM status);
|
||||
|
|
|
@ -368,6 +368,8 @@ scm_bootstrap_programs (void)
|
|||
scm_smobs[SCM_TC2SMOBNUM (scm_tc16_program)].apply_1 = program_apply_1;
|
||||
scm_smobs[SCM_TC2SMOBNUM (scm_tc16_program)].apply_2 = program_apply_2;
|
||||
scm_set_smob_print (scm_tc16_program, program_print);
|
||||
scm_c_register_extension ("libguile", "scm_init_programs",
|
||||
(scm_t_extension_init_func)scm_init_programs, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -662,6 +662,9 @@ scm_bootstrap_vm (void)
|
|||
sym_vm_error = scm_permanent_object (scm_from_locale_symbol ("vm-error"));
|
||||
sym_debug = scm_permanent_object (scm_from_locale_symbol ("debug"));
|
||||
|
||||
scm_c_register_extension ("libguile", "scm_init_vm",
|
||||
(scm_t_extension_init_func)scm_init_vm, NULL);
|
||||
|
||||
strappage = 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,27 +20,14 @@
|
|||
## to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
||||
## Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
bin_SCRIPTS=guile-config
|
||||
CLEANFILES=guile-config
|
||||
EXTRA_DIST=guile-config.in guile.m4 ChangeLog-2008
|
||||
bin_SCRIPTS=guile-config guile-tools
|
||||
EXTRA_DIST=guile-config.in guile-tools.in guile.m4 ChangeLog-2008 \
|
||||
guile-1.8.pc.in guile-1.8-uninstalled.pc.in
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = guile-1.8.pc
|
||||
|
||||
## FIXME: in the future there will be direct automake support for
|
||||
## doing this. When that happens, switch over.
|
||||
aclocaldir = $(datadir)/aclocal
|
||||
aclocal_DATA = guile.m4
|
||||
|
||||
## We use @-...-@ as the substitution brackets here, instead of the
|
||||
## usual @...@, so autoconf doesn't go and substitute the values
|
||||
## directly into the left-hand sides of the sed substitutions. *sigh*
|
||||
guile-config: guile-config.in ${top_builddir}/libguile/libpath.h
|
||||
rm -f guile-config.tmp
|
||||
sed < ${srcdir}/guile-config.in > guile-config.tmp \
|
||||
-e 's|@-bindir-@|${bindir}|' \
|
||||
-e s:@-GUILE_VERSION-@:${GUILE_VERSION}:
|
||||
chmod +x guile-config.tmp
|
||||
mv guile-config.tmp guile-config
|
||||
|
||||
## Get rid of any copies of the configuration script under the old
|
||||
## name, so people don't end up running ancient copies of it.
|
||||
install-exec-local:
|
||||
rm -f ${bindir}/build-guile
|
|
@ -21,18 +21,18 @@
|
|||
|
||||
# Commentary:
|
||||
|
||||
# Usage: gdb-pre-inst-guile [ARGS]
|
||||
# Usage: gdb-uninstalled-guile [ARGS]
|
||||
#
|
||||
# This script runs Guile from the build tree under GDB. See
|
||||
# ./pre-inst-guile for more information.
|
||||
# ./guile for more information.
|
||||
#
|
||||
# In addition to running ./gdb-pre-inst-guile, sometimes it's useful to
|
||||
# run e.g. ./check-guile -i ./gdb-pre-inst-guile foo.test.
|
||||
# In addition to running ./gdb-uninstalled-guile, sometimes it's useful to
|
||||
# run e.g. ./check-guile -i meta/gdb-uninstalled-guile foo.test.
|
||||
|
||||
# Code:
|
||||
|
||||
set -e
|
||||
# env (set by configure)
|
||||
top_builddir="@top_builddir_absolute@"
|
||||
exec ${top_builddir}/pre-inst-guile-env libtool --mode=execute \
|
||||
exec ${top_builddir}/uninstalled-env libtool --mode=execute \
|
||||
gdb --args ${top_builddir}/libguile/guile "$@"
|
8
meta/guile-1.8-uninstalled.pc.in
Normal file
8
meta/guile-1.8-uninstalled.pc.in
Normal file
|
@ -0,0 +1,8 @@
|
|||
builddir=@abs_top_builddir@
|
||||
srcdir=@abs_top_srcdir@
|
||||
|
||||
Name: GNU Guile (uninstalled)
|
||||
Description: GNU's Ubiquitous Intelligent Language for Extension (uninstalled)
|
||||
Version: @GUILE_VERSION@
|
||||
Libs: -L${builddir}/libguile -lguile @GUILE_LIBS@
|
||||
Cflags: -I${srcdir} -I${builddir} @GUILE_CFLAGS@
|
|
@ -1,5 +1,6 @@
|
|||
#!@-bindir-@/guile \
|
||||
-e main -s
|
||||
#!/bin/sh
|
||||
bindir=`dirname $0`
|
||||
exec $bindir/guile -e main -s $0 "$@"
|
||||
!#
|
||||
;;;; guile-config --- utility for linking programs with Guile
|
||||
;;;; Jim Blandy <jim@red-bean.com> --- September 1997
|
||||
|
@ -47,7 +48,7 @@
|
|||
|
||||
(define program-name #f)
|
||||
(define subcommand-name #f)
|
||||
(define program-version "@-GUILE_VERSION-@")
|
||||
(define program-version "@GUILE_VERSION@")
|
||||
|
||||
;;; Given an executable path PATH, set program-name to something
|
||||
;;; appropriate f or use in error messages (i.e., with leading
|
|
@ -53,7 +53,7 @@ top_builddir="@top_builddir_absolute@"
|
|||
|
||||
# pre-install invocation frob
|
||||
mydir=$(cd $(dirname $0) && pwd)
|
||||
if [ "$mydir" = "$top_builddir" ] ; then
|
||||
if [ "$mydir" = "$top_builddir/meta" ] ; then
|
||||
default_scriptsdir=$top_srcdir/scripts
|
||||
fi
|
||||
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
# Commentary:
|
||||
|
||||
# Usage: pre-inst-guile [ARGS]
|
||||
# Usage: guile [ARGS]
|
||||
#
|
||||
# This script arranges for the environment to support, and eventaully execs,
|
||||
# the uninstalled binary guile executable located somewhere under libguile/,
|
||||
|
@ -43,9 +43,9 @@ GUILE=${top_builddir}/libguile/guile
|
|||
export GUILE
|
||||
|
||||
# do it
|
||||
exec ${top_builddir}/pre-inst-guile-env $GUILE "$@"
|
||||
exec ${top_builddir}/meta/uninstalled-env $GUILE "$@"
|
||||
|
||||
# never reached
|
||||
exit 1
|
||||
|
||||
# pre-inst-guile ends here
|
||||
# guile ends here
|
|
@ -18,17 +18,17 @@
|
|||
# License along with this library; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
# NOTE: If you update this file, please update pre-inst-guile.in as
|
||||
# NOTE: If you update this file, please update uninstalled.in as
|
||||
# well, if appropriate.
|
||||
|
||||
# Usage: pre-inst-guile-env [ARGS]
|
||||
# Usage: uninstalled-env [ARGS]
|
||||
|
||||
# This script arranges for the environment to support running Guile
|
||||
# from the build tree. The following env vars are modified (but not
|
||||
# clobbered): GUILE_LOAD_PATH, LTDL_LIBRARY_PATH, and PATH.
|
||||
|
||||
# Example: pre-inst-guile-env guile -c '(display "hello\n")'
|
||||
# Example: ../../pre-inst-guile-env ./guile-test-foo
|
||||
# Example: uninstalled-env guile -c '(display "hello\n")'
|
||||
# Example: ../../uninstalled-env ./guile-test-foo
|
||||
|
||||
# config
|
||||
subdirs_with_ltlibs="srfi guile-readline libguile" # maintain me
|
||||
|
@ -83,9 +83,18 @@ export LTDL_LIBRARY_PATH
|
|||
DYLD_LIBRARY_PATH="${dyld_prefix}${top_builddir}/libguile/.libs:$DYLD_LIBRARY_PATH"
|
||||
export DYLD_LIBRARY_PATH
|
||||
|
||||
if [ x"$PKG_CONFIG_PATH" = x ]
|
||||
then
|
||||
PKG_CONFIG_PATH="${top_builddir}"
|
||||
else
|
||||
PKG_CONFIG_PATH="${top_builddir}:$PKG_CONFIG_PATH"
|
||||
fi
|
||||
export PKG_CONFIG_PATH
|
||||
|
||||
# handle PATH (no clobber)
|
||||
PATH="${top_builddir}/guile-config:${PATH}"
|
||||
PATH="${top_builddir}/libguile:${PATH}"
|
||||
PATH="${top_builddir}/meta:${PATH}"
|
||||
export PATH
|
||||
|
||||
exec "$@"
|
|
@ -42,8 +42,7 @@
|
|||
frame-return-address frame-program
|
||||
frame-dynamic-link heap-frame?))
|
||||
|
||||
;; fixme: avoid the dynamic-call?
|
||||
(dynamic-call "scm_init_frames" (dynamic-link "libguile"))
|
||||
(load-extension "libguile" "scm_init_frames")
|
||||
|
||||
;;;
|
||||
;;; Frame chain
|
||||
|
|
|
@ -25,4 +25,4 @@
|
|||
instruction-pops instruction-pushes
|
||||
instruction->opcode opcode->instruction))
|
||||
|
||||
(dynamic-call "scm_init_instructions" (dynamic-link "libguile"))
|
||||
(load-extension "libguile" "scm_init_instructions")
|
||||
|
|
|
@ -25,4 +25,4 @@
|
|||
load-objcode write-objcode
|
||||
word-size byte-order))
|
||||
|
||||
(dynamic-call "scm_init_objcodes" (dynamic-link "libguile"))
|
||||
(load-extension "libguile" "scm_init_objcodes")
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
program-objcode program? program-objects
|
||||
program-module program-base program-external))
|
||||
|
||||
(dynamic-call "scm_init_programs" (dynamic-link "libguile"))
|
||||
(load-extension "libguile" "scm_init_programs")
|
||||
|
||||
(define arity:nargs car)
|
||||
(define arity:nrest cadr)
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
vm-next-hook vm-apply-hook vm-boot-hook vm-return-hook
|
||||
vm-break-hook vm-exit-hook vm-halt-hook vm-enter-hook))
|
||||
|
||||
(dynamic-call "scm_init_vm" (dynamic-link "libguile"))
|
||||
(load-extension "libguile" "scm_init_vm")
|
||||
|
||||
(define (vms:time stat) (vector-ref stat 0))
|
||||
(define (vms:clock stat) (vector-ref stat 1))
|
||||
|
|
|
@ -28,7 +28,7 @@ check_SCRIPTS =
|
|||
BUILT_SOURCES =
|
||||
EXTRA_DIST =
|
||||
|
||||
TESTS_ENVIRONMENT = "${top_builddir}/pre-inst-guile-env"
|
||||
TESTS_ENVIRONMENT = "${top_builddir}/meta/uninstalled-env"
|
||||
|
||||
test_cflags = \
|
||||
-I$(top_srcdir)/test-suite/standalone \
|
||||
|
|
|
@ -12,7 +12,7 @@ If you want to use a scheme script, prefix it as follows:
|
|||
!#
|
||||
|
||||
Makefile.am will arrange for all tests (scripts or executables) to be
|
||||
run under pre-inst-guile-env so that the PATH, LD_LIBRARY_PATH, and
|
||||
run under uninstalled-env so that the PATH, LD_LIBRARY_PATH, and
|
||||
GUILE_LOAD_PATH will be augmented appropriately.
|
||||
|
||||
The Makefile.am has an example of creating a shared library to be used
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
# executing the (%fast-slot-ref i 3) line. For reasons as yet
|
||||
# unknown, it does not cause a segmentation fault if the same code is
|
||||
# loaded as a script; that is why we run it here using "guile -q <<EOF".
|
||||
exec guile -q -l @top_builddir_absolute@/libguile/stack-limit-calibration.scm >/dev/null 2>&1 <<EOF
|
||||
exec guile -q >/dev/null 2>&1 <<EOF
|
||||
(use-modules (oop goops))
|
||||
(define-module (oop goops))
|
||||
(define-class <c> () (a #:init-value 1) (b #:init-value 2) (c #:init-value 3))
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
# Test that two srfi numbers on the command line work.
|
||||
#
|
||||
guile -q -l @top_builddir_absolute@/libguile/stack-limit-calibration.scm --use-srfi=1,10 >/dev/null <<EOF
|
||||
guile -q --use-srfi=1,10 >/dev/null <<EOF
|
||||
(if (and (defined? 'partition)
|
||||
(defined? 'define-reader-ctor))
|
||||
(exit 0) ;; good
|
||||
|
@ -38,7 +38,7 @@ fi
|
|||
# `top-repl' the core bindings got ahead of anything --use-srfi gave.
|
||||
#
|
||||
|
||||
guile -q -l @top_builddir_absolute@/libguile/stack-limit-calibration.scm --use-srfi=1 >/dev/null <<EOF
|
||||
guile -q --use-srfi=1 >/dev/null <<EOF
|
||||
(catch #t
|
||||
(lambda ()
|
||||
(iota 2 3 4))
|
||||
|
@ -56,7 +56,7 @@ fi
|
|||
# exercises duplicates handling in `top-repl' versus `use-srfis' (in
|
||||
# boot-9.scm).
|
||||
#
|
||||
guile -q -l @top_builddir_absolute@/libguile/stack-limit-calibration.scm --use-srfi=17 >/dev/null <<EOF
|
||||
guile -q --use-srfi=17 >/dev/null <<EOF
|
||||
(if (procedure-with-setter? car)
|
||||
(exit 0) ;; good
|
||||
(exit 1)) ;; bad
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
TESTS_ENVIRONMENT = \
|
||||
$(top_builddir)/pre-inst-guile \
|
||||
$(top_builddir)/meta/guile \
|
||||
-l $(srcdir)/run-vm-tests.scm -e run-vm-tests
|
||||
|
||||
TESTS = \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue